# # Testing functionality (meeting format requirements, etc.) of cloud/dust fields # data. # # General test setup: Read a set of corresponding single scattering and particle # number density data, regrid to defined cloudbox, perform cloud-related # checks with cloudbox_checkedCalc, and apply cloud data in a (FOS, particle # absorption only) RT calculation. # # # This case is for Mars and specifically tests # # (CASES 1-72) # - 72 Mars scenarions: 4seasons x 2daytimes x 3dustloads x 3solaractivities # - per scenario use each single scattering data file (ssd) and particle number # density (pnd) field at least once (results in 32 combinations in total). # Various ssd can belong to one pnd field due to varied refractive index # assumptions. Various pnd fields can go with one ssd file due to varied # altitude distribution. # - regridding pnd fields to the computational grid within cloudbox # - perform cloud related internal check # - perfrom an RT calculation using FOS scattering method in zero-th scattering # order (particle absorption only) mode # # Jana Mendrok 2013-10-06 Arts2 { INCLUDE "general/general.arts" INCLUDE "general/continua.arts" INCLUDE "general/agendas.arts" INCLUDE "general/planet_mars.arts" NumericCreate( pmin ) NumericCreate( pmax ) #VectorCreate( ally ) #VectorSet( ally, [] ) #WriteXML( in=ally ) # some basic RT settings ##### AtmosphereSet1D IndexSet( stokes_dim, 1 ) VectorSet( f_grid, [220.8e9] ) NumericSet( pmin, 1e-5 ) NumericSet( pmax, 1e99 ) # and some further settings in order to be able to do an RT calc ##### jacobianOff sensorOff # and agenda settings needed for RT calc ##### Copy( iy_main_agenda, iy_main_agenda__Emission ) Copy( ppath_agenda, ppath_agenda__FollowSensorLosPath ) Copy( blackbody_radiation_agenda, blackbody_radiation_agenda__Planck ) Copy( propmat_clearsky_agenda, propmat_clearsky_agenda__LookUpTable ) Copy( abs_xsec_agenda, abs_xsec_agenda__noCIA ) Copy( iy_space_agenda, iy_space_agenda__CosmicBackground ) Copy( iy_surface_agenda, iy_surface_agenda__UseSurfaceRtprop ) Copy( ppath_step_agenda, ppath_step_agenda__GeometricPath ) Copy( surface_rtprop_agenda, surface_rtprop_agenda__Specular_NoPol_ReflFix_SurfTFromt_field ) GriddedField3Create( gf3tmp ) StringCreate( caseext ) StringCreate( casefull ) StringCreate( atmcase ) StringCreate( casename ) IndexCreate( ncases ) IndexCreate( itmp ) # set basic case folder StringCreate( basename ) StringSet( basename, "planets/Mars/MPS/" ) # Arrays with (sub)case names ArrayOfStringCreate( seasoncasearray ) ArrayOfStringSet( seasoncasearray, ["Mars.Ls0", "Mars.Ls90", "Mars.Ls180", "Mars.Ls270"] ) ArrayOfStringCreate( timecasearray ) ArrayOfStringSet( timecasearray, [".day", ".night"] ) ArrayOfStringCreate( dustcasearray ) ArrayOfStringSet( dustcasearray, [".dust-high", ".dust-low", ".dust-medium"] ) ArrayOfStringCreate( solarcasearray ) #regarding cloud data, all solar cases are identical. hence, we testprocess only one of them. ArrayOfStringSet( solarcasearray, [".sol-avg"] ) # case unspecific cloud specification (the pndfields are specific. however, we # need them for ParticleTypeAddAll. so we use a dummy version, which we will # overwrite later on. StringCreate( cloudpath ) StringCreate( ssdname ) StringCreate( pndname ) StringCreate( psdname ) StringCreate( psdprofname ) ArrayOfStringCreate( pndcasearray ) ArrayOfStringCreate( ssdcasearray ) StringSet( cloudpath, "planets/Mars/SAT/" ) ArrayOfStringSet( pndcasearray, [ "pnd_field__Dust__small-size-bulk__verywell-mixed__tau1075cm-1_1e-01.xml", "pnd_field__Dust__small-size-bulk__verywell-mixed__tau1075cm-1_1e-01.xml", "pnd_field__Dust__small-size-bulk__verywell-mixed__tau1075cm-1_1e-01.xml", "pnd_field__Dust__medium-size-bulk__verywell-mixed__tau1075cm-1_1e-01.xml", "pnd_field__Dust__medium-size-bulk__verywell-mixed__tau1075cm-1_1e-01.xml", "pnd_field__Dust__medium-size-bulk__verywell-mixed__tau1075cm-1_1e-01.xml", "pnd_field__Dust__large-size-bulk__verywell-mixed__tau1075cm-1_1e-01.xml", "pnd_field__Dust__large-size-bulk__verywell-mixed__tau1075cm-1_1e-01.xml", "pnd_field__Dust__large-size-bulk__verywell-mixed__tau1075cm-1_1e-01.xml", "pnd_field__Dust__verylarge-size-bulk__verywell-mixed__tau1075cm-1_1e-01.xml", "pnd_field__Dust__verylarge-size-bulk__verywell-mixed__tau1075cm-1_1e-01.xml", "pnd_field__Dust__verylarge-size-bulk__verywell-mixed__tau1075cm-1_1e-01.xml", "pnd_field__Dust__medium-size-bulk__well-mixed__tau1075cm-1_1e-01.xml", "pnd_field__Dust__medium-size-bulk__mixed__tau1075cm-1_1e-01.xml", "pnd_field__Dust__medium-size-bulk__confined__tau1075cm-1_1e-01.xml", "pnd_field__Dust__medium-size-bulk__very-confined__tau1075cm-1_1e-01.xml", "pnd_field__Dust__medium-size-bulk__highly-confined__tau1075cm-1_1e-01.xml", "pnd_field__CO2ice__mesospheric-day-bulk__meso-gauss-profile__tau1024nm_2e-01.xml", "pnd_field__CO2ice__mesospheric-day-bulk__meso-gauss-profile__tau1024nm_2e-01.xml", "pnd_field__CO2ice__mesospheric-day-bulk__meso-gauss-profile__tau1024nm_2e-01.xml", "pnd_field__CO2ice__polarnight-chan1-bulk__20km-narrow-box-profile__ext1024nm_3e-01.xml", "pnd_field__CO2ice__polarnight-chan1-bulk__20km-narrow-box-profile__ext1024nm_3e-01.xml", "pnd_field__CO2ice__polarnight-chan1-bulk__20km-narrow-box-profile__ext1024nm_3e-01.xml", "pnd_field__CO2ice__polarnight-chan1-bulk__8km-narrow-box__ext1024nm_3e-01.xml", "pnd_field__CO2ice__polarnight-chan1-bulk__8km-tower-box-profile__ext1024nm_3e-01.xml", "pnd_field__CO2ice__polarnight-chan4-bulk__10km-narrow-box-profile__tau1024nm_1e+00.xml", "pnd_field__CO2ice__polarnight-chan4-bulk__10km-narrow-box-profile__tau1024nm_1e+00.xml", "pnd_field__CO2ice__polarnight-chan4-bulk__10km-narrow-box-profile__tau1024nm_1e+00.xml", "pnd_field__CO2ice__polarnight-chan4-bulk__4km-narrow-box__tau1024nm_1e+00.xml", "pnd_field__H2Oice__Type1-bulk__high-wide-profile__tau825cm-1_5e-02.xml", "pnd_field__H2Oice__Type1-bulk__low-narrow-profile__tau825cm-1_5e-02.xml", "pnd_field__H2Oice__Type2-bulk__high-wide-profile__tau825cm-1_2e-01.xml" ] ) ArrayOfStringSet( ssdcasearray, [ "Mars.scat_data__Dust__small-size-bulk__RI-minabs.xml", "Mars.scat_data__Dust__small-size-bulk__RI-std.xml", "Mars.scat_data__Dust__small-size-bulk__RI-maxabs.xml", "Mars.scat_data__Dust__medium-size-bulk__RI-minabs.xml", "Mars.scat_data__Dust__medium-size-bulk__RI-std.xml", "Mars.scat_data__Dust__medium-size-bulk__RI-maxabs.xml", "Mars.scat_data__Dust__large-size-bulk__RI-minabs.xml", "Mars.scat_data__Dust__large-size-bulk__RI-std.xml", "Mars.scat_data__Dust__large-size-bulk__RI-maxabs.xml", "Mars.scat_data__Dust__verylarge-size-bulk__RI-minabs.xml", "Mars.scat_data__Dust__verylarge-size-bulk__RI-std.xml", "Mars.scat_data__Dust__verylarge-size-bulk__RI-maxabs.xml", "Mars.scat_data__Dust__medium-size-bulk__RI-std.xml", "Mars.scat_data__Dust__medium-size-bulk__RI-std.xml", "Mars.scat_data__Dust__medium-size-bulk__RI-std.xml", "Mars.scat_data__Dust__medium-size-bulk__RI-std.xml", "Mars.scat_data__Dust__medium-size-bulk__RI-std.xml", "Mars.scat_data__CO2ice__mesospheric-day-bulk__RI-maxabs.xml", "Mars.scat_data__CO2ice__mesospheric-day-bulk__RI-minabs.xml", "Mars.scat_data__CO2ice__mesospheric-day-bulk__RI-std.xml", "Mars.scat_data__CO2ice__polarnight-chan1-bulk__RI-maxabs.xml", "Mars.scat_data__CO2ice__polarnight-chan1-bulk__RI-minabs.xml", "Mars.scat_data__CO2ice__polarnight-chan1-bulk__RI-std.xml", "Mars.scat_data__CO2ice__polarnight-chan1-bulk__RI-std.xml", "Mars.scat_data__CO2ice__polarnight-chan1-bulk__RI-std.xml", "Mars.scat_data__CO2ice__polarnight-chan4-bulk__RI-maxabs.xml", "Mars.scat_data__CO2ice__polarnight-chan4-bulk__RI-minabs.xml", "Mars.scat_data__CO2ice__polarnight-chan4-bulk__RI-std.xml", "Mars.scat_data__CO2ice__polarnight-chan4-bulk__RI-std.xml", "Mars.scat_data__H2Oice__Type1-bulk__RI-maetzler06.xml", "Mars.scat_data__H2Oice__Type1-bulk__RI-maetzler06.xml", "Mars.scat_data__H2Oice__Type2-bulk__RI-maetzler06.xml" ] ) abs_speciesSet( species=["CO2", "H2O", "CO"] ) abs_linesReadFromSplitArtscat(abs_lines, abs_species, "spectroscopy/Perrin/", 0, 1e12) abs_lines_per_speciesCreateFromLines # create LUT valid for all cases abs_lookupSetupWide( p_min=pmin, p_max=1e3, t_min=105., t_max=405., h2o_min=0.0, h2o_max=4e-4 ) abs_xsec_agenda_checkedCalc abs_lookupCalc abs_lookupAdapt # sensor specification (that's case independent...): LOS zenith angle and altitude MatrixSet( sensor_los, [121.8] ) #tanh~1km nrowsGet( itmp, sensor_los ) MatrixSetConstant( sensor_pos, itmp, 1, 600e3 ) # case unspecific surface settings VectorSet( surface_scalar_reflectivity, [0.4] ) # scattering solver required settings ReadXML(fos_scatint_angles, "scattering/fosangles_360.xml") VectorSet(fos_iyin_za_angles,[0,30,50,80,90,91,92,93,95,105,110,130,150,180]) # now we go with several nested foorloop through the different cases. AgendaCreate( forloop_agenda_particles ) AgendaSet( forloop_agenda_particles ){ # cloud specification # we set a the cloudbox over the whole atmosphere. as we might include # mesospheric clouds. cloudboxSetManually( p1=pmax, p2=pmin, lat1=0, lat2=0, lon1=0, lon2=0 ) Extract( psdprofname, pndcasearray, forloop_index ) Append( pndname, psdprofname ) #Print( pndname, 0 ) Extract( psdname, ssdcasearray, forloop_index ) Append( ssdname, psdname ) #Print( ssdname, 0 ) ParticleTypeInit ParticleTypeAdd( filename_scat_data=ssdname, filename_pnd_field="" ) ReadXML( pnd_field_raw, pndname ) #scat_data_rawCheck pnd_fieldCalc( zeropadding=1 ) atmfields_checkedCalc atmgeom_checkedCalc cloudbox_checkedCalc sensor_checkedCalc propmat_clearsky_agenda_checkedCalc yCalc #Print( y, 0 ) #ReadXML( out=ally ) #Append( ally, y ) #WriteXML( in=ally ) } AgendaCreate( forloop_agenda_dust ) AgendaSet( forloop_agenda_dust ){ # construct atmcase name III (Mars.LsXX.YY.dust-ZZ) Extract( casefull, dustcasearray, forloop_index ) Append( atmcase, casefull ) # construct pnd location name (same Mars.LsXX.YY.dust-ZZ as clear-sky atmo) Append( pndname, atmcase ) StringSet( caseext, "/" ) Append( pndname, caseext ) Append( pndname, atmcase ) StringSet( caseext, "." ) Append( pndname, caseext ) #Print( pndname, 0 ) # keep the casestring till dust and make upper-level folder name Append( basename, atmcase ) StringSet( caseext, "/" ) Append( basename, caseext ) # construct atmcase name IV (Mars.LsXX.YY.dust-ZZ.sol-WW) Extract( casefull, solarcasearray, 0 ) Append( atmcase, casefull ) Append( basename, atmcase ) StringSet( caseext, "/" ) Append( basename, caseext ) Append( basename, atmcase ) #Print( basename, 0 ) AtmRawRead( t_field_raw, z_field_raw, vmr_field_raw, abs_species, basename ) # now derive common p_grid and regrid atm fields to this p_gridFromZRaw( p_grid, z_field_raw, 0 ) VectorCrop( p_grid, p_grid, pmin, pmax ) AtmFieldsCalc # surface also needed for basics_checkedCalc Extract( z_surface, z_field, 0 ) # and now the dusty calcs AgendaSet(iy_main_agenda){ iyFOS(fos_n=0) } Copy( forloop_agenda, forloop_agenda_particles ) nelemGet( ncases, pndcasearray ) IndexStepDown( ncases, ncases ) ForLoop( forloop_agenda, 0, ncases, 1 ) } AgendaCreate( forloop_agenda_time ) AgendaSet( forloop_agenda_time ){ # construct atmcase name II (Mars.LsXX.d/n) Extract( casefull, timecasearray, forloop_index ) Append( atmcase, casefull ) Copy( forloop_agenda, forloop_agenda_dust ) nelemGet( ncases, dustcasearray ) IndexStepDown( ncases, ncases ) ForLoop( forloop_agenda, 0, ncases, 1 ) } AgendaCreate( forloop_agenda_season ) AgendaSet( forloop_agenda_season ){ # construct atmcase name I (Mars.LsXX) Extract( casefull, seasoncasearray, forloop_index ) Copy( atmcase, casefull ) Copy( forloop_agenda, forloop_agenda_time ) nelemGet( ncases, timecasearray ) IndexStepDown( ncases, ncases ) ForLoop( forloop_agenda, 0, ncases, 1 ) } StringSet( iy_unit, "PlanckBT" ) Copy( pndname, cloudpath ) Copy( ssdname, cloudpath ) nelemGet( ncases, seasoncasearray ) IndexStepDown( ncases, ncases ) Copy( forloop_agenda, forloop_agenda_season ) ForLoop( forloop_agenda, 0, ncases, 1 ) }