# # 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 Venus and specifically tests # # (CASES A-E) # - the five Venus scenarions: Venus.spicav.night, Venus.spicav.night_cold, # Venus.vira.night, Venus.vira.day, Venus.vira.day_highlat # - 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_venus.arts" NumericCreate( pmin ) NumericCreate( pmax ) StringCreate( dummyfile ) StringSet( dummyfile, "dummy.tmp" ) ArrayOfGriddedField3Create( addvmr ) Touch( addvmr ) WriteXML( in=addvmr, filename=dummyfile ) #VectorCreate( ally ) #VectorSet( ally, [] ) #WriteXML( in=ally ) # some basic RT settings ##### AtmosphereSet1D IndexSet( stokes_dim, 1 ) VectorSet( f_grid, [220.8e9] ) NumericSet( pmin, 1e-1 ) 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( 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/Venus/MPS/" ) # Array with case names ArrayOfStringCreate( atmcasearray ) ArrayOfStringSet( atmcasearray, ["Venus.spicav.night", "Venus.spicav.night_cold", "Venus.vira.night", "Venus.vira.day", "Venus.vira.day_highlat"] ) # case unspecific cloud specification (the pndfields are specific. however, we # need them for ScatElementsPndAndScatAdd. 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 ) ArrayOfStringCreate( assd ) StringSet( cloudpath, "planets/Venus/SAT/" ) ArrayOfStringSet( pndcasearray, [ "pnd_field__H2SO4__LowerCloud-Mode1-bulk__KH80-Nalt-box-profile.xml", "pnd_field__H2SO4__LowerCloud-Mode1-bulk__KH80-Nstd-box-profile.xml", "pnd_field__H2SO4__LowerCloud-Mode2-bulk__KH80-Nalt-box-profile.xml", "pnd_field__H2SO4__LowerCloud-Mode2-bulk__KH80-Nstd-box-profile.xml", "pnd_field__H2SO4__LowerCloud-Mode3-bulk__KH80-Nalt-box-profile.xml", "pnd_field__H2SO4__LowerCloud-Mode3-bulk__KH80-Nstd-box-profile.xml", "pnd_field__H2SO4__LowerHaze-Mode1-bulk__KH80-Nalt-box-profile.xml", "pnd_field__H2SO4__LowerHaze-Mode1-bulk__KH80-Nstd-box-profile.xml", "pnd_field__H2SO4__MiddleCloud-Mode1-bulk__KH80-Nalt-box-profile.xml", "pnd_field__H2SO4__MiddleCloud-Mode1-bulk__KH80-Nstd-box-profile.xml", "pnd_field__H2SO4__MiddleCloud-Mode2-bulk__KH80-Nalt-box-profile.xml", "pnd_field__H2SO4__MiddleCloud-Mode2-bulk__KH80-Nstd-box-profile.xml", "pnd_field__H2SO4__MiddleCloud-Mode3-bulk__KH80-Nalt-box-profile.xml", "pnd_field__H2SO4__MiddleCloud-Mode3-bulk__KH80-Nstd-box-profile.xml", "pnd_field__H2SO4__UpperCloud-Mode1-bulk__KH80-Nalt-box-profile.xml", "pnd_field__H2SO4__UpperCloud-Mode1-bulk__KH80-Nstd-box-profile.xml", "pnd_field__H2SO4__UpperCloud-Mode2-bulk__KH80-Nalt-box-profile.xml", "pnd_field__H2SO4__UpperCloud-Mode2-bulk__KH80-Nstd-box-profile.xml", "pnd_field__H2SO4__UpperHaze-Mode1-bulk__KH80-Nalt-box-profile.xml", "pnd_field__H2SO4__UpperHaze-Mode1-bulk__KH80-Nstd-box-profile.xml" ] ) ArrayOfStringSet( ssdcasearray, [ "Venus.scat_data__H2SO4__LowerCloud-Mode1-bulk__RI-std.xml", "Venus.scat_data__H2SO4__LowerCloud-Mode1-bulk__RI-std.xml", "Venus.scat_data__H2SO4__LowerCloud-Mode2-bulk__RI-std.xml", "Venus.scat_data__H2SO4__LowerCloud-Mode2-bulk__RI-std.xml", "Venus.scat_data__H2SO4__LowerCloud-Mode3-bulk__RI-std.xml", "Venus.scat_data__H2SO4__LowerCloud-Mode3-bulk__RI-std.xml", "Venus.scat_data__H2SO4__LowerHaze-Mode1-bulk__RI-std.xml", "Venus.scat_data__H2SO4__LowerHaze-Mode1-bulk__RI-std.xml", "Venus.scat_data__H2SO4__MiddleCloud-Mode1-bulk__RI-std.xml", "Venus.scat_data__H2SO4__MiddleCloud-Mode1-bulk__RI-std.xml", "Venus.scat_data__H2SO4__MiddleCloud-Mode2-bulk__RI-std.xml", "Venus.scat_data__H2SO4__MiddleCloud-Mode2-bulk__RI-std.xml", "Venus.scat_data__H2SO4__MiddleCloud-Mode3-bulk__RI-std.xml", "Venus.scat_data__H2SO4__MiddleCloud-Mode3-bulk__RI-std.xml", "Venus.scat_data__H2SO4__UpperCloud-Mode1-bulk__RI-std.xml", "Venus.scat_data__H2SO4__UpperCloud-Mode1-bulk__RI-std.xml", "Venus.scat_data__H2SO4__UpperCloud-Mode2-bulk__RI-std.xml", "Venus.scat_data__H2SO4__UpperCloud-Mode2-bulk__RI-std.xml", "Venus.scat_data__H2SO4__UpperHaze-Mode1-bulk__RI-std.xml", "Venus.scat_data__H2SO4__UpperHaze-Mode1-bulk__RI-std.xml" ] ) ArrayOfStringCreate( allspecies ) ArrayOfStringCreate( basespecies ) ArrayOfStringCreate( addspecies ) ArrayOfStringCreate( addspeciesnames ) ArrayOfStringSet( basespecies, ["CO2", "CO"] ) ArrayOfStringSet( addspecies, ["H2O"] ) ArrayOfStringSet( addspeciesnames, [".H2O_mid"] ) Append( allspecies, basespecies ) Append( allspecies, addspecies ) abs_speciesSet( species=allspecies ) 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=1e7, t_min=140., t_max=740., h2o_min=0.0, h2o_max=4e-5 ) abs_xsec_agenda_checkedCalc abs_lookupCalc abs_lookupAdapt # sensor specification (that's case independent...): LOS zenith angle and altitude #VectorCreate( ztan ) #VectorSet( ztan, [30e3] ) #nelemGet( itmp, ztan ) #MatrixSetConstant( sensor_pos, itmp, 1, 600e3 ) #VectorZtanToZa1D( ztan, sensor_pos, refellipsoid, atmosphere_dim, ztan ) #Print( ztan ) #Matrix1ColFromVector( sensor_los, ztan ) MatrixSet( sensor_los, [113.9] ) #tanh~30km 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]) ##### # CASES A-C (night) and D-E (day) ##### # we go with a 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 ) Append( assd, ssdname ) #Print( assd, 0 ) ScatSpeciesInit ScatElementsPndAndScatAdd( scat_data_files=assd, pnd_field_files=[""] ) scat_dataCalc #scat_dataCheck ReadXML( pnd_field_raw, pndname ) pnd_fieldCalcFrompnd_field_raw( zeropadding=1 ) atmfields_checkedCalc( bad_partition_functions_ok = 1 ) atmgeom_checkedCalc cloudbox_checkedCalc scat_data_checkedCalc sensor_checkedCalc propmat_clearsky_agenda_checkedCalc yCalc #Print( y, 0 ) #ReadXML( out=ally ) #Append( ally, y ) #WriteXML( in=ally ) } AgendaCreate( forloop_agenda_addspecies ) AgendaSet( forloop_agenda_addspecies ){ Extract( caseext, addspeciesnames, forloop_index ) Append( basename, caseext ) ReadXML( gf3tmp, basename ) Append( vmr_field_raw, gf3tmp ) ReadXML( out=addvmr, filename=dummyfile ) Append( addvmr, gf3tmp ) WriteXML( in=addvmr, filename=dummyfile ) } AgendaCreate( forloop_agenda_atmcase ) AgendaSet( forloop_agenda_atmcase ){ # construct atmcase name (Venus.CaseName) Extract( casefull, atmcasearray, forloop_index ) Append( atmcase, casefull ) # construct pnd location name (same Venus.CaseName 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 atmcasestring and make upper-level folder name Append( basename, atmcase ) StringSet( caseext, "/" ) Append( basename, caseext ) Append( basename, atmcase ) abs_speciesSet( species=basespecies ) AtmRawRead( basename = basename ) abs_speciesAdd( species=addspecies ) Delete( addvmr ) Touch( addvmr ) WriteXML( in=addvmr, filename=dummyfile ) Copy( forloop_agenda, forloop_agenda_addspecies ) nelemGet( ncases, addspecies ) IndexStepDown( ncases, ncases ) ForLoop( forloop_agenda, 0, ncases, 1 ) ReadXML( out=addvmr, filename=dummyfile ) Append( vmr_field_raw, addvmr ) # 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 Copy( iy_main_agenda, iy_main_agenda__FOSN0 ) Copy( forloop_agenda, forloop_agenda_particles ) nelemGet( ncases, pndcasearray ) IndexStepDown( ncases, ncases ) ForLoop( forloop_agenda, 0, ncases, 1 ) } StringSet( iy_unit, "PlanckBT" ) Copy( pndname, cloudpath ) Copy( ssdname, cloudpath ) nelemGet( ncases, atmcasearray ) IndexStepDown( ncases, ncases ) Copy( forloop_agenda, forloop_agenda_atmcase ) ForLoop( forloop_agenda, 0, ncases, 1 ) }