LCOV - code coverage report
Current view: top level - atmosphere/ATM/test - AtmBasicTest.cc (source / functions) Hit Total Coverage
Test: casacpp_coverage.info Lines: 74 74 100.0 %
Date: 2024-11-06 17:42:47 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /*******************************************************************************
       2             :  * ALMA - Atacama Large Millimeter Array
       3             :  * (c) Instituto de Estructura de la Materia, 2011
       4             :  * (in the framework of the ALMA collaboration).
       5             :  * All rights reserved.
       6             :  * 
       7             :  * This library is free software; you can redistribute it and/or
       8             :  * modify it under the terms of the GNU Lesser General Public
       9             :  * License as published by the Free Software Foundation; either
      10             :  * version 2.1 of the License, or (at your option) any later version.
      11             :  * 
      12             :  * This library is distributed in the hope that it will be useful,
      13             :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      14             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
      15             :  * Lesser General Public License for more details.
      16             :  * 
      17             :  * You should have received a copy of the GNU Lesser General Public
      18             :  * License along with this library; if not, write to the Free Software
      19             :  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
      20             :  *******************************************************************************/
      21             : 
      22             : #include <string>
      23             : #include <vector>
      24             : #include <iostream>
      25             : #include <fstream>
      26             : #include <sstream>
      27             : #include <math.h>
      28             : 
      29             : using namespace std;
      30             : 
      31             : #include <atmosphere/ATM/ATMPercent.h>
      32             : #include <atmosphere/ATM/ATMPressure.h>
      33             : #include <atmosphere/ATM/ATMNumberDensity.h>
      34             : #include <atmosphere/ATM/ATMMassDensity.h>
      35             : #include <atmosphere/ATM/ATMTemperature.h>
      36             : #include <atmosphere/ATM/ATMLength.h>
      37             : #include <atmosphere/ATM/ATMInverseLength.h>
      38             : #include <atmosphere/ATM/ATMOpacity.h>
      39             : #include <atmosphere/ATM/ATMAngle.h>
      40             : #include <atmosphere/ATM/ATMHumidity.h>
      41             : #include <atmosphere/ATM/ATMFrequency.h>
      42             : #include <atmosphere/ATM/ATMWaterVaporRadiometer.h>
      43             : #include <atmosphere/ATM/ATMWVRMeasurement.h>
      44             : #include <atmosphere/ATM/ATMProfile.h>
      45             : #include <atmosphere/ATM/ATMSpectralGrid.h>
      46             : #include <atmosphere/ATM/ATMRefractiveIndex.h>
      47             : #include <atmosphere/ATM/ATMRefractiveIndexProfile.h>
      48             : #include <atmosphere/ATM/ATMSkyStatus.h>
      49             : 
      50           1 : int main()
      51             : {  
      52             :   // Initialize the Atmospheric model
      53             : 
      54           1 :   unsigned int      atmType = 1;       // 1=tropical (ALMA site), 2=midlatSummer, 3=midlatWinter 
      55           2 :   atm::Temperature  T(273. ,"K" );     // Ground temperature
      56           2 :   atm::Pressure     P(55000. ,"Pa");   // Ground Pressure
      57           2 :   atm::Humidity     H(8.,"%" );       // Ground Relative Humidity (indication)
      58           2 :   atm::Length       Alt(5000,"m" );    // Altitude of the site
      59           2 :   atm::Length       WVL(   3.0,"km");  // Water vapor scale height
      60           1 :   double            TLR=  -6.5      ;  // Tropospheric lapse rate (must be in K/km)
      61           2 :   atm::Length       topAtm(  48.0,"km");  // Upper atm. boundary for calculations
      62           2 :   atm::Pressure     Pstep(  10.0,"mb"); // Primary pressure step (10.0 mb)
      63           1 :   double   PstepFact=         1.2;     // Pressure step ratio between two consecutive layers
      64             : 
      65           1 :   atm::AtmProfile myProfile( Alt, P, T, TLR, H, WVL, Pstep, PstepFact,  topAtm, atmType );
      66             : 
      67           1 :   cout<<"BASIC ATMOSPHERIC PARAMETERS TO GENERATE REFERENCE ATMOSPHERIC PROFILE"<<endl;
      68           1 :   printf("Ground temperature T:          %.1f K \n",T.get());
      69           1 :   printf("Ground pressure P:             %.0f Pa \n",P.get("Pa")); 
      70           1 :   printf("Relative humidity rh:          %.0f percent \n",H.get("%")); 
      71           1 :   printf("Scale height h0:               %.0f m \n",WVL.get("m")); 
      72           1 :   printf("Pressure step dp:              %.0f Pa \n",Pstep.get("Pa")); 
      73           1 :   printf("Altitude alti:                 %.0f m \n",Alt.get()); 
      74           1 :   printf("Altitude top atm profile atmh: %.0f m \n",topAtm.get("m"));
      75           1 :   printf("Pressure step factordp1:       %.2f \n",PstepFact);
      76           1 :   printf("Tropospherique lapse rate:     %.1f K/km \n" , TLR);
      77             : 
      78           1 :   cout<<"Number of layers :"<<myProfile.getNumLayer()<<endl;
      79           1 :   cout<<"First guess precipitable water vapor content: " << myProfile.getGroundWH2O().get("mm") << " mm" << endl;
      80             : 
      81             :   // -------------------------------------------------------------------
      82             :   // Create a spectralGrid containing 1 astronomical band
      83             :   // This SpectralGrid is a member of a RefrativeIndexProfile object
      84             :   // -------------------------------------------------------------------
      85             : 
      86             :   // Astronomical  spectral window
      87             :   //
      88           1 :   double refFreqAstro   = 86.3*1.e9;
      89           1 :   double bandWidthAstro = 2.*1.e9; 
      90           1 :   double chanWidthAstro = 0.1*1e9; // 100Mhz
      91             :   
      92           1 :   unsigned int numChanAstro=int(bandWidthAstro/chanWidthAstro); 
      93           1 :   unsigned int refChanAstro=numChanAstro/2+1;
      94             : 
      95             :     
      96             :   atm::SpectralGrid * spGrid_p = new atm::SpectralGrid(numChanAstro,   // unsigned int numChan
      97             :                                                        refChanAstro,   // unsigned int refChan
      98           1 :                                                        atm::Frequency(refFreqAstro), // Frequency refFreq
      99           1 :                                                        atm::Frequency(chanWidthAstro));
     100             : 
     101             : 
     102             :   
     103             :     // Print description of spectral windows
     104             :     //
     105           1 :   cout<<"-----------------------------------------------"<<endl;
     106           2 :   for(unsigned int j=0; j<spGrid_p->getNumSpectralWindow(); j++){
     107           1 :     cout << "Spectral Window " << j 
     108             :       // << " Central Frequency: " <<  spGrid_p->getRefFreq(j).get("GHz") << " GHz, "
     109           2 :          << " Central Frequency: " <<  spGrid_p->getChanFreq(j,(spGrid_p->getNumChan(j)/2)).get("GHz") << " GHz, "
     110           2 :          << " Freq. Resolution: " <<  spGrid_p->getChanSep(j).get("MHz") << " MHz, "
     111           1 :          << " LO frequency: " <<  spGrid_p->getLoFrequency(j)/1.e9 << " GHz, "
     112           1 :          << " Num. of channels: " << spGrid_p->getNumChan(j)<<endl;
     113             : 
     114             :     //         for (unsigned int i=0;i<spGrid_p->getNumChan(j);i++)
     115             :     //           cout<<spGrid_p->getChanFreq(j,i).get("GHz")<<" ";
     116             :     //         cout<<endl;
     117             :   }
     118           1 :   cout<<"-----------------------------------------------"<<endl;
     119             : 
     120             : 
     121             : 
     122           1 :   cout << "Create SkyStatus object"<<endl; // and associates a WaterVaporRadiometer to it " << endl; 
     123             :         
     124             :   // Define absorption profile with SpectralGridand Profile
     125           1 :   atm::RefractiveIndexProfile absProfile(*spGrid_p, myProfile);
     126             : 
     127             :   // -------------------------------------------------------------------
     128             :   // - Create a SkyStatus object 
     129             :   // -------------------------------------------------------------------
     130             : 
     131             :   // Define skystatus instance
     132           1 :   atm::SkyStatus skyStatus(absProfile);
     133           1 :   skyStatus.setAirMass(1.);
     134           1 :   skyStatus.setUserWH2O(myProfile.getGroundWH2O());
     135             : 
     136           1 :   cout<<"end"<<endl;
     137             : 
     138             :   // -------------------------------------------------------------------
     139             :   // - Retrieve path length
     140             :   // -------------------------------------------------------------------
     141             : 
     142           1 :   double deltaPressure = 100.;
     143             :   
     144           1 :   double startPressure = 49000.;
     145           1 :   double endPressure   = 61000.;
     146           1 :   int numPressure = int((endPressure-startPressure)/deltaPressure);
     147             : 
     148           1 :   int spwid = spGrid_p->getNumSpectralWindow()-1; // last spw = astronomical band
     149             :  
     150           1 :   string filename="path.dat";
     151           1 :   ofstream resultFile(filename.c_str());
     152           1 :   resultFile <<"! Pressure TotalPath H2OPathLength DispersiveDryPathLength NonDispersiveDryPathLength"<<endl;
     153         121 :   for (unsigned int i=0; i<numPressure; i++) {
     154         120 :     skyStatus.setBasicAtmosphericParameters(atm::Pressure(startPressure+i*deltaPressure,"Pa"));
     155             :     
     156         120 :     cout<<"Number of layers :"<<skyStatus.getNumLayer()<<endl;
     157         120 :     cout<<"First guess precipitable water vapor content: " << skyStatus.getGroundWH2O().get("mm") << " mm" << endl;
     158         120 :     cout<<"Ground Pressure: " << skyStatus.getGroundPressure().get("Pa") << " Pa" << endl;
     159         120 :     cout<<"Ground Temperature: " << skyStatus.getGroundTemperature().get("K") << " K" << endl;
     160        2510 :     for (unsigned int ii=0; ii<skyStatus.getNumLayer(); ii++) {
     161        4780 :       cout << "Pressure in Layer " << ii << " = " <<  skyStatus.getLayerPressure(ii).get("Pa") << " Pa " << 
     162        2390 :         "Temperature: " <<  skyStatus.getLayerTemperature(ii).get("K") << " K " << endl;
     163             :     } 
     164             : 
     165             : 
     166         240 :     atm::Length path = skyStatus.getAverageH2OPathLength(spwid)
     167         480 :       + skyStatus.getAverageDispersiveDryPathLength(spwid)
     168         240 :       + skyStatus.getAverageNonDispersiveDryPathLength(spwid);
     169             : 
     170         120 :     resultFile<<startPressure+i*deltaPressure<<" "
     171         120 :               <<path.get()<<" "
     172         120 :               <<skyStatus.getAverageH2OPathLength(spwid).get()<<" "
     173         240 :               <<skyStatus.getAverageDispersiveDryPathLength(spwid).get()<<" "
     174         120 :               <<skyStatus.getAverageNonDispersiveDryPathLength(spwid).get()<<endl;
     175         120 :   }
     176           1 :   resultFile.close();
     177             : 
     178           1 :   return 0;
     179             : 
     180           1 : }

Generated by: LCOV version 1.16