From cda27636c200c6d8ad1d75e3e036a40ccdae8691 Mon Sep 17 00:00:00 2001 From: yuhi-n Date: Thu, 12 Mar 2026 09:02:47 +0900 Subject: [PATCH 1/3] update DPLRW, conflicts resolved rm cached Update README.md --- .gitignore | 5 - README.md | 16 + build/Makefile | 4 +- build/Makefile.conf | 6 +- dplrw_src/cosp.F90 | 4882 +++++++++++++++++ dplrw_src/cosp2_io.f90 | 3109 +++++++++++ dplrw_src/cosp2_test.F90 | 2231 ++++++++ dplrw_src/cosp_cloudsat_interface.F90 | 234 + dplrw_src/cosp_config.F90 | 529 ++ dplrw_src/cosp_stats.F90 | 793 +++ dplrw_src/cosp_utils.F90 | 190 + dplrw_src/quickbeam.F90 | 971 ++++ dplrw_src/quickbeam_optics.F90 | 1577 ++++++ .../COSP2_global-map-checkpoint.ipynb | 260 + .../COSP2_zonal-mean-checkpoint.ipynb | 208 + .../EC_check-checkpoint.ipynb | 582 ++ .../MIROC_check-checkpoint.ipynb | 260 + .../dplrw_results-checkpoint.ipynb | 663 +++ .../input_check-checkpoint.ipynb | 402 ++ driver/check/COSP2_global-map.ipynb | 260 + driver/check/COSP2_zonal-mean.ipynb | 208 + driver/check/EC_check.ipynb | 582 ++ driver/check/MIROC_check.ipynb | 262 + driver/check/dplrw_results.ipynb | 663 +++ driver/check/input_check.ipynb | 402 ++ driver/data/.gitignore | 1 + driver/run/cosp2_MIROCtest.txt | 109 + driver/run/cosp2_input_nl.txt | 2 +- driver/run/cosp2_output_nl.txt | 2 + driver/run/cosp2_test | Bin 0 -> 28621064 bytes driver/src/cosp2_io.f90 | 383 +- driver/src/cosp2_io.f90.bak | 2762 ++++++++++ driver/src/cosp2_test.F90 | 279 +- driver/src/cosp2_test.f90.bak | 2076 +++++++ src/cosp.F90 | 50 +- src/cosp.F90.bak | 4840 ++++++++++++++++ src/cosp_config.F90 | 29 + src/cosp_config.F90.bak | 500 ++ src/cosp_stats.F90 | 12 + src/cosp_stats.F90.bak | 781 +++ src/simulator/cosp_cloudsat_interface.F90 | 4 +- src/simulator/cosp_cloudsat_interface.F90.bak | 234 + src/simulator/quickbeam/quickbeam.F90 | 366 ++ src/simulator/quickbeam/quickbeam.F90.bak | 605 ++ .../optics/cosp_utils.F90 | 167 +- .../optics/cosp_utils.F90.bak | 89 + .../quickbeam_optics/quickbeam_optics.F90 | 226 +- .../quickbeam_optics/quickbeam_optics.F90.bak | 1381 +++++ 48 files changed, 34053 insertions(+), 144 deletions(-) create mode 100755 dplrw_src/cosp.F90 create mode 100644 dplrw_src/cosp2_io.f90 create mode 100755 dplrw_src/cosp2_test.F90 create mode 100644 dplrw_src/cosp_cloudsat_interface.F90 create mode 100755 dplrw_src/cosp_config.F90 create mode 100755 dplrw_src/cosp_stats.F90 create mode 100755 dplrw_src/cosp_utils.F90 create mode 100644 dplrw_src/quickbeam.F90 create mode 100644 dplrw_src/quickbeam_optics.F90 create mode 100644 driver/check/.ipynb_checkpoints/COSP2_global-map-checkpoint.ipynb create mode 100644 driver/check/.ipynb_checkpoints/COSP2_zonal-mean-checkpoint.ipynb create mode 100644 driver/check/.ipynb_checkpoints/EC_check-checkpoint.ipynb create mode 100644 driver/check/.ipynb_checkpoints/MIROC_check-checkpoint.ipynb create mode 100644 driver/check/.ipynb_checkpoints/dplrw_results-checkpoint.ipynb create mode 100644 driver/check/.ipynb_checkpoints/input_check-checkpoint.ipynb create mode 100644 driver/check/COSP2_global-map.ipynb create mode 100644 driver/check/COSP2_zonal-mean.ipynb create mode 100644 driver/check/EC_check.ipynb create mode 100644 driver/check/MIROC_check.ipynb create mode 100644 driver/check/dplrw_results.ipynb create mode 100644 driver/check/input_check.ipynb create mode 100644 driver/data/.gitignore create mode 100644 driver/run/cosp2_MIROCtest.txt create mode 100755 driver/run/cosp2_test create mode 100644 driver/src/cosp2_io.f90.bak create mode 100644 driver/src/cosp2_test.f90.bak create mode 100755 src/cosp.F90.bak create mode 100755 src/cosp_config.F90.bak create mode 100755 src/cosp_stats.F90.bak create mode 100644 src/simulator/cosp_cloudsat_interface.F90.bak create mode 100644 src/simulator/quickbeam/quickbeam.F90.bak mode change 100644 => 100755 subsample_and_optics_example/optics/cosp_utils.F90 create mode 100644 subsample_and_optics_example/optics/cosp_utils.F90.bak create mode 100644 subsample_and_optics_example/optics/quickbeam_optics/quickbeam_optics.F90.bak diff --git a/.gitignore b/.gitignore index 51e4b5ac01..26f4903009 100644 --- a/.gitignore +++ b/.gitignore @@ -2,9 +2,4 @@ **.a **.mod driver/run/cosp2_test -driver/data/inputs/UKMO/*_global.nc -driver/data/outputs/UKMO/*kgo.v*.nc driver/data/outputs/UKMO/*.nc -driver/data/outputs/UKMO/*.png -!driver/data/outputs/cosp2_output_um.gfortran.kgo.nc -!driver/data/outputs/UKMO/*.out diff --git a/README.md b/README.md index 8817f2de5f..7d01962677 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,19 @@ +# About this fork + +This is development code for Doppler velocity simulator, accomodating to EarthCARE's CPR. Therefore, the codes are subject to change. This is being prepared for merging into COSP2. + +The developing codes are stored in `dplrw_src`, and links are provided so that each can be referenced from its original directory. + +The description paper with example results are published as [Nakamuta et al. 2026, JAMES](https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2025MS004958). + +## How to use this fork + +1. To make input dataset in NetCDF format, execute `exe.gt2input.out` in `driver/data/work`. This procedure is needed because vertical air motion and cumulus mass flux is required as additional input variables from the parent model. The inpud dataset is made by MIROC6. +2. Run `make driver`. +3. Get input data made by MIROC6 from [here](https://github.com/yuhi-n/ECdemo-data). Put `demo.tar.xz` in `driver/data` and unzip it `tar Jxvf demo.tar.xz`. (This also contains example output data.) +4. Run `./cosp2_test cosp2_MIROCtest.txt`, and a result file is generated in `driver/data/MIROC_outputs/ctrl_MIROC-COSP2.nc`. +5. Python notebooks for visualization are stored in `driver/check`. + # About COSP The CFMIP Observation Simulator Package (COSP) takes the models representation of the diff --git a/build/Makefile b/build/Makefile index 0f1a7898c9..0580dbfff6 100644 --- a/build/Makefile +++ b/build/Makefile @@ -138,7 +138,7 @@ cosp_rttov_utilSTUB.o : cosp_kinds.o # Example subcolumn generaton and mapping to optical properties, following COSP 1.4 -SUBCOL_OBJS = mo_rng.o scops.o prec_scops.o cosp_utils.o cosp_optics.o quickbeam_optics.o array_lib.o math_lib.o mrgrnk.o optics_lib.o cosp_errorHandling.o +SUBCOL_OBJS = mo_rng.o scops.o prec_scops.o cosp_optics.o quickbeam_optics.o cosp_utils.o array_lib.o math_lib.o mrgrnk.o optics_lib.o cosp_errorHandling.o libsubcol.a: $(SUBCOL_OBJS) libcosp.a ar -rvs libsubcol.a $(SUBCOL_OBJS) @@ -150,7 +150,7 @@ optics_lib.o : cosp_kinds.o cosp_errorHandling.o quickbeam_optics.o: cosp_kinds.o cosp_errorHandling.o cosp_constants.o cosp_config.o mrgrnk.o array_lib.o optics_lib.o math_lib.o quickbeam.o cosp_stats.o scops.o : cosp_kinds.o cosp_errorHandling.o mo_rng.o prec_scops.o : cosp_kinds.o cosp_config.o -cosp_utils.o : cosp_kinds.o cosp_config.o +cosp_utils.o : cosp_kinds.o cosp_config.o quickbeam_optics.o cosp_optics.o: cosp_kinds.o cosp_config.o cosp_constants.o modis_simulator.o mo_rng.o : cosp_kinds.o diff --git a/build/Makefile.conf b/build/Makefile.conf index 508f04a27a..f13de720be 100644 --- a/build/Makefile.conf +++ b/build/Makefile.conf @@ -1,5 +1,7 @@ -#F90 = gfortran -#F90FLAGS = -O3 -ffree-line-length-none -fcheck=bounds -finit-real=nan +F90 = gfortran +F90FLAGS = -O3 -ffree-line-length-none -fcheck=bounds -finit-real=nan -fbounds-check + +NFHOME = /opt/homebrew F90_LIB = ${NFHOME} NC_INC = -I$(NFHOME)/include diff --git a/dplrw_src/cosp.F90 b/dplrw_src/cosp.F90 new file mode 100755 index 0000000000..c36cb6b15e --- /dev/null +++ b/dplrw_src/cosp.F90 @@ -0,0 +1,4882 @@ +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +! Copyright (c) 2015, Regents of the University of Colorado +! All rights reserved. +! +! Redistribution and use in source and binary forms, with or without modification, are +! permitted provided that the following conditions are met: +! +! 1. Redistributions of source code must retain the above copyright notice, this list of +! conditions and the following disclaimer. +! +! 2. Redistributions in binary form must reproduce the above copyright notice, this list +! of conditions and the following disclaimer in the documentation and/or other +! materials provided with the distribution. +! +! 3. Neither the name of the copyright holder nor the names of its contributors may be +! used to endorse or promote products derived from this software without specific prior +! written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +! +! History: +! May 2015- D. Swales - Original version +! Mar 2018- R. Guzman - Added OPAQ diagnostics and GLID simulator +! Apr 2018- R. Guzman - Added ATLID simulator +! Nov 2018- T. Michibata - Added CloudSat+MODIS Warmrain Diagnostics +! Mar 2024- C. Wall - Added MODIS joint-histogram diagnostics +! +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +MODULE MOD_COSP + USE COSP_KINDS, ONLY: wp + USE MOD_COSP_CONFIG, ONLY: R_UNDEF,PARASOL_NREFL,LIDAR_NCAT,LIDAR_NTYPE, SR_BINS,& + N_HYDRO,numMISRHgtBins, & + cloudsat_DBZE_BINS,LIDAR_NTEMP,calipso_histBsct,& + use_vgrid,Nlvgrid,vgrid_zu,vgrid_zl,vgrid_z,dz, & + WR_NREGIME, CFODD_NCLASS, & + CFODD_NDBZE, CFODD_NICOD, & + numMODISTauBins,numMODISPresBins, & + numMODISReffIceBins,numMODISReffLiqBins, & + numMODISLWPBins,numMODISIWPBins, & + numISCCPTauBins,numISCCPPresBins,numMISRTauBins,& + ntau,modis_histTau,tau_binBounds, & + modis_histTauEdges,tau_binEdges,nCloudsatPrecipClass,& + modis_histTauCenters,tau_binCenters, & + cloudsat_preclvl,grLidar532_histBsct,atlid_histBsct + USE MOD_COSP_MODIS_INTERFACE, ONLY: cosp_modis_init, modis_IN, & + COSP_ASSIGN_modisIN + USE MOD_COSP_RTTOV_INTERFACE, ONLY: cosp_rttov_init, cosp_rttov_simulate + USE MOD_COSP_RTTOV_UTIL, ONLY: rttov_cfg, rttov_output + USE MOD_COSP_MISR_INTERFACE, ONLY: cosp_misr_init, misr_IN, & + COSP_ASSIGN_misrIN, COSP_ASSIGN_misrIN_clean + USE MOD_COSP_ISCCP_INTERFACE, ONLY: cosp_isccp_init, isccp_IN, & + COSP_ASSIGN_isccpIN, COSP_ASSIGN_isccpIN_clean + USE MOD_COSP_CALIPSO_INTERFACE, ONLY: cosp_calipso_init, calipso_IN, & + COSP_ASSIGN_calipsoIN, COSP_ASSIGN_calipsoIN_clean + USE MOD_COSP_ATLID_INTERFACE, ONLY: cosp_atlid_init, atlid_IN, & + COSP_ASSIGN_atlidIN, COSP_ASSIGN_atlidIN_clean + USE MOD_COSP_GRLIDAR532_INTERFACE, ONLY: cosp_grLidar532_init, grLidar532_IN + USE MOD_COSP_PARASOL_INTERFACE, ONLY: cosp_parasol_init, parasol_in, & + COSP_ASSIGN_parasolIN, COSP_ASSIGN_parasolIN_clean + USE MOD_COSP_CLOUDSAT_INTERFACE, ONLY: cosp_cloudsat_init, cloudsat_IN, & + COSP_ASSIGN_cloudsatIN,COSP_ASSIGN_cloudsatIN_clean + USE quickbeam, ONLY: quickbeam_subcolumn, quickbeam_column + USE quickbeam, ONLY: quickbeam_dplrw ! for DPLRW + USE MOD_ICARUS, ONLY: icarus_subcolumn, icarus_column + USE MOD_MISR_SIMULATOR, ONLY: misr_subcolumn, misr_column + USE MOD_LIDAR_SIMULATOR, ONLY: lidar_subcolumn, lidar_column + USE MOD_MODIS_SIM, ONLY: modis_subcolumn, modis_column + USE MOD_PARASOL, ONLY: parasol_subcolumn, parasol_column + USE MOD_COSP_RTTOV, ONLY: rttov_IN + USE MOD_COSP_STATS, ONLY: COSP_LIDAR_ONLY_CLOUD,COSP_CHANGE_VERTICAL_GRID, & + COSP_DIAG_WARMRAIN, COMPUTE_ORBITMASKS, & + cosp_optical_inputs, cosp_column_inputs, & + swath_inputs, radar_cfg + USE COSP_PHYS_CONSTANTS, ONLY: radius_earth + USE COSP_MATH_CONSTANTS, ONLY: pi + + IMPLICIT NONE + + logical :: linitialization ! Initialization flag + + + ! ###################################################################################### + ! TYPE cosp_outputs + ! ###################################################################################### + type cosp_outputs + + ! CALIPSO outputs + real(wp),dimension(:,:,:),pointer :: & + calipso_betaperp_tot => null(), & ! Total backscattered signal + calipso_beta_tot => null(), & ! Total backscattered signal + calipso_lidarcldphase => null(), & ! 3D "lidar" phase cloud fraction + calipso_lidarcldtype => null(), & ! 3D "lidar" OPAQ type fraction + calipso_cldlayerphase => null(), & ! low, mid, high-level lidar phase cloud cover + calipso_lidarcldtmp => null(), & ! 3D "lidar" phase cloud temperature + calipso_cfad_sr => null() ! CFAD of scattering ratio + real(wp), dimension(:,:),pointer :: & + calipso_lidarcld => null(), & ! 3D "lidar" cloud fraction + calipso_cldlayer => null(), & ! low, mid, high-level, total lidar cloud cover + calipso_cldtype => null(), & ! opaque and thin lidar cloud cover + z_opaque altitude + calipso_cldtypetemp => null(), & ! opaque and thin cloud temperature + calipso_cldtypemeanz => null(), & ! opaque and thin cloud altitude + calipso_cldtypemeanzse => null(),& ! same as just above with respect to SE + calipso_beta_mol => null() ! Molecular backscatter + real(wp), dimension(:),pointer :: & + calipso_cldthinemis => null(), & ! thin cloud emissivity + calipso_srbval => null() ! SR bins in cfad_sr + + ! GROUND LIDAR outputs + real(wp),dimension(:,:,:),pointer :: & + grLidar532_beta_tot => null(), & ! Total GROUND LIDAR backscattered signal + grLidar532_cfad_sr => null() ! CFAD of GROUND LIDAR scattering ratio + real(wp), dimension(:,:),pointer :: & + grLidar532_lidarcld => null(), & ! 3D GROUND "lidar" cloud fraction + grLidar532_cldlayer => null(), & ! low, mid, high-level, total GROUND lidar cloud cover + grLidar532_beta_mol => null() ! GROUND LIDAR Molecular backscatter + real(wp), dimension(:),pointer :: & + grLidar532_srbval => null() ! SR bins in cfad_sr + + ! ATLID outputs + real(wp),dimension(:,:,:),pointer :: & + atlid_beta_tot => null(), & ! Total ATLID backscattered signal + atlid_cfad_sr => null() ! CFAD of ATLID scattering ratio + real(wp), dimension(:,:),pointer :: & + atlid_lidarcld => null(), & ! 3D ATLID cloud fraction + atlid_cldlayer => null(), & ! low, mid, high-level, total ATLID cloud cover + atlid_beta_mol => null() ! ATLID Molecular backscatter + real(wp), dimension(:),pointer :: & + atlid_srbval => null() ! SR bins in cfad_sr + + ! PARASOL outputs + real(wp),dimension(:,:,:),pointer :: & + parasolPix_refl => null() ! PARASOL reflectances (subcolumn) + real(wp),dimension(:,:),pointer :: & + parasolGrid_refl => null() ! PARASOOL reflectances (column) + + ! CLOUDSAT outputs + real(wp),dimension(:,:,:),pointer :: & + cloudsat_Ze_tot => null(), & ! Effective reflectivity factor (Npoints,Ncolumns,Nlevels) + cloudsat_cfad_ze => null() ! Ze CFAD(Npoints,dBZe_bins,Nlevels) + real(wp), dimension(:,:),pointer :: & + lidar_only_freq_cloud => null(), & ! (Npoints,Nlevels) + cloudsat_precip_cover => null() ! Radar total cloud amount by CloudSat precip flag (Npoints,dBZe_bins) + real(wp),dimension(:),pointer :: & + cloudsat_tcc => null(), & + cloudsat_tcc2 => null(), & + radar_lidar_tcc => null(), & ! Radar&lidar total cloud amount, grid-box scale (Npoints) + cloudsat_pia => null() ! Radar path integrated attenuation (Npoints) + + ! ISCCP outputs + real(wp),dimension(:),pointer :: & + isccp_totalcldarea => null(), & ! The fraction of model grid box columns with cloud + ! somewhere in them. (%) + isccp_meantb => null(), & ! Mean all-sky 10.5 micron brightness temperature. (K) + isccp_meantbclr => null(), & ! Mean clear-sky 10.5 micron brightness temperature. (K) + isccp_meanptop => null(), & ! Mean cloud top pressure (mb). + isccp_meantaucld => null(), & ! Mean optical thickness. (1) + isccp_meanalbedocld => null() ! Mean cloud albedo. (1) + real(wp),dimension(:,:),pointer ::& + isccp_boxtau => null(), & ! Optical thickness in each column. (1) + isccp_boxptop => null() ! Cloud top pressure in each column. (mb) + real(wp),dimension(:,:,:),pointer :: & + isccp_fq => null() ! The fraction of the model grid box covered by each of + ! the 49 ISCCP D level cloud types. (%) + + ! MISR outputs + real(wp),dimension(:,:,:),pointer :: & ! + misr_fq => null() ! Fraction of the model grid box covered by each of the MISR + ! cloud types + real(wp),dimension(:,:),pointer :: & ! + misr_dist_model_layertops => null() ! + real(wp),dimension(:),pointer :: & ! + misr_meanztop => null(), & ! Mean MISR cloud top height + misr_cldarea => null() ! Mean MISR cloud cover area + + ! MODIS outputs + real(wp),pointer,dimension(:) :: & ! + modis_Cloud_Fraction_Total_Mean => null(), & ! L3 MODIS retrieved cloud fraction (total) + modis_Cloud_Fraction_Water_Mean => null(), & ! L3 MODIS retrieved cloud fraction (liq) + modis_Cloud_Fraction_Ice_Mean => null(), & ! L3 MODIS retrieved cloud fraction (ice) + modis_Cloud_Fraction_High_Mean => null(), & ! L3 MODIS retrieved cloud fraction (high) + modis_Cloud_Fraction_Mid_Mean => null(), & ! L3 MODIS retrieved cloud fraction (middle) + modis_Cloud_Fraction_Low_Mean => null(), & ! L3 MODIS retrieved cloud fraction (low ) + modis_Optical_Thickness_Total_Mean => null(), & ! L3 MODIS retrieved optical thickness (tot) + modis_Optical_Thickness_Water_Mean => null(), & ! L3 MODIS retrieved optical thickness (liq) + modis_Optical_Thickness_Ice_Mean => null(), & ! L3 MODIS retrieved optical thickness (ice) + modis_Optical_Thickness_Total_LogMean => null(), & ! L3 MODIS retrieved log10 optical thickness + modis_Optical_Thickness_Water_LogMean => null(), & ! L3 MODIS retrieved log10 optical thickness + modis_Optical_Thickness_Ice_LogMean => null(), & ! L3 MODIS retrieved log10 optical thickness + modis_Cloud_Particle_Size_Water_Mean => null(), & ! L3 MODIS retrieved particle size (liquid) + modis_Cloud_Particle_Size_Ice_Mean => null(), & ! L3 MODIS retrieved particle size (ice) + modis_Cloud_Top_Pressure_Total_Mean => null(), & ! L3 MODIS retrieved cloud top pressure + modis_Liquid_Water_Path_Mean => null(), & ! L3 MODIS retrieved liquid water path + modis_Ice_Water_Path_Mean => null() ! L3 MODIS retrieved ice water path + real(wp),pointer,dimension(:,:,:) :: & + modis_Optical_Thickness_vs_Cloud_Top_Pressure => null(), & ! Tau/Pressure joint histogram + modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq => null(), & ! Tau/Pressure Liq joint histogram + modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice => null(), & ! Tau/Pressure Ice joint histogram + modis_Optical_Thickness_vs_ReffICE => null(), & ! Tau/ReffICE joint histogram + modis_Optical_Thickness_vs_ReffLIQ => null(), & ! Tau/ReffLIQ joint histogram + modis_LWP_vs_ReffLIQ => null(), & ! LWP/ReffLIQ joint histogram + modis_IWP_vs_ReffICE => null() ! IWP/ReffICE joint histogram + + ! Joint CloudSat+MODIS simulators outputs + real(wp),dimension(:,:,:,:),pointer :: & + cfodd_ntotal => null() ! # of CFODD (Npoints,CFODD_NDBZE,CFODD_NICOD,CFODD_NCLASS) + real(wp),dimension(:,:), pointer :: & + wr_occfreq_ntotal => null() ! # of nonprecip/drizzle/precip (Npoints,WR_NREGIME) + + ! RTTOV outputs + integer :: & + Ninst_rttov + type(rttov_output),dimension(:),allocatable :: & + rttov_outputs + + ! Doppler capability of radar (CloudSat/QuickBeam) + real(wp),dimension(:,:,:,:),pointer :: & + dplrw_Z => null(), spwid_Z => null(), Zef94_Z => null(), & + dplrw_T => null(), spwid_T => null(), Zef94_T => null(), & + ZefVd_2 => null(), & + gridw_Z => null(), gridw_T => null() + real(wp),dimension(:,:,:,:,:),pointer :: & + vfall_Z => null(), vfall_T => null(), ZefVf_2 => null() + real(wp),dimension(:,:),pointer :: & + gcumw => null() + + end type cosp_outputs + +CONTAINS + ! ###################################################################################### + ! FUNCTION cosp_simulator + ! ###################################################################################### + function COSP_SIMULATOR(cospIN,cospgridIN,cospOUT,start_idx,stop_idx,debug) + type(cosp_optical_inputs),intent(in),target :: cospIN ! Optical inputs to COSP simulator + type(cosp_column_inputs), intent(in),target :: cospgridIN ! Host model inputs to COSP + + ! Inputs into the simulators + type(isccp_IN) :: isccpIN ! Input to the ISCCP simulator + type(misr_IN) :: misrIN ! Input to the LIDAR simulator + type(calipso_IN) :: calipsoIN ! Input to the LIDAR simulator + type(grLidar532_IN) :: grLidar532IN ! Input to the GROUND LIDAR simulator + type(atlid_IN) :: atlidIN ! Input to the ATLID simulator + type(parasol_IN) :: parasolIN ! Input to the PARASOL simulator + type(cloudsat_IN) :: cloudsatIN ! Input to the CLOUDSAT radar simulator + type(modis_IN) :: modisIN ! Input to the MODIS simulator + type(rttov_IN) :: rttovIN ! Input to the RTTOV simulator + + ! Outputs from the simulators (nested simulator output structure) + type(cosp_outputs), intent(inout) :: cospOUT + + integer,optional :: start_idx,stop_idx + logical,optional :: debug + + character(len=256),dimension(100) :: cosp_simulator + + ! Local variables + integer :: & + i,icol,ij,ik,nError + integer :: k + integer,target :: & + Npoints + logical :: & + Lisccp_subcolumn, & ! On/Off switch for subcolumn ISCCP simulator + Lmisr_subcolumn, & ! On/Off switch for subcolumn MISR simulator + Lcalipso_subcolumn, & ! On/Off switch for subcolumn CALIPSO simulator + LgrLidar532_subcolumn,& ! On/Off switch for subcolumn GROUND LIDAR simulator + Latlid_subcolumn, & ! On/Off switch for subcolumn ATLID simulator + Lparasol_subcolumn, & ! On/Off switch for subcolumn PARASOL simulator + Lcloudsat_subcolumn, & ! On/Off switch for subcolumn CLOUDSAT simulator + Lmodis_subcolumn, & ! On/Off switch for subcolumn MODIS simulator + Lisccp_column, & ! On/Off switch for column ISCCP simulator + Lmisr_column, & ! On/Off switch for column MISR simulator + Lcalipso_column, & ! On/Off switch for column CALIPSO simulator + LgrLidar532_column, & ! On/Off switch for column GROUND LIDAR simulator + Latlid_column, & ! On/Off switch for column ATLID simulator + Lparasol_column, & ! On/Off switch for column PARASOL simulator + Lcloudsat_column, & ! On/Off switch for column CLOUDSAT simulator + Lmodis_column, & ! On/Off switch for column MODIS simulator + Lrttov_column, & ! On/Off switch for column RTTOV simulator + Lradar_lidar_tcc, & ! On/Off switch from joint Calipso/Cloudsat product + Lcloudsat_tcc, & ! + Lcloudsat_tcc2, & ! + Llidar_only_freq_cloud, & ! On/Off switch from joint Calipso/Cloudsat product + Lcloudsat_modis_wr, & ! On/Off switch from joint CloudSat/MODIS warm rain product + Ldplrw ! On/Off switch from Doppler capability of CLOUDSAT simulator + logical :: & + ok_lidar_cfad = .false., & + ok_lidar_cfad_grLidar532 = .false., & + ok_lidar_cfad_atlid = .false., & + verbose = .false. + integer, dimension(:,:),allocatable :: & + modisRetrievedPhase,isccpLEVMATCH + real(wp), dimension(:), allocatable :: & + modisCfTotal,modisCfLiquid,modisMeanIceWaterPath, isccp_meantbclr, & + modisCfIce, modisCfHigh, modisCfMid, modisCfLow,modisMeanTauTotal, & + modisMeanTauLiquid, modisMeanTauIce, modisMeanLogTauTotal, & + modisMeanLogTauLiquid, modisMeanLogTauIce, modisMeanSizeLiquid, & + modisMeanSizeIce, modisMeanCloudTopPressure, modisMeanLiquidWaterPath, & + radar_lidar_tcc, cloudsat_tcc, cloudsat_tcc2 + REAL(WP), dimension(:,:),allocatable :: & + modisRetrievedCloudTopPressure,modisRetrievedTau,modisRetrievedSize, & + misr_boxtau,misr_boxztop,misr_dist_model_layertops,isccp_boxtau, & + isccp_boxttop,isccp_boxptop,calipso_beta_mol,lidar_only_freq_cloud, & + grLidar532_beta_mol,atlid_beta_mol, & + rttov_bt_total,rttov_bt_clear, & ! RTTOV brightness temps + rttov_rad_total,rttov_rad_clear,rttov_rad_cloudy, & ! RTTOV radiances + rttov_refl_total,rttov_refl_clear ! RTTOV reflectances + REAL(WP), dimension(:,:,:),allocatable :: & + modisJointHistogram,modisJointHistogramIce,modisJointHistogramLiq, & + modisJointHistogram_CtpCodLiq,modisJointHistogram_CtpCodIce, & + modisJointHistogram_LwpRefLiq,modisJointHistogram_IwpRefIce, & + calipso_beta_tot,calipso_betaperp_tot, cloudsatDBZe,parasolPix_refl, & + grLidar532_beta_tot,atlid_beta_tot,cloudsatZe_non + real(wp),dimension(:),allocatable,target :: & + out1D_1,out1D_2,out1D_3,out1D_4,out1D_5,out1D_6,out1D_7,out1D_8, & + out1D_9,out1D_10,out1D_11,out1D_12 + real(wp),dimension(:,:,:),allocatable :: & + betamol_in,betamoli,pnormi,ze_toti + real(wp),dimension(:,:,:),allocatable :: & + t_in,tempI,frac_outI ! subscript "I": vertical interpolation (use_vgrid=.true.) + real(wp), allocatable :: & + zlev (:,:), & ! altitude (used only when use_vgrid=.true.) + cfodd_ntotal (:,:,:,:), & ! # of total samples for CFODD (Npoints,CFODD_NDBZE,CFODD_NICOD,CFODD_NCLASS) + wr_occfreq_ntotal(:,:) ! # of warm-rain (nonprecip/drizzle/precip) (Npoints,WR_NREGIME) + + ! Fields used in orbit swathing of gridcells. + logical,dimension(:),allocatable :: & ! Mask of reals over all local times + CSCAL_SWATH_MASK, & ! Needed for MODIS CSCAL + MODIS_SWATH_MASK ! Needed for MODIS CSCAL + normal MODIS + integer,dimension(:),allocatable :: & ! Arrays containing the indices of the swath masks + ISCCP_MASK_INDICES, & + MISR_MASK_INDICES, & + CSCAL_MASK_INDICES, & + PARASOL_MASK_INDICES, & + ATLID_MASK_INDICES, & + MODIS_CSCAL_MASK_INDICES + integer :: j + ! ISCCP swathing variables + real(wp),dimension(:),target,allocatable :: & + temp_isccp_meanalbedocld, & + temp_isccp_meanptop, & + temp_isccp_meantaucld, & + temp_isccp_totalcldarea, & + temp_isccp_meantb + real(wp),dimension(:,:,:),target,allocatable :: & + temp_isccp_fq + ! MISR swathing variables + real(wp),dimension(:),target,allocatable :: & + temp_misr_cldarea, & + temp_misr_meanztop + real(wp),dimension(:,:,:),target,allocatable :: & + temp_misr_fq + ! CALIPSO swathing variables + real(wp),dimension(:),target,allocatable :: & + temp_calipso_cldthinemis + real(wp),dimension(:,:),target,allocatable :: & + temp_calipso_lidarcld, & + temp_calipso_cldlayer, & + temp_calipso_cldtype, & + temp_calipso_cldtypetemp, & + temp_calipso_cldtypemeanz,& + temp_calipso_cldtypemeanzse + real(wp),dimension(:,:,:),target,allocatable :: & + temp_calipso_cfad_sr, & + temp_calipso_lidarcldphase, & + temp_calipso_lidarcldtype, & + temp_calipso_cldlayerphase, & + temp_calipso_lidarcldtmp + ! ATLID swathing variables + real(wp),dimension(:,:),target,allocatable :: & + temp_atlid_lidarcld, & + temp_atlid_cldlayer + real(wp),dimension(:,:,:),target,allocatable :: & + temp_atlid_cfad_sr + ! PARASOL swathing variables + real(wp),dimension(:,:),target,allocatable :: & + temp_parasolGrid_refl + ! CLOUDSAT swathing variables + real(wp),dimension(:),target,allocatable :: & + temp_cloudsat_pia + real(wp),dimension(:,:),target,allocatable :: & + temp_cloudsat_precip_cover + real(wp),dimension(:,:,:),target,allocatable :: & + temp_cloudsat_cfad_ze + ! MODIS swathing variables. + real(wp),dimension(:,:),allocatable :: & + modis_boxptop, & + modis_boxttop, & + modis_boxtau + integer,dimension(:,:),allocatable :: & + modisLEVMATCH + real(wp),dimension(:),target,allocatable :: & + modis_meantbclr + + ! Initialize error reporting for output + cosp_simulator(:)='' + if (present(debug)) verbose = debug + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! 1) Determine if using full inputs or subset + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (present(start_idx) .and. present(stop_idx)) then + ij=start_idx + ik=stop_idx + else + ij=1 + ik=cospIN%Npoints + endif + Npoints = ik-ij+1 + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! 2a) Determine which simulators to run and which statistics to compute + ! - If any of the subcolumn fields are allocated, then run the subcolumn simulators. + ! - If any of the column fields are allocated, then compute the statistics for that + ! simulator, but only save the requested fields. + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Start with all simulators and joint-diagnostics off + Lisccp_subcolumn = .false. + Lmisr_subcolumn = .false. + Lcalipso_subcolumn = .false. + LgrLidar532_subcolumn = .false. + Latlid_subcolumn = .false. + Lparasol_subcolumn = .false. + Lcloudsat_subcolumn = .false. + Lmodis_subcolumn = .false. + Lisccp_column = .false. + Lmisr_column = .false. + Lcalipso_column = .false. + LgrLidar532_column = .false. + Latlid_column = .false. + Lparasol_column = .false. + Lcloudsat_column = .false. + Lmodis_column = .false. + Lrttov_column = .false. + Lradar_lidar_tcc = .false. + Llidar_only_freq_cloud = .false. + Lcloudsat_tcc = .false. + Lcloudsat_tcc2 = .false. + Lcloudsat_modis_wr = .false. + + ! CLOUDSAT subcolumn + if (associated(cospOUT%cloudsat_Ze_tot)) Lcloudsat_subcolumn = .true. + + ! MODIS subcolumn + if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean) .or. & + associated(cospOUT%modis_Cloud_Fraction_Total_Mean) .or. & + associated(cospOUT%modis_Cloud_Fraction_Ice_Mean) .or. & + associated(cospOUT%modis_Cloud_Fraction_High_Mean) .or. & + associated(cospOUT%modis_Cloud_Fraction_Mid_Mean) .or. & + associated(cospOUT%modis_Cloud_Fraction_Low_Mean) .or. & + associated(cospOUT%modis_Optical_Thickness_Total_Mean) .or. & + associated(cospOUT%modis_Optical_Thickness_Water_Mean) .or. & + associated(cospOUT%modis_Optical_Thickness_Ice_Mean) .or. & + associated(cospOUT%modis_Optical_Thickness_Total_LogMean) .or. & + associated(cospOUT%modis_Optical_Thickness_Water_LogMean) .or. & + associated(cospOUT%modis_Optical_Thickness_Ice_LogMean) .or. & + associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean) .or. & + associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean) .or. & + associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean) .or. & + associated(cospOUT%modis_Liquid_Water_Path_Mean) .or. & + associated(cospOUT%modis_Ice_Water_Path_Mean) .or. & + associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure) .or. & + associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq) .or. & + associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & + Lmodis_subcolumn = .true. + + ! ISCCP subcolumn + if (associated(cospOUT%isccp_boxtau) .or. & + associated(cospOUT%isccp_boxptop)) & + Lisccp_subcolumn = .true. + + ! MISR subcolumn + if (associated(cospOUT%misr_dist_model_layertops)) & + Lmisr_subcolumn = .true. + + ! CALIPOSO subcolumn + if (associated(cospOUT%calipso_beta_mol) .or. & + associated(cospOUT%calipso_betaperp_tot) .or. & + associated(cospOUT%calipso_beta_tot)) & + Lcalipso_subcolumn = .true. + + ! GROUND LIDAR subcolumn + if (associated(cospOUT%grLidar532_beta_mol) .or. & + associated(cospOUT%grLidar532_beta_tot)) & + LgrLidar532_subcolumn = .true. + + ! ATLID subcolumn + if (associated(cospOUT%atlid_beta_mol) .or. & + associated(cospOUT%atlid_beta_tot)) & + Latlid_subcolumn = .true. + + ! PARASOL subcolumn + if (associated(cospOUT%parasolPix_refl)) & + Lparasol_subcolumn = .true. + + ! RTTOV Column + if (allocated(cospOUT%rttov_outputs)) then + Lrttov_column = .true. + endif + + ! ISCCP column + if (associated(cospOUT%isccp_fq) .or. & + associated(cospOUT%isccp_meanalbedocld) .or. & + associated(cospOUT%isccp_meanptop) .or. & + associated(cospOUT%isccp_meantaucld) .or. & + associated(cospOUT%isccp_totalcldarea) .or. & + associated(cospOUT%isccp_meantb)) then + Lisccp_column = .true. + Lisccp_subcolumn = .true. + endif + + ! MISR column + if (associated(cospOUT%misr_cldarea) .or. & + associated(cospOUT%misr_meanztop) .or. & + associated(cospOUT%misr_fq)) then + Lmisr_column = .true. + Lmisr_subcolumn = .true. + endif + + ! CALIPSO column + if (associated(cospOUT%calipso_cfad_sr) .or. & + associated(cospOUT%calipso_lidarcld) .or. & + associated(cospOUT%calipso_lidarcldphase) .or. & + associated(cospOUT%calipso_lidarcldtype) .or. & + associated(cospOUT%calipso_cldlayer) .or. & + associated(cospOUT%calipso_cldtype) .or. & + associated(cospOUT%calipso_cldtypetemp) .or. & + associated(cospOUT%calipso_cldtypemeanz) .or. & + associated(cospOUT%calipso_cldtypemeanzse) .or. & + associated(cospOUT%calipso_cldthinemis) .or. & + associated(cospOUT%calipso_cldlayerphase) .or. & + associated(cospOUT%calipso_lidarcldtmp)) then + Lcalipso_column = .true. + Lcalipso_subcolumn = .true. + endif + + ! GROUND LIDAR column + if (associated(cospOUT%grLidar532_cfad_sr) .or. & + associated(cospOUT%grLidar532_lidarcld) .or. & + associated(cospOUT%grLidar532_cldlayer)) then + LgrLidar532_column = .true. + LgrLidar532_subcolumn = .true. + endif + + ! ATLID column + if (associated(cospOUT%atlid_cfad_sr) .or. & + associated(cospOUT%atlid_lidarcld) .or. & + associated(cospOUT%atlid_cldlayer)) then + Latlid_column = .true. + Latlid_subcolumn = .true. + endif + + ! PARASOL column + if (associated(cospOUT%parasolGrid_refl)) then + Lparasol_column = .true. + Lparasol_subcolumn = .true. + endif + + ! CLOUDSAT column + if (associated(cospOUT%cloudsat_cfad_ze)) then + Lcloudsat_column = .true. + Lcloudsat_subcolumn = .true. + endif + + ! MODIS column + if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean) .or. & + associated(cospOUT%modis_Cloud_Fraction_Water_Mean) .or. & + associated(cospOUT%modis_Cloud_Fraction_Ice_Mean) .or. & + associated(cospOUT%modis_Cloud_Fraction_High_Mean) .or. & + associated(cospOUT%modis_Cloud_Fraction_Mid_Mean) .or. & + associated(cospOUT%modis_Cloud_Fraction_Low_Mean) .or. & + associated(cospOUT%modis_Optical_Thickness_Total_Mean) .or. & + associated(cospOUT%modis_Optical_Thickness_Water_Mean) .or. & + associated(cospOUT%modis_Optical_Thickness_Ice_Mean) .or. & + associated(cospOUT%modis_Optical_Thickness_Total_LogMean) .or. & + associated(cospOUT%modis_Optical_Thickness_Water_LogMean) .or. & + associated(cospOUT%modis_Optical_Thickness_Ice_LogMean) .or. & + associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean) .or. & + associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean) .or. & + associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean) .or. & + associated(cospOUT%modis_Liquid_Water_Path_Mean) .or. & + associated(cospOUT%modis_Ice_Water_Path_Mean) .or. & + associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure) .or. & + associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq) .or. & + associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) then + Lmodis_column = .true. + Lmodis_subcolumn = .true. + endif + + ! Joint simulator products + if (associated(cospOUT%lidar_only_freq_cloud) .or. associated(cospOUT%radar_lidar_tcc) .or. & + associated(cospOUT%cloudsat_tcc) .or. associated(cospOUT%cloudsat_tcc2)) then + Lcalipso_column = .true. + Lcalipso_subcolumn = .true. + Lcloudsat_column = .true. + Lcloudsat_subcolumn = .true. + Lradar_lidar_tcc = .true. + Llidar_only_freq_cloud = .true. + Lcloudsat_tcc = .true. + Lcloudsat_tcc2 = .true. + endif + + ! CloudSat+MODIS joint simulator product + if ( associated(cospOUT%cfodd_ntotal) .or. associated(cospOUT%wr_occfreq_ntotal) ) then + Lmodis_column = .true. + Lmodis_subcolumn = .true. + Lcloudsat_column = .true. + Lcloudsat_subcolumn = .true. + Lcloudsat_modis_wr = .true. ! WR: warm rain product + endif + + ! for DPLRW + if (associated(cospOUT%dplrw_Z)) then + Ldplrw = .true. + Lcloudsat_subcolumn = .true. + end if + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! 2b) Error Checking + ! Enforce bounds on input fields. If input field is out-of-bounds, report error + ! and turn off simulator + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + call cosp_errorCheck(cospgridIN, cospIN, Lisccp_subcolumn, Lisccp_column, & + Lmisr_subcolumn, Lmisr_column, Lmodis_subcolumn, Lmodis_column, & + Lcloudsat_subcolumn, Lcloudsat_column, Lcalipso_subcolumn, Lcalipso_column, & + Latlid_subcolumn, Latlid_column, LgrLidar532_subcolumn, LgrLidar532_column, & + Lrttov_column, Lparasol_subcolumn, Lparasol_column, & + Lradar_lidar_tcc, Llidar_only_freq_cloud, Lcloudsat_tcc,Lcloudsat_tcc2, & + Lcloudsat_modis_wr, cospOUT, cosp_simulator, nError) + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! 3) Populate instrument simulator inputs + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + ! Indexing order for "cospIN % cospswathsIN" is ISCCP, MISR, CLOUDSAT-CALIPSO, ATLID, PARASOL, MODIS + if (Lisccp_subcolumn .or. Lmodis_subcolumn) then + call COSP_ASSIGN_isccpIN(cospIN,cospgridIN,Npoints,isccpIN,ISCCP_MASK_INDICES) !COSP_ASSIGN_isccpIN + endif + + if (Lmisr_subcolumn) then + call COSP_ASSIGN_misrIN(cospIN,cospgridIN,Npoints,misrIN,MISR_MASK_INDICES) + endif + + if (Lcalipso_subcolumn) then + call COSP_ASSIGN_calipsoIN(cospIN,cospgridIN,Npoints,calipsoIN,CSCAL_MASK_INDICES,CSCAL_SWATH_MASK) + endif + + if (LgrLidar532_subcolumn) then + grLidar532IN%Npoints => Npoints + grLidar532IN%Ncolumns => cospIN%Ncolumns + grLidar532IN%Nlevels => cospIN%Nlevels + grLidar532IN%beta_mol => cospIN%beta_mol_grLidar532 + grLidar532IN%betatot => cospIN%betatot_grLidar532 + grLidar532IN%tau_mol => cospIN%tau_mol_grLidar532 + grLidar532IN%tautot => cospIN%tautot_grLidar532 + endif + + if (Latlid_subcolumn) then + call COSP_ASSIGN_atlidIN(cospIN,cospgridIN,Npoints,atlidIN,ATLID_MASK_INDICES) + endif + + if (Lparasol_subcolumn) then + call COSP_ASSIGN_parasolIN(cospIN,cospgridIN,Npoints,parasolIN,PARASOL_MASK_INDICES) + endif + + if (Lcloudsat_subcolumn) then + call COSP_ASSIGN_cloudsatIN(cospIN,cospgridIN,Npoints,cloudsatIN,CSCAL_MASK_INDICES,CSCAL_SWATH_MASK) + endif + + if (Lmodis_subcolumn) then + call COSP_ASSIGN_modisIN(cospIN,cospgridIN,Npoints,modisIN,CSCAL_SWATH_MASK,MODIS_CSCAL_MASK_INDICES) + endif + + if (Lrttov_column) then + rttovIN%nPoints => Npoints + rttovIN%nLevels => cospIN%nLevels ! This is actually "nlayers" in the RTTOV sense + rttovIN%nSubCols => cospIN%nColumns + rttovIN%co2 => cospgridIN%co2 + rttovIN%ch4 => cospgridIN%ch4 + rttovIN%n2o => cospgridIN%n2o + rttovIN%co => cospgridIN%co + rttovIN%h_surf => cospgridIN%surfelev + rttovIN%u_surf => cospgridIN%u_sfc + rttovIN%v_surf => cospgridIN%v_sfc + rttovIN%t_skin => cospgridIN%skt + rttovIN%p_surf => cospgridIN%psfc ! Lower boundary of lowest layer may not be the surface. + if (associated(cospIN%emis_grey)) rttovIN%emis_grey => cospIN%emis_grey +! rttovIN%surfem => cospgridIN%emis_in +! rttovIN%refl_in => cospgridIN%refl_in + if (allocated(cospgridIN%q2m)) then + rttovIN%q2m => cospgridIN%q2m(:) + else + rttovIN%q2m => cospgridIN%qv(:,cospIN%Nlevels) + end if + if (allocated(cospgridIN%t2m)) then + rttovIN%t2m => cospgridIN%t2m(:) + else + rttovIN%t2m => cospgridIN%at(:,cospIN%Nlevels) + end if + rttovIN%sfcmask => cospgridIN%rttov_sfcmask + rttovIN%latitude => cospgridIN%lat + rttovIN%longitude => cospgridIN%lon + rttovIN%p => cospgridIN%pfull + rttovIN%ph => cospgridIN%phalf + rttovIN%t => cospgridIN%at + rttovIN%q => cospgridIN%qv + rttovIN%o3 => cospgridIN%o3 + ! Below only needed for all-sky RTTOV calculation + rttovIN%rttov_date => cospgridIN%rttov_date + rttovIN%rttov_time => cospgridIN%rttov_time + rttovIN%sza => cospgridIN%sza + rttovIN%tca => cospgridIN%tca + rttovIN%cldLiq => cospgridIN%cloudLiq + rttovIN%cldIce => cospgridIN%cloudIce + rttovIN%DeffLiq => cospgridIN%DeffLiq + rttovIN%DeffIce => cospgridIN%DeffIce + rttovIN%fl_rain => cospgridIN%fl_rain ! Keep in case of RTTOV-SCATT implementation. + rttovIN%fl_snow => cospgridIN%fl_snow ! Keep in case of RTTOV-SCATT implementation. + endif + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! 4) Call subcolumn simulators + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + ! ISCCP (icarus) subcolumn simulator + if (Lisccp_subcolumn .or. Lmodis_subcolumn) then + if (isccpIN%Npoints .gt. 0) then + allocate(isccpLEVMATCH(isccpIN%Npoints,isccpIN%Ncolumns), & + isccp_boxttop(isccpIN%Npoints,isccpIN%Ncolumns), & + isccp_boxptop(isccpIN%Npoints,isccpIN%Ncolumns), & + isccp_boxtau(isccpIN%Npoints,isccpIN%Ncolumns), & + isccp_meantbclr(isccpIN%Npoints)) + ! Call simulator + call icarus_subcolumn(isccpIN%npoints,isccpIN%ncolumns,isccpIN%nlevels, & + isccpIN%sunlit,isccpIN%dtau,isccpIN%dem,isccpIN%skt, & + isccpIN%emsfc_lw,isccpIN%qv,isccpIN%at,isccpIN%pfull, & + isccpIN%phalf,isccpIN%frac_out,isccpLEVMATCH, & + isccp_boxtau(:,:),isccp_boxptop(:,:), & + isccp_boxttop(:,:),isccp_meantbclr(:)) + if (cospIN % cospswathsIN(1) % N_inst_swaths .gt. 0) then + ! Decode outputs from swaths when reading into cospOUT fields + cospOUT%isccp_boxtau(ij:ik,:) = R_UNDEF + cospOUT%isccp_boxptop(ij:ik,:) = R_UNDEF + cospOUT%isccp_meantbclr(ij:ik) = R_UNDEF + if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(ij+int(ISCCP_MASK_INDICES)-1,:) = isccp_boxtau(:,:) + if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(ij+int(ISCCP_MASK_INDICES)-1,:) = isccp_boxptop(:,:) + if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(ij+int(ISCCP_MASK_INDICES)-1) = isccp_meantbclr(:) + else + if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(ij:ik,:) = isccp_boxtau + if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(ij:ik,:) = isccp_boxptop + if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(ij:ik) = isccp_meantbclr + end if + else + cospOUT%isccp_boxtau(ij:ik,:) = R_UNDEF + cospOUT%isccp_boxptop(ij:ik,:) = R_UNDEF + cospOUT%isccp_meantbclr(ij:ik) = R_UNDEF + end if + end if + + ! MISR subcolumn simulator + if (Lmisr_subcolumn) then + if (misrIN%Npoints .gt. 0) then + ! Allocate space for local variables. + allocate(misr_boxztop(misrIN%Npoints,misrIN%Ncolumns), & + misr_boxtau(misrIN%Npoints,misrIN%Ncolumns), & + misr_dist_model_layertops(misrIN%Npoints,numMISRHgtBins)) + ! Call simulator + call misr_subcolumn(misrIN%Npoints,misrIN%Ncolumns,misrIN%Nlevels,misrIN%dtau, & + misrIN%zfull,misrIN%at,misrIN%sunlit,misr_boxtau, & + misr_dist_model_layertops,misr_boxztop) + if (cospIN % cospswathsIN(2) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + ! Decode outputs from swaths when reading into cospOUT fields + cospOUT%misr_dist_model_layertops(ij:ik,:) = R_UNDEF + if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(ij+int(MISR_MASK_INDICES)-1,:) = misr_dist_model_layertops(:,:) + else + if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(ij:ik,:) = misr_dist_model_layertops + end if + else + cospOUT%misr_dist_model_layertops(ij:ik,:) = R_UNDEF + end if + end if + + ! Calipso subcolumn simulator + if (Lcalipso_subcolumn) then + if (calipsoIN%Npoints .gt. 0) then + ! Allocate space for local variables + allocate(calipso_beta_mol(calipsoIN%Npoints,calipsoIN%Nlevels), & + calipso_beta_tot(calipsoIN%Npoints,calipsoIN%Ncolumns,calipsoIN%Nlevels),& + calipso_betaperp_tot(calipsoIN%Npoints,calipsoIN%Ncolumns,calipsoIN%Nlevels)) + ! Call simulator + call lidar_subcolumn(calipsoIN%npoints, calipsoIN%ncolumns, calipsoIN%nlevels, .false., & + calipsoIN%beta_mol, calipsoIN%tau_mol, calipsoIN%betatot, calipsoIN%tautot, & + calipso_beta_mol(:,:), calipso_beta_tot(:,:,:), calipsoIN%betatot_ice, & + calipsoIN%tautot_ice, calipsoIN%betatot_liq, calipsoIN%tautot_liq, & + calipso_betaperp_tot(:,:,:)) + if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + ! Decode outputs from swaths when reading into cospOUT fields + cospOUT%calipso_beta_mol(ij:ik,:) = R_UNDEF + cospOUT%calipso_beta_tot(ij:ik,:,:) = R_UNDEF + cospOUT%calipso_betaperp_tot(ij:ik,:,:) = R_UNDEF + if (associated(cospOUT%calipso_beta_mol)) cospOUT%calipso_beta_mol(ij+int(CSCAL_MASK_INDICES)-1,calipsoIN%Nlevels:1:-1) = calipso_beta_mol(:,:) + if (associated(cospOUT%calipso_beta_tot)) cospOUT%calipso_beta_tot(ij+int(CSCAL_MASK_INDICES)-1,:,calipsoIN%Nlevels:1:-1) = calipso_beta_tot(:,:,:) + if (associated(cospOUT%calipso_betaperp_tot)) cospOUT%calipso_betaperp_tot(ij+int(CSCAL_MASK_INDICES)-1,:,:) = calipso_betaperp_tot(:,:,:) + else ! Proceed normally + ! Store output (if requested) + if (associated(cospOUT%calipso_beta_mol)) cospOUT%calipso_beta_mol(ij:ik,calipsoIN%Nlevels:1:-1) = calipso_beta_mol + if (associated(cospOUT%calipso_beta_tot)) cospOUT%calipso_beta_tot(ij:ik,:,calipsoIN%Nlevels:1:-1) = calipso_beta_tot + if (associated(cospOUT%calipso_betaperp_tot)) cospOUT%calipso_betaperp_tot(ij:ik,:,:) = calipso_betaperp_tot + endif + else + cospOUT%calipso_beta_mol(ij:ik,:) = R_UNDEF + cospOUT%calipso_beta_tot(ij:ik,:,:) = R_UNDEF + cospOUT%calipso_betaperp_tot(ij:ik,:,:) = R_UNDEF + endif + endif + + ! GROUND LIDAR subcolumn simulator + if (LgrLidar532_subcolumn) then + ! Allocate space for local variables + allocate(grLidar532_beta_mol(grLidar532IN%Npoints,grLidar532IN%Nlevels), & + grLidar532_beta_tot(grLidar532IN%Npoints,grLidar532IN%Ncolumns,grLidar532IN%Nlevels)) + ! Call simulator + call lidar_subcolumn(grLidar532IN%npoints, grLidar532IN%ncolumns, grLidar532IN%nlevels,& + .true., grLidar532IN%beta_mol, grLidar532IN%tau_mol, grLidar532IN%betatot,& + grLidar532IN%tautot, grLidar532_beta_mol(:,:), grLidar532_beta_tot(:,:,:)) + ! Store output (if requested) + if (associated(cospOUT%grLidar532_beta_mol)) & + cospOUT%grLidar532_beta_mol(ij:ik,grLidar532IN%Nlevels:1:-1) = grLidar532_beta_mol + if (associated(cospOUT%grLidar532_beta_tot)) & + cospOUT%grLidar532_beta_tot(ij:ik,:,grLidar532IN%Nlevels:1:-1) = grLidar532_beta_tot + endif + + ! ATLID subcolumn simulator + if (Latlid_subcolumn) then + if (atlidIN%Npoints .gt. 0) then + ! Allocate space for local variables + allocate(atlid_beta_mol(atlidIN%Npoints,atlidIN%Nlevels), & + atlid_beta_tot(atlidIN%Npoints,atlidIN%Ncolumns,atlidIN%Nlevels)) + ! Call simulator + call lidar_subcolumn(atlidIN%npoints, atlidIN%ncolumns, atlidIN%nlevels, & + .false., atlidIN%beta_mol_atlid, atlidIN%tau_mol_atlid, atlidIN%betatot_atlid, & + atlidIN%tautot_atlid, atlid_beta_mol(:,:), atlid_beta_tot(:,:,:)) + ! Decode outputs from swaths when reading into cospOUT fields + if (cospIN % cospswathsIN(4) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + cospOUT%atlid_beta_mol(ij:ik,:) = R_UNDEF + cospOUT%atlid_beta_tot(ij:ik,:,:) = R_UNDEF + if (associated(cospOUT%atlid_beta_mol)) cospOUT%atlid_beta_mol(ij+int(ATLID_MASK_INDICES)-1,atlidIN%Nlevels:1:-1) = atlid_beta_mol(:,:) + if (associated(cospOUT%atlid_beta_tot)) cospOUT%atlid_beta_tot(ij+int(ATLID_MASK_INDICES)-1,:,atlidIN%Nlevels:1:-1) = atlid_beta_tot(:,:,:) + else + ! Store output (if requested) + if (associated(cospOUT%atlid_beta_mol)) & + cospOUT%atlid_beta_mol(ij:ik,atlidIN%Nlevels:1:-1) = atlid_beta_mol + if (associated(cospOUT%atlid_beta_tot)) & + cospOUT%atlid_beta_tot(ij:ik,:,atlidIN%Nlevels:1:-1) = atlid_beta_tot + end if + else + cospOUT%atlid_beta_mol(ij:ik,:) = R_UNDEF + cospOUT%atlid_beta_tot(ij:ik,:,:) = R_UNDEF + endif + endif + + ! PARASOL subcolumn simulator + if (Lparasol_subcolumn) then + if (parasolIN%Npoints .gt. 0) then + ! Allocate space for local variables + allocate(parasolPix_refl(parasolIN%Npoints,parasolIN%Ncolumns,PARASOL_NREFL)) + ! Call simulator + do icol=1,parasolIN%Ncolumns + call parasol_subcolumn(parasolIN%npoints, PARASOL_NREFL, & + parasolIN%tautot_S_liq(1:parasolIN%Npoints,icol), & + parasolIN%tautot_S_ice(1:parasolIN%Npoints,icol), & + parasolPix_refl(:,icol,1:PARASOL_NREFL)) + ! Store output (if requested) + if (cospIN % cospswathsIN(5) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + cospOUT%parasolPix_refl(ij:ik,icol,1:PARASOL_NREFL) = R_UNDEF + if (associated(cospOUT%parasolPix_refl)) cospOUT%parasolPix_refl(ij+int(PARASOL_MASK_INDICES)-1,icol,1:PARASOL_NREFL) = parasolPix_refl(:,icol,1:PARASOL_NREFL) + else + if (associated(cospOUT%parasolPix_refl)) cospOUT%parasolPix_refl(ij:ik,icol,1:PARASOL_NREFL) = parasolPix_refl(:,icol,1:PARASOL_NREFL) + endif + enddo + else + cospOUT%parasolPix_refl(ij:ik,:,1:PARASOL_NREFL) = R_UNDEF + endif + endif + + ! Cloudsat (quickbeam) subcolumn simulator + if (Lcloudsat_subcolumn) then + ! Allocate space for local variables + if (cloudsatIN%Npoints .gt. 0) then + allocate(cloudsatDBZe(cloudsatIN%Npoints,cloudsatIN%Ncolumns,cloudsatIN%Nlevels), & + cloudsatZe_non(cloudsatIN%Npoints,cloudsatIN%Ncolumns,cloudsatIN%Nlevels)) + do icol=1,cloudsatIN%ncolumns + call quickbeam_subcolumn(cloudsatIN%rcfg,cloudsatIN%Npoints,cloudsatIN%Nlevels,& + cloudsatIN%hgt_matrix/1000._wp, & + cloudsatIN%z_vol(:,icol,:), & + cloudsatIN%kr_vol(:,icol,:), & + cloudsatIN%g_vol(:,1,:),cloudsatDBze(:,icol,:),cloudsatZe_non(:,icol,:)) + enddo + ! Store output (if requested) + if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + cospOUT%cloudsat_Ze_tot(ij:ik,:,:) = R_UNDEF + if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(ij+int(CSCAL_MASK_INDICES)-1,:,1:cloudsatIN%Nlevels) = cloudsatDBZe(:,:,1:cloudsatIN%Nlevels) + else + if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(ij:ik,:,:) = cloudsatDBZe(:,:,1:cloudsatIN%Nlevels) + endif + else + cospOUT%cloudsat_Ze_tot(ij:ik,:,:) = R_UNDEF + endif + endif + + ! MODIS subcolumn simulator + if (Lmodis_subcolumn) then + if (modisiN%nSunlit > 0) then + ! Allocate space for local variables + allocate(modisRetrievedTau(modisIN%nSunlit,modisIN%nColumns), & + modisRetrievedSize(modisIN%nSunlit,modisIN%nColumns), & + modisRetrievedPhase(modisIN%nSunlit,modisIN%nColumns), & + modisRetrievedCloudTopPressure(modisIN%nSunlit,modisIN%nColumns)) + if ((Lisccp_subcolumn .or. Lmodis_subcolumn) .and. (cospIN % cospswathsIN(1) % N_inst_swaths .gt. 0)) then ! If ISCCP is swathed must run ICARUS separately for MODIS + allocate(modisLEVMATCH(modisIN%Npoints,modisIN%Ncolumns), & + modis_boxptop(modisIN%Npoints,modisIN%Ncolumns), & + modis_boxttop(modisIN%Npoints,modisIN%Ncolumns), & + modis_boxtau(modisIN%Npoints,modisIN%Ncolumns), & + modis_meantbclr(modisIN%Npoints)) + if (.not. allocated(MODIS_SWATH_MASK)) then ! Allows to run when there is no swathing + allocate(MODIS_SWATH_MASK(Npoints)) + MODIS_SWATH_MASK(:) = .true. + end if + call icarus_subcolumn(modisIN%npoints,modisIN%ncolumns,modisIN%nlevels, & + int(MERGE(1,0,MASK=(cospgridIN%sunlit > 0) .and. MODIS_SWATH_MASK)), & + modisIN%tau,cospIN%emiss_11,cospgridIN%skt, & + cospIN%emsfc_lw,cospgridIN%qv,cospgridIN%at,cospgridIN%pfull, & + modisIN%pres,cospIN%frac_out,modisLEVMATCH, & + modis_boxtau(:,:),modis_boxptop(:,:), & + modis_boxttop(:,:),modis_meantbclr(:)) + deallocate(modis_boxtau,modis_boxttop,modis_meantbclr,modisLEVMATCH) + else ! If ISCCP runs fully, just use the cospOUT field indexed appropriately + allocate(modis_boxptop(modisIN%Npoints,modisIN%Ncolumns)) + modis_boxptop = cospOUT%isccp_boxptop(ij:ik,:) + end if + ! Call simulator one column at a time on sunlit columns + do i = 1, modisIN%nSunlit ! Just run on the sunlit columns, even though the modisIN DDT includes everything orbit swathed + call modis_subcolumn(modisIN%Ncolumns,modisIN%Nlevels, & + modisIN%pres(int(modisIN%sunlit(i)),:), & + modisIN%tau(int(modisIN%sunlit(i)),:,:), & + modisIN%liqFrac(int(modisIN%sunlit(i)),:,:), & + modisIN%g(int(modisIN%sunlit(i)),:,:), & + modisIN%w0(int(modisIN%sunlit(i)),:,:), & + modis_boxptop(int(modisIN%sunlit(i)),:), & + modisRetrievedPhase(i,:), & + modisRetrievedCloudTopPressure(i,:), & + modisRetrievedTau(i,:),modisRetrievedSize(i,:)) + end do + deallocate(modis_boxptop) + endif + endif + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! 5) Call column simulators + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + ! ISCCP + if (Lisccp_column) then + ! Check to see which outputs are requested. If not requested, use a local dummy array + if(.not. associated(cospOUT%isccp_meanalbedocld)) then + allocate(out1D_1(Npoints)) + cospOUT%isccp_meanalbedocld(ij:ik) => out1D_1 + endif + if(.not. associated(cospOUT%isccp_meanptop)) then + allocate(out1D_2(Npoints)) + cospOUT%isccp_meanptop(ij:ik) => out1D_2 + endif + if(.not. associated(cospOUT%isccp_meantaucld)) then + allocate(out1D_3(Npoints)) + cospOUT%isccp_meantaucld(ij:ik) => out1D_3 + endif + if(.not. associated(cospOUT%isccp_totalcldarea)) then + allocate(out1D_4(Npoints)) + cospOUT%isccp_totalcldarea(ij:ik) => out1D_4 + endif + if(.not. associated(cospOUT%isccp_meantb)) then + allocate(out1D_5(Npoints)) + cospOUT%isccp_meantb(ij:ik) => out1D_5 + endif + if(.not. associated(cospOUT%isccp_fq)) then + allocate(out1D_6(Npoints*numISCCPTauBins*numISCCPPresBins)) + cospOUT%isccp_fq(ij:ik,1:numISCCPTauBins,1:numISCCPPresBins) => out1D_6 + endif + + ! Call simulator + if (isccpIN%Npoints .gt. 0) then + allocate(temp_isccp_fq(isccpIN%Npoints,numISCCPTauBins,numISCCPPresBins), & + temp_isccp_meanalbedocld(isccpIN%Npoints), & + temp_isccp_meanptop(isccpIN%Npoints), & + temp_isccp_meantaucld(isccpIN%Npoints), & + temp_isccp_totalcldarea(isccpIN%Npoints), & + temp_isccp_meantb(isccpIN%Npoints)) + call icarus_column(isccpIN%npoints, isccpIN%ncolumns,isccp_boxtau(:,:), & + isccp_boxptop(:,:)/100._wp,isccpIN%sunlit,isccp_boxttop(:,:), & + temp_isccp_fq, & + temp_isccp_meanalbedocld, & + temp_isccp_meanptop,temp_isccp_meantaucld, & + temp_isccp_totalcldarea,temp_isccp_meantb) + if (cospIN % cospswathsIN(1) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + ! Decode back to the cospOUT shapes + cospOUT%isccp_fq(ij:ik,:,:) = R_UNDEF + cospOUT%isccp_meanalbedocld(ij:ik) = R_UNDEF + cospOUT%isccp_meanptop(ij:ik) = R_UNDEF + cospOUT%isccp_meantaucld(ij:ik) = R_UNDEF + cospOUT%isccp_totalcldarea(ij:ik) = R_UNDEF + cospOUT%isccp_meantb(ij:ik) = R_UNDEF + if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(ij+int(ISCCP_MASK_INDICES)-1,:,:) = temp_isccp_fq(:,:,:) + if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(ij+int(ISCCP_MASK_INDICES)-1) = temp_isccp_meanalbedocld(:) + if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(ij+int(ISCCP_MASK_INDICES)-1) = temp_isccp_meanptop(:) + if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(ij+int(ISCCP_MASK_INDICES)-1) = temp_isccp_meantaucld(:) + if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(ij+int(ISCCP_MASK_INDICES)-1) = temp_isccp_totalcldarea(:) + if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(ij+int(ISCCP_MASK_INDICES)-1) = temp_isccp_meantb(:) + else + if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(ij:ik,:,:) = temp_isccp_fq(:,:,:) + if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(ij:ik) = temp_isccp_meanalbedocld(:) + if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(ij:ik) = temp_isccp_meanptop(:) + if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(ij:ik) = temp_isccp_meantaucld(:) + if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(ij:ik) = temp_isccp_totalcldarea(:) + if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(ij:ik) = temp_isccp_meantb(:) + end if + deallocate(temp_isccp_fq,temp_isccp_meanalbedocld,temp_isccp_meanptop,temp_isccp_meantaucld,temp_isccp_totalcldarea,temp_isccp_meantb) + else + cospOUT%isccp_fq(ij:ik,:,:) = R_UNDEF + cospOUT%isccp_meanalbedocld(ij:ik) = R_UNDEF + cospOUT%isccp_meanptop(ij:ik) = R_UNDEF + cospOUT%isccp_meantaucld(ij:ik) = R_UNDEF + cospOUT%isccp_totalcldarea(ij:ik) = R_UNDEF + cospOUT%isccp_meantb(ij:ik) = R_UNDEF + end if + cospOUT%isccp_fq(ij:ik,:,:) = cospOUT%isccp_fq(ij:ik,:,7:1:-1) + + ! Check if there is any value slightly greater than 1 + where ((cospOUT%isccp_totalcldarea > 1.0-1.e-5) .and. & + (cospOUT%isccp_totalcldarea < 1.0+1.e-5)) + cospOUT%isccp_totalcldarea = 1.0 + endwhere + + ! Clear up memory (if necessary) + if (allocated(isccp_boxttop)) deallocate(isccp_boxttop) + if (allocated(isccp_boxptop)) deallocate(isccp_boxptop) + if (allocated(isccp_boxtau)) deallocate(isccp_boxtau) + if (allocated(isccp_meantbclr)) deallocate(isccp_meantbclr) + if (allocated(isccpLEVMATCH)) deallocate(isccpLEVMATCH) + if (allocated(ISCCP_MASK_INDICES)) deallocate(ISCCP_MASK_INDICES) + if (allocated(out1D_1)) then + deallocate(out1D_1) + nullify(cospOUT%isccp_meanalbedocld) + endif + if (allocated(out1D_2)) then + deallocate(out1D_2) + nullify(cospOUT%isccp_meanptop) + endif + if (allocated(out1D_3)) then + deallocate(out1D_3) + nullify(cospOUT%isccp_meantaucld) + endif + if (allocated(out1D_4)) then + deallocate(out1D_4) + nullify(cospOUT%isccp_totalcldarea) + endif + if (allocated(out1D_5)) then + deallocate(out1D_5) + nullify(cospOUT%isccp_meantb) + endif + if (allocated(out1D_6)) then + deallocate(out1D_6) + nullify(cospOUT%isccp_fq) + endif + endif + + ! MISR + if (Lmisr_column) then + ! Check to see which outputs are requested. If not requested, use a local dummy array + if (.not. associated(cospOUT%misr_cldarea)) then + allocate(out1D_1(Npoints)) + cospOUT%misr_cldarea(ij:ik) => out1D_1 + endif + if (.not. associated(cospOUT%misr_meanztop)) then + allocate(out1D_2(Npoints)) + cospOUT%misr_meanztop(ij:ik) => out1D_2 + endif + if (.not. associated(cospOUT%misr_fq)) then + allocate(out1D_3(Npoints*numMISRTauBins*numMISRHgtBins)) + cospOUT%misr_fq(ij:ik,1:numMISRTauBins,1:numMISRHgtBins) => out1D_3 + endif + + ! Call simulator + if (cospIN % cospswathsIN(2) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + if (misrIN%Npoints .gt. 0) then + ! Operate at the masked format. + allocate(temp_misr_cldarea(misrIN%Npoints), & + temp_misr_meanztop(misrIN%Npoints), & + temp_misr_fq(misrIN%Npoints,numMISRTauBins,numMISRHgtBins)) + call misr_column(misrIN%Npoints,misrIN%Ncolumns,misr_boxztop,misrIN%sunlit, & + misr_boxtau,temp_misr_cldarea(:), & + temp_misr_meanztop(:),temp_misr_fq(:,:,:)) + ! Decode back to the cospOUT shapes + cospOUT%misr_cldarea(ij:ik) = R_UNDEF + cospOUT%misr_meanztop(ij:ik) = R_UNDEF + cospOUT%misr_fq(ij:ik,:,:) = R_UNDEF + if (associated(cospOUT%misr_cldarea)) cospOUT%misr_cldarea(ij+int(MISR_MASK_INDICES)-1) = temp_misr_cldarea(:) + if (associated(cospOUT%misr_meanztop)) cospOUT%misr_meanztop(ij+int(MISR_MASK_INDICES)-1) = temp_misr_meanztop(:) + if (associated(cospOUT%misr_fq)) cospOUT%misr_fq(ij+int(MISR_MASK_INDICES)-1,:,:) = temp_misr_fq(:,:,:) + deallocate(temp_misr_cldarea,temp_misr_meanztop,temp_misr_fq) + else + cospOUT%misr_cldarea(ij:ik) = R_UNDEF + cospOUT%misr_meanztop(ij:ik) = R_UNDEF + cospOUT%misr_fq(ij:ik,:,:) = R_UNDEF + endif + else + call misr_column(misrIN%Npoints,misrIN%Ncolumns,misr_boxztop,misrIN%sunlit,& + misr_boxtau,cospOUT%misr_cldarea(ij:ik), & + cospOUT%misr_meanztop(ij:ik),cospOUT%misr_fq(ij:ik,:,:)) + endif + ! Clear up memory + if (allocated(misr_boxtau)) deallocate(misr_boxtau) + if (allocated(misr_boxztop)) deallocate(misr_boxztop) + if (allocated(misr_dist_model_layertops)) deallocate(misr_dist_model_layertops) + if (allocated(MISR_MASK_INDICES)) deallocate(MISR_MASK_INDICES) + if (allocated(out1D_1)) then + deallocate(out1D_1) + nullify(cospOUT%misr_cldarea) + endif + if (allocated(out1D_2)) then + deallocate(out1D_2) + nullify(cospOUT%misr_meanztop) + endif + if (allocated(out1D_3)) then + deallocate(out1D_3) + nullify(cospOUT%misr_fq) + endif + endif + + ! CALIPSO LIDAR Simulator + if (Lcalipso_column) then + ! Check to see which outputs are requested. If not requested, use a local dummy array + if (.not. associated(cospOUT%calipso_cfad_sr)) then + allocate(out1D_1(Npoints*SR_BINS*Nlvgrid)) + cospOUT%calipso_cfad_sr(ij:ik,1:SR_BINS,1:Nlvgrid) => out1D_1 + endif + if (.not. associated(cospOUT%calipso_lidarcld)) then + allocate(out1D_2(Npoints*Nlvgrid)) + cospOUT%calipso_lidarcld(ij:ik,1:Nlvgrid) => out1D_2 + endif + if (.not. associated(cospOUT%calipso_lidarcldphase)) then + allocate(out1D_3(Npoints*Nlvgrid*6)) + cospOUT%calipso_lidarcldphase(ij:ik,1:Nlvgrid,1:6) => out1D_3 + endif + if (.not. associated(cospOUT%calipso_cldlayer)) then + allocate(out1D_4(Npoints*LIDAR_NCAT)) + cospOUT%calipso_cldlayer(ij:ik,1:LIDAR_NCAT) => out1D_4 + endif + if (.not. associated(cospOUT%calipso_cldlayerphase)) then + allocate(out1D_5(Npoints*LIDAR_NCAT*6)) + cospOUT%calipso_cldlayerphase(ij:ik,1:LIDAR_NCAT,1:6) => out1D_5 + endif + if (.not. associated(cospOUT%calipso_lidarcldtmp)) then + allocate(out1D_6(Npoints*40*5)) + cospOUT%calipso_lidarcldtmp(ij:ik,1:40,1:5) => out1D_6 + endif + if (.not. associated(cospOUT%calipso_lidarcldtype)) then + allocate(out1D_7(Npoints*Nlvgrid*4)) + cospOUT%calipso_lidarcldtype(ij:ik,1:Nlvgrid,1:4) => out1D_7 + endif + if (.not. associated(cospOUT%calipso_cldtype)) then + allocate(out1D_8(Npoints*LIDAR_NTYPE)) + cospOUT%calipso_cldtype(ij:ik,1:LIDAR_NTYPE) => out1D_8 + endif + if (.not. associated(cospOUT%calipso_cldtypetemp)) then + allocate(out1D_9(Npoints*LIDAR_NTYPE)) + cospOUT%calipso_cldtypetemp(ij:ik,1:LIDAR_NTYPE) => out1D_9 + endif + if (.not. associated(cospOUT%calipso_cldtypemeanz)) then + allocate(out1D_10(Npoints*2)) + cospOUT%calipso_cldtypemeanz(ij:ik,1:2) => out1D_10 + endif + if (.not. associated(cospOUT%calipso_cldtypemeanzse)) then + allocate(out1D_12(Npoints*3)) + cospOUT%calipso_cldtypemeanzse(ij:ik,1:3) => out1D_12 + endif + if (.not. associated(cospOUT%calipso_cldthinemis)) then + allocate(out1D_11(Npoints)) + cospOUT%calipso_cldthinemis(ij:ik) => out1D_11 + endif + + ! Call simulator + if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + ! Operate at the masked format. + if (calipsoIN%Npoints .gt. 0) then + allocate(temp_calipso_cfad_sr(calipsoIN%Npoints,SR_BINS,Nlvgrid), & + temp_calipso_lidarcld(calipsoIN%Npoints,Nlvgrid), & + temp_calipso_cldlayer(calipsoIN%Npoints,LIDAR_NCAT), & + temp_calipso_lidarcldphase(calipsoIN%Npoints,Nlvgrid,6), & + temp_calipso_lidarcldtype(calipsoIN%Npoints,Nlvgrid,LIDAR_NTYPE+1), & + temp_calipso_cldtype(calipsoIN%Npoints,LIDAR_NTYPE), & + temp_calipso_cldtypetemp(calipsoIN%Npoints,LIDAR_NTYPE), & + temp_calipso_cldtypemeanz(calipsoIN%Npoints,2), & + temp_calipso_cldtypemeanzse(calipsoIN%Npoints,3), & + temp_calipso_cldthinemis(calipsoIN%Npoints), & + temp_calipso_cldlayerphase(calipsoIN%Npoints,LIDAR_NCAT,6), & + temp_calipso_lidarcldtmp(calipsoIN%Npoints,LIDAR_NTEMP,5)) + ok_lidar_cfad=.true. + call lidar_column(calipsoIN%Npoints, calipsoIN%Ncolumns, calipsoIN%Nlevels, & + Nlvgrid, SR_BINS, LIDAR_NTYPE, 'calipso',calipso_beta_tot(:,:,:), calipso_beta_mol(:,:), & + cospgridIN%phalf(int(CSCAL_MASK_INDICES),2:calipsoIN%Nlevels+1), & + cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES),:), & + cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES),:), vgrid_z(:), ok_lidar_cfad, LIDAR_NCAT, & + temp_calipso_cfad_sr(:,:,:), temp_calipso_lidarcld(:,:), temp_calipso_cldlayer(:,:), & + cospgridIN%at(int(CSCAL_MASK_INDICES),:), calipso_betaperp_tot(:,:,:), & + cospgridIN%surfelev(int(CSCAL_MASK_INDICES)), & + temp_calipso_lidarcldphase(:,:,:), & + temp_calipso_lidarcldtype(:,:,:), temp_calipso_cldtype(:,:), & + temp_calipso_cldtypetemp(:,:), temp_calipso_cldtypemeanz(:,:), & + temp_calipso_cldtypemeanzse(:,:), temp_calipso_cldthinemis(:), & + temp_calipso_cldlayerphase(:,:,:), temp_calipso_lidarcldtmp(:,:,:)) + ! Decode back to the cospOUT shapes + cospOUT%calipso_cfad_sr(ij:ik,:,:) = R_UNDEF + cospOUT%calipso_lidarcld(ij:ik,:) = R_UNDEF + cospOUT%calipso_cldlayer(ij:ik,:) = R_UNDEF + cospOUT%calipso_lidarcldphase(ij:ik,:,:) = R_UNDEF + cospOUT%calipso_lidarcldtype(ij:ik,:,:) = R_UNDEF + cospOUT%calipso_cldtype(ij:ik,:) = R_UNDEF + cospOUT%calipso_cldtypetemp(ij:ik,:) = R_UNDEF + cospOUT%calipso_cldtypemeanz(ij:ik,:) = R_UNDEF + cospOUT%calipso_cldtypemeanzse(ij:ik,:) = R_UNDEF + cospOUT%calipso_cldthinemis(ij:ik) = R_UNDEF + cospOUT%calipso_cldlayerphase(ij:ik,:,:) = R_UNDEF + cospOUT%calipso_lidarcldtmp(ij:ik,:,:) = R_UNDEF + ! Note: The active simulators use R_UNDEF to indicate unretrieved and clear-sky values. + ! Decisions on how to treat these values are delegeate to the host user, and fields + ! are often set to zero. + ! Using R_UNDEF in this way is incompatible with the swath approach, where R_UNDEF means + ! that a field should not be used in statistically averaging, etc. + ! To avoid this error, when swathing we set R_UNDEF value to zero here. + where (temp_calipso_cfad_sr(:,:,:) == R_UNDEF) temp_calipso_cfad_sr(:,:,:) = 0._wp + where (temp_calipso_lidarcldphase(:,:,:) == R_UNDEF) temp_calipso_lidarcldphase(:,:,:) = 0._wp + where (temp_calipso_lidarcld(:,:) == R_UNDEF) temp_calipso_lidarcld(:,:) = 0._wp + ! Unpack into the full lat-lon structure + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(ij+int(CSCAL_MASK_INDICES)-1,:,:) = temp_calipso_cfad_sr(:,:,:) + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_calipso_lidarcld(:,:) + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_calipso_cldlayer(:,:) + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(ij+int(CSCAL_MASK_INDICES)-1,:,:) = temp_calipso_lidarcldphase(:,:,:) + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(ij+int(CSCAL_MASK_INDICES)-1,:,:) = temp_calipso_lidarcldtype(:,:,:) + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_calipso_cldtype(:,:) + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_calipso_cldtypetemp(:,:) + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_calipso_cldtypemeanz(:,:) + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_calipso_cldtypemeanzse(:,:) + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(ij+int(CSCAL_MASK_INDICES)-1) = temp_calipso_cldthinemis(:) + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(ij+int(CSCAL_MASK_INDICES)-1,:,:) = temp_calipso_cldlayerphase(:,:,:) + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(ij+int(CSCAL_MASK_INDICES)-1,:,:) = temp_calipso_lidarcldtmp(:,:,:) + deallocate(temp_calipso_cfad_sr,temp_calipso_lidarcld,temp_calipso_cldlayer,temp_calipso_lidarcldphase, & + temp_calipso_lidarcldtype,temp_calipso_cldtype,temp_calipso_cldtypetemp,temp_calipso_cldtypemeanz, & + temp_calipso_cldtypemeanzse,temp_calipso_cldthinemis,temp_calipso_cldlayerphase,temp_calipso_lidarcldtmp) + else + cospOUT%calipso_cfad_sr(ij:ik,:,:) = R_UNDEF + cospOUT%calipso_lidarcld(ij:ik,:) = R_UNDEF + cospOUT%calipso_cldlayer(ij:ik,:) = R_UNDEF + cospOUT%calipso_lidarcldphase(ij:ik,:,:) = R_UNDEF + cospOUT%calipso_lidarcldtype(ij:ik,:,:) = R_UNDEF + cospOUT%calipso_cldtype(ij:ik,:) = R_UNDEF + cospOUT%calipso_cldtypetemp(ij:ik,:) = R_UNDEF + cospOUT%calipso_cldtypemeanz(ij:ik,:) = R_UNDEF + cospOUT%calipso_cldtypemeanzse(ij:ik,:) = R_UNDEF + cospOUT%calipso_cldthinemis(ij:ik) = R_UNDEF + cospOUT%calipso_cldlayerphase(ij:ik,:,:) = R_UNDEF + cospOUT%calipso_lidarcldtmp(ij:ik,:,:) = R_UNDEF + endif + else + ok_lidar_cfad=.true. + call lidar_column(calipsoIN%Npoints, calipsoIN%Ncolumns, calipsoIN%Nlevels, & + Nlvgrid, SR_BINS, LIDAR_NTYPE, 'calipso',calipso_beta_tot(:,:,:), calipso_beta_mol(:,:),& + cospgridIN%phalf(:,2:calipsoIN%Nlevels+1),cospgridIN%hgt_matrix, & + cospgridIN%hgt_matrix_half, vgrid_z(:), ok_lidar_cfad, LIDAR_NCAT, & + cospOUT%calipso_cfad_sr(ij:ik,:,:), cospOUT%calipso_lidarcld(ij:ik,:), & + cospOUT%calipso_cldlayer(ij:ik,:), & + cospgridIN%at(:,:), calipso_betaperp_tot(:,:,:), cospgridIN%surfelev, & + cospOUT%calipso_lidarcldphase(ij:ik,:,:), & + cospOUT%calipso_lidarcldtype(ij:ik,:,:), cospOUT%calipso_cldtype(ij:ik,:), & + cospOUT%calipso_cldtypetemp(ij:ik,:), cospOUT%calipso_cldtypemeanz(ij:ik,:), & + cospOUT%calipso_cldtypemeanzse(ij:ik,:), cospOUT%calipso_cldthinemis(ij:ik), & + cospOUT%calipso_cldlayerphase(ij:ik,:,:), cospOUT%calipso_lidarcldtmp(ij:ik,:,:)) + endif + + if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval = calipso_histBsct + + ! Free up memory (if necessary) + if (allocated(out1D_1)) then + deallocate(out1D_1) + nullify(cospOUT%calipso_cfad_sr) + endif + if (allocated(out1D_2)) then + deallocate(out1D_2) + nullify(cospOUT%calipso_lidarcld) + endif + if (allocated(out1D_3)) then + deallocate(out1D_3) + nullify(cospOUT%calipso_lidarcldphase) + endif + if (allocated(out1D_4)) then + deallocate(out1D_4) + nullify(cospOUT%calipso_cldlayer) + endif + if (allocated(out1D_5)) then + deallocate(out1D_5) + nullify(cospOUT%calipso_cldlayerphase) + endif + if (allocated(out1D_6)) then + deallocate(out1D_6) + nullify(cospOUT%calipso_lidarcldtmp) + endif + if (allocated(out1D_7)) then + deallocate(out1D_7) + nullify(cospOUT%calipso_lidarcldtype) + endif + if (allocated(out1D_8)) then + deallocate(out1D_8) + nullify(cospOUT%calipso_cldtype) + endif + if (allocated(out1D_9)) then + deallocate(out1D_9) + nullify(cospOUT%calipso_cldtypetemp) + endif + if (allocated(out1D_10)) then + deallocate(out1D_10) + nullify(cospOUT%calipso_cldtypemeanz) + endif + if (allocated(out1D_12)) then + deallocate(out1D_12) + nullify(cospOUT%calipso_cldtypemeanzse) + endif + if (allocated(out1D_11)) then + deallocate(out1D_11) + nullify(cospOUT%calipso_cldthinemis) + endif + + endif + + ! GROUND LIDAR Simulator + if (LgrLidar532_column) then + ! Check to see which outputs are requested. If not requested, use a local dummy array + if (.not. associated(cospOUT%grLidar532_cfad_sr)) then + allocate(out1D_1(Npoints*SR_BINS*Nlvgrid)) + cospOUT%grLidar532_cfad_sr(ij:ik,1:SR_BINS,1:Nlvgrid) => out1D_1 + endif + if (.not. associated(cospOUT%grLidar532_lidarcld)) then + allocate(out1D_2(Npoints*Nlvgrid)) + cospOUT%grLidar532_lidarcld(ij:ik,1:Nlvgrid) => out1D_2 + endif + if (.not. associated(cospOUT%grLidar532_cldlayer)) then + allocate(out1D_3(Npoints*LIDAR_NCAT)) + cospOUT%grLidar532_cldlayer(ij:ik,1:LIDAR_NCAT) => out1D_3 + endif + + ! Call simulator + ok_lidar_cfad_grLidar532=.true. + call lidar_column(grLidar532IN%Npoints, grLidar532IN%Ncolumns, grLidar532IN%Nlevels, & + Nlvgrid, SR_BINS, LIDAR_NTYPE, 'grlidar532',grLidar532_beta_tot(:,:,:), grLidar532_beta_mol(:,:),& + cospgridIN%phalf(:,2:grLidar532IN%Nlevels+1),cospgridIN%hgt_matrix, & + cospgridIN%hgt_matrix_half, vgrid_z(:), ok_lidar_cfad_grLidar532, LIDAR_NCAT, & + cospOUT%grLidar532_cfad_sr(ij:ik,:,:), cospOUT%grLidar532_lidarcld(ij:ik,:), & + cospOUT%grLidar532_cldlayer(ij:ik,:)) + + if (associated(cospOUT%grLidar532_srbval)) cospOUT%grLidar532_srbval = grLidar532_histBsct + + ! Free up memory (if necessary) + if (allocated(out1D_1)) then + deallocate(out1D_1) + nullify(cospOUT%grLidar532_cfad_sr) + endif + if (allocated(out1D_2)) then + deallocate(out1D_2) + nullify(cospOUT%grLidar532_lidarcld) + endif + if (allocated(out1D_3)) then + deallocate(out1D_3) + nullify(cospOUT%grLidar532_cldlayer) + endif + + endif + + ! ATLID Simulator + if (Latlid_column) then + ! Check to see which outputs are requested. If not requested, use a local dummy array + if (.not. associated(cospOUT%atlid_cfad_sr)) then + allocate(out1D_1(Npoints*SR_BINS*Nlvgrid)) + cospOUT%atlid_cfad_sr(ij:ik,1:SR_BINS,1:Nlvgrid) => out1D_1 + endif + if (.not. associated(cospOUT%atlid_lidarcld)) then + allocate(out1D_2(Npoints*Nlvgrid)) + cospOUT%atlid_lidarcld(ij:ik,1:Nlvgrid) => out1D_2 + endif + if (.not. associated(cospOUT%atlid_cldlayer)) then + allocate(out1D_3(Npoints*LIDAR_NCAT)) + cospOUT%atlid_cldlayer(ij:ik,1:LIDAR_NCAT) => out1D_3 + endif + ! Call simulator + ok_lidar_cfad_atlid=.true. + if (cospIN % cospswathsIN(4) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + if (atlidIN%Npoints .gt. 0) then + allocate(temp_atlid_cfad_sr(atlidIN%Npoints,SR_BINS,Nlvgrid), & + temp_atlid_lidarcld(atlidIN%Npoints,Nlvgrid), & + temp_atlid_cldlayer(atlidIN%Npoints,LIDAR_NCAT)) + call lidar_column(atlidIN%Npoints, atlidIN%Ncolumns, atlidIN%Nlevels, & + Nlvgrid, SR_BINS, LIDAR_NTYPE, 'atlid',atlid_beta_tot(:,:,:), & + atlid_beta_mol(:,:), cospgridIN%phalf(int(ATLID_MASK_INDICES),2:atlidIN%Nlevels+1), & + cospgridIN%hgt_matrix(int(ATLID_MASK_INDICES),:), & + cospgridIN%hgt_matrix_half(int(ATLID_MASK_INDICES),:), vgrid_z(:), & + ok_lidar_cfad_atlid, LIDAR_NCAT, temp_atlid_cfad_sr(:,:,:), & + temp_atlid_lidarcld(:,:), temp_atlid_cldlayer(:,:)) + ! Decode back to the cospOUT shapes + cospOUT%atlid_cfad_sr(ij:ik,:,:) = R_UNDEF + cospOUT%atlid_lidarcld(ij:ik,:) = R_UNDEF + cospOUT%atlid_cldlayer(ij:ik,:) = R_UNDEF + if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(ij+int(ATLID_MASK_INDICES)-1,:,:) = temp_atlid_cfad_sr(:,:,:) + if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(ij+int(ATLID_MASK_INDICES)-1,:) = temp_atlid_lidarcld(:,:) + if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(ij+int(ATLID_MASK_INDICES)-1,:) = temp_atlid_cldlayer(:,:) + deallocate(temp_atlid_cfad_sr,temp_atlid_lidarcld,temp_atlid_cldlayer) + else + cospOUT%atlid_cfad_sr(ij:ik,:,:) = R_UNDEF + cospOUT%atlid_lidarcld(ij:ik,:) = R_UNDEF + cospOUT%atlid_cldlayer(ij:ik,:) = R_UNDEF + endif + else + call lidar_column(atlidIN%Npoints, atlidIN%Ncolumns, atlidIN%Nlevels, & + Nlvgrid, SR_BINS, LIDAR_NTYPE, 'atlid',atlid_beta_tot(:,:,:), & + atlid_beta_mol(:,:), cospgridIN%phalf(:,2:atlidIN%Nlevels+1), & + cospgridIN%hgt_matrix, cospgridIN%hgt_matrix_half, vgrid_z(:), & + ok_lidar_cfad_atlid, LIDAR_NCAT, cospOUT%atlid_cfad_sr(ij:ik,:,:), & + cospOUT%atlid_lidarcld(ij:ik,:), cospOUT%atlid_cldlayer(ij:ik,:)) + endif + if (associated(cospOUT%atlid_srbval)) cospOUT%atlid_srbval = atlid_histBsct + + ! Free up memory (if necessary) + if (allocated(ATLID_MASK_INDICES)) deallocate(ATLID_MASK_INDICES) + if (allocated(out1D_1)) then + deallocate(out1D_1) + nullify(cospOUT%atlid_cfad_sr) + endif + if (allocated(out1D_2)) then + deallocate(out1D_2) + nullify(cospOUT%atlid_lidarcld) + endif + if (allocated(out1D_3)) then + deallocate(out1D_3) + nullify(cospOUT%atlid_cldlayer) + endif + + endif + + ! PARASOL + if (Lparasol_column) then + if (cospIN % cospswathsIN(5) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + if (parasolIN%Npoints .gt. 0) then + allocate(temp_parasolGrid_refl(parasolIN%Npoints,PARASOL_NREFL)) + call parasol_column(parasolIN%Npoints,PARASOL_NREFL,parasolIN%Ncolumns, & + cospgridIN%land(int(PARASOL_MASK_INDICES)),parasolPix_refl(:,:,:), & + temp_parasolGrid_refl(:,:)) + ! Decode back to the cospOUT shapes + cospOUT%parasolGrid_refl(ij:ik,:) = R_UNDEF + ! Note: The active simulators use R_UNDEF to indicate unretrieved and clear-sky values. + ! Decisions on how to treat these values are delegeate to the host user, and fields + ! are often set to zero. + ! Using R_UNDEF in this way is incompatible with the swath approach, where R_UNDEF means + ! that a field should not be used in statistically averaging, etc. + ! To avoid this error, when swathing we set R_UNDEF value to zero here. + where (temp_parasolGrid_refl(:,:) == R_UNDEF) temp_parasolGrid_refl(:,:) = 0._wp + if (associated(cospOUT%parasolGrid_refl)) cospOUT%parasolGrid_refl(ij+int(PARASOL_MASK_INDICES)-1,:) = temp_parasolGrid_refl(:,:) + deallocate(temp_parasolGrid_refl) + else + cospOUT%parasolGrid_refl(ij:ik,:) = R_UNDEF + endif + else + call parasol_column(parasolIN%Npoints,PARASOL_NREFL,parasolIN%Ncolumns, & + cospgridIN%land(:),parasolPix_refl(:,:,:), & + cospOUT%parasolGrid_refl(ij:ik,:)) + ! print*,'cospOUT%parasolGrid_refl: ',cospOUT%parasolGrid_refl ! Values not zeroed here. + endif + if (allocated(parasolPix_refl)) deallocate(parasolPix_refl) + if (allocated(PARASOL_MASK_INDICES)) deallocate(PARASOL_MASK_INDICES) + endif + + ! CLOUDSAT + if (Lcloudsat_column) then + ! Check to see which outputs are requested. If not requested, use a local dummy array + if (.not. associated(cospOUT%cloudsat_cfad_ze)) then + allocate(out1D_1(Npoints*cloudsat_DBZE_BINS*Nlvgrid)) + cospOUT%cloudsat_cfad_ze(ij:ik,1:cloudsat_DBZE_BINS,1:Nlvgrid) => out1D_1 + endif + + if (.not. associated(cospOUT%cloudsat_pia)) then + allocate(out1D_2(Npoints)) + cospOUT%cloudsat_pia(ij:ik) => out1D_2 + endif + if (.not. associated(cospOUT%cloudsat_precip_cover)) then + allocate(out1D_3(Npoints*nCloudsatPrecipClass)) + cospOUT%cloudsat_precip_cover(ij:ik,1:nCloudsatPrecipClass) => out1D_3 + endif + + ! Call simulator + if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + if (cloudsatIN%Npoints .gt. 0) then + allocate(temp_cloudsat_cfad_ze(cloudsatIN%Npoints,cloudsat_DBZE_BINS,Nlvgrid), & + temp_cloudsat_precip_cover(cloudsatIN%Npoints,nCloudsatPrecipClass), & + temp_cloudsat_pia(cloudsatIN%Npoints)) + call quickbeam_column(cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels, & + Nlvgrid, cloudsat_DBZE_BINS, 'cloudsat', cloudsatDBZe, cloudsatZe_non, & + cospgridIN%land(int(CSCAL_MASK_INDICES)), cospgridIN%surfelev(int(CSCAL_MASK_INDICES)), & + cospgridIN%at(int(CSCAL_MASK_INDICES),cospIN%Nlevels), cospIN%fracPrecipIce(int(CSCAL_MASK_INDICES),:), & + cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES),:), cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES),:), & + temp_cloudsat_cfad_ze(:,:,:), temp_cloudsat_precip_cover(:,:), temp_cloudsat_pia(:)) + ! Decode back to the cospOUT shapes + cospOUT%cloudsat_cfad_ze(ij:ik,:,:) = R_UNDEF + cospOUT%cloudsat_precip_cover(ij:ik,:) = R_UNDEF + cospOUT%cloudsat_pia(ij:ik) = R_UNDEF + ! Note: The active simulators use R_UNDEF to indicate unretrieved and clear-sky values. + ! Decisions on how to treat these values are delegeate to the host user, and fields + ! are often set to zero. + ! Using R_UNDEF in this way is incompatible with the swath approach, where R_UNDEF means + ! that a field should not be used in statistically averaging, etc. + ! To avoid this error, when swathing we set R_UNDEF value to zero here. + where (temp_cloudsat_cfad_ze(:,:,:) == R_UNDEF) temp_cloudsat_cfad_ze(:,:,:) = 0._wp + if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(ij+int(CSCAL_MASK_INDICES)-1,:,:) = temp_cloudsat_cfad_ze(:,:,:) + if (associated(cospOUT%cloudsat_precip_cover)) cospOUT%cloudsat_precip_cover(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_cloudsat_precip_cover(:,:) + if (associated(cospOUT%cloudsat_pia)) cospOUT%cloudsat_pia(ij+int(CSCAL_MASK_INDICES)-1) = temp_cloudsat_pia(:) + deallocate(temp_cloudsat_cfad_ze,temp_cloudsat_precip_cover,temp_cloudsat_pia) + if (allocated(CSCAL_SWATH_MASK)) deallocate(CSCAL_SWATH_MASK) + else + cospOUT%cloudsat_cfad_ze(ij:ik,:,:) = R_UNDEF + cospOUT%cloudsat_precip_cover(ij:ik,:) = R_UNDEF + cospOUT%cloudsat_pia(ij:ik) = R_UNDEF + endif + else + call quickbeam_column(cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels,& + Nlvgrid, cloudsat_DBZE_BINS, 'cloudsat', cloudsatDBZe, cloudsatZe_non, & + cospgridIN%land(:), cospgridIN%surfelev(:), cospgridIN%at(:,cospIN%Nlevels), & + cospIN%fracPrecipIce, cospgridIN%hgt_matrix, cospgridIN%hgt_matrix_half, & + cospOUT%cloudsat_cfad_ze(ij:ik,:,:), cospOUT%cloudsat_precip_cover(ij:ik,:), & + cospOUT%cloudsat_pia(ij:ik)) + endif + ! Free up memory (if necessary) + if (allocated(out1D_1)) then + deallocate(out1D_1) + nullify(cospOUT%cloudsat_cfad_ze) + endif + if (allocated(out1D_2)) then + deallocate(out1D_2) + nullify(cospOUT%cloudsat_pia) + endif + if (allocated(out1D_3)) then + deallocate(out1D_3) + nullify(cospOUT%cloudsat_precip_cover) + endif + + ! for DPLRW + if (Ldplrw) then + call quickbeam_dplrw(cospIN%Npoints, cospIN%Ncolumns, cospIN%Nlevels, & + cospIN%rcfg_cloudsat, & + cospgridIN%hgt_matrix, cospgridIN%hgt_matrix_half, cospgridIN%surfelev, & + cospgridIN%at, cospgridIN%pfull, & + cospgridIN%gwvel, cospgridIN%gcumf, & + cospIN%vfall, cospIN%vfsqu, cospIN%zehyd, & + cospIN%g_vol_cloudsat, cospIN%krhyd, & + cospIN%vtrm3, cospIN%vtrm0, cospIN%mmnt3, cospIN%mmnt0, & + cospOUT%gcumw(ij:ik,:), & + cospOUT%dplrw_Z(ij:ik,:,:,:), cospOUT%spwid_Z(ij:ik,:,:,:), & + cospOUT%Zef94_Z(ij:ik,:,:,:), & + cospOUT%dplrw_T(ij:ik,:,:,:), cospOUT%spwid_T(ij:ik,:,:,:), & + cospOUT%Zef94_T(ij:ik,:,:,:), & + cospOUT%ZefVd_2(ij:ik,:,:,:), & + cospOUT%vfall_Z(ij:ik,:,:,:,:), cospOUT%gridw_Z(ij:ik,:,:,:), & + cospOUT%vfall_T(ij:ik,:,:,:,:), cospOUT%gridw_T(ij:ik,:,:,:), & + cospOUT%ZefVf_2(ij:ik,:,:,:,:) ) + end if + endif + + ! MODIS + if (Lmodis_column) then + if (modisIN%nSunlit > 0) then + ! Allocate space for local variables + allocate(modisCftotal(modisIN%nSunlit), modisCfLiquid(modisIN%nSunlit), & + modisCfIce(modisIN%nSunlit),modisCfHigh(modisIN%nSunlit), & + modisCfMid(modisIN%nSunlit),modisCfLow(modisIN%nSunlit), & + modisMeanTauTotal(modisIN%nSunlit), & + modisMeanTauLiquid(modisIN%nSunlit),modisMeanTauIce(modisIN%nSunlit), & + modisMeanLogTauTotal(modisIN%nSunlit), & + modisMeanLogTauLiquid(modisIN%nSunlit), & + modisMeanLogTauIce(modisIN%nSunlit), & + modisMeanSizeLiquid(modisIN%nSunlit), & + modisMeanSizeIce(modisIN%nSunlit), & + modisMeanCloudTopPressure(modisIN%nSunlit), & + modisMeanLiquidWaterPath(modisIN%nSunlit), & + modisMeanIceWaterPath(modisIN%nSunlit), & + modisJointHistogram(modisIN%nSunlit,numMODISTauBins,numMODISPresBins),& + modisJointHistogramIce(modisIN%nSunlit,numModisTauBins,numMODISReffIceBins),& + modisJointHistogramLiq(modisIN%nSunlit,numModisTauBins,numMODISReffLiqBins),& + modisJointHistogram_CtpCodLiq(modisIN%nSunlit,numMODISTauBins,numMODISPresBins),& + modisJointHistogram_CtpCodIce(modisIN%nSunlit,numMODISTauBins,numMODISPresBins),& + modisJointHistogram_LwpRefLiq(modisIN%nSunlit,numMODISLWPBins,numMODISReffLiqBins), & + modisJointHistogram_IwpRefIce(modisIN%nSunlit,numMODISIWPBins,numMODISReffIceBins) & + ) + ! Call simulator + call modis_column(modisIN%nSunlit, modisIN%Ncolumns,modisRetrievedPhase, & + modisRetrievedCloudTopPressure,modisRetrievedTau, & + modisRetrievedSize, modisCfTotal, modisCfLiquid, modisCfIce,& + modisCfHigh, modisCfMid, modisCfLow, modisMeanTauTotal, & + modisMeanTauLiquid, modisMeanTauIce, modisMeanLogTauTotal, & + modisMeanLogTauLiquid, modisMeanLogTauIce, & + modisMeanSizeLiquid, modisMeanSizeIce, & + modisMeanCloudTopPressure, modisMeanLiquidWaterPath, & + modisMeanIceWaterPath, modisJointHistogram, & + modisJointHistogramIce,modisJointHistogramLiq, & + modisJointHistogram_CtpCodLiq, & + modisJointHistogram_CtpCodIce, & + modisJointHistogram_LwpRefLiq, & + modisJointHistogram_IwpRefIce & + ) + ! Store data (if requested) + if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) then + cospOUT%modis_Cloud_Fraction_Total_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisCfTotal + endif + if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) then + cospOUT%modis_Cloud_Fraction_Water_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisCfLiquid + endif + if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) then + cospOUT%modis_Cloud_Fraction_Ice_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisCfIce + endif + if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) then + cospOUT%modis_Cloud_Fraction_High_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisCfHigh + endif + if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) then + cospOUT%modis_Cloud_Fraction_Mid_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisCfMid + endif + if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) then + cospOUT%modis_Cloud_Fraction_Low_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisCfLow + endif + if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) then + cospOUT%modis_Optical_Thickness_Total_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisMeanTauTotal + endif + if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) then + cospOUT%modis_Optical_Thickness_Water_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisMeanTauLiquid + endif + if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) then + cospOUT%modis_Optical_Thickness_Ice_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisMeanTauIce + endif + if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) then + cospOUT%modis_Optical_Thickness_Total_LogMean(ij+int(modisIN%sunlit(:))-1)= & + modisMeanLogTauTotal + endif + if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) then + cospOUT%modis_Optical_Thickness_Water_LogMean(ij+int(modisIN%sunlit(:))-1) = & + modisMeanLogTauLiquid + endif + if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) then + cospOUT%modis_Optical_Thickness_Ice_LogMean(ij+int(modisIN%sunlit(:))-1) = & + modisMeanLogTauIce + endif + if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) then + cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisMeanSizeLiquid + endif + if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) then + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisMeanSizeIce + endif + if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) then + cospOUT%modis_Cloud_Top_Pressure_Total_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisMeanCloudTopPressure + endif + if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) then + cospOUT%modis_Liquid_Water_Path_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisMeanLiquidWaterPath + endif + if (associated(cospOUT%modis_Ice_Water_Path_Mean)) then + cospOUT%modis_Ice_Water_Path_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisMeanIceWaterPath + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) then + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(ij+ & + int(modisIN%sunlit(:))-1, 1:numModisTauBins, :) = modisJointHistogram(:, :, :) + ! Reorder pressure bins in joint histogram to go from surface to TOA + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(ij:ik,:,:) = & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(ij:ik,:,numMODISPresBins:1:-1) + endif + + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) then + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(ij+ & + int(modisIN%sunlit(:))-1, 1:numModisTauBins, :) = modisJointHistogram_CtpCodLiq(:, :, :) + ! Reorder pressure bins in joint histogram to go from surface to TOA + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(ij:ik,:,:) = & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(ij:ik,:,numMODISPresBins:1:-1) + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) then + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(ij+ & + int(modisIN%sunlit(:))-1, 1:numModisTauBins, :) = modisJointHistogram_CtpCodIce(:, :, :) + ! Reorder pressure bins in joint histogram to go from surface to TOA + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(ij:ik,:,:) = & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(ij:ik,:,numMODISPresBins:1:-1) + endif + if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) then + cospOUT%modis_LWP_vs_ReffLIQ(ij+int(modisIN%sunlit(:))-1, 1:numMODISLWPBins,:) = & + modisJointHistogram_LwpRefLiq(:,:,:) + endif + if (associated(cospOUT%modis_IWP_vs_ReffICE)) then + cospOUT%modis_IWP_vs_ReffICE(ij+int(modisIN%sunlit(:))-1, 1:numMODISIWPBins,:) = & + modisJointHistogram_IwpRefIce(:,:,:) + endif + + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffIce)) then + cospOUT%modis_Optical_Thickness_vs_ReffIce(ij:ik,1:numMODISTauBins,:) = 0.0 + cospOUT%modis_Optical_Thickness_vs_ReffIce(ij+int(modisIN%sunlit(:))-1, 1:numMODISTauBins,:) = & + modisJointHistogramIce(:,:,:) + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLiq)) then + cospOUT%modis_Optical_Thickness_vs_ReffLiq(ij:ik,:,:) = 0.0 + cospOUT%modis_Optical_Thickness_vs_ReffLiq(ij+int(modisIN%sunlit(:))-1, 1:numMODISTauBins,:) = & + modisJointHistogramLiq(:,:,:) + endif + + if(modisIN%nSunlit < modisIN%Npoints) then + ! Where it's night and we haven't done the retrievals the values are undefined + if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & + cospOUT%modis_Cloud_Fraction_Total_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & + cospOUT%modis_Cloud_Fraction_Water_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & + cospOUT%modis_Cloud_Fraction_Ice_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & + cospOUT%modis_Cloud_Fraction_High_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & + cospOUT%modis_Cloud_Fraction_Mid_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & + cospOUT%modis_Cloud_Fraction_Low_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & + cospOUT%modis_Optical_Thickness_Total_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & + cospOUT%modis_Optical_Thickness_Water_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & + cospOUT%modis_Optical_Thickness_Ice_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & + cospOUT%modis_Optical_Thickness_Total_LogMean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & + cospOUT%modis_Optical_Thickness_Water_LogMean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & + cospOUT%modis_Optical_Thickness_Ice_LogMean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & + cospOUT%modis_Cloud_Top_Pressure_Total_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & + cospOUT%modis_Liquid_Water_Path_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & + cospOUT%modis_Ice_Water_Path_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(ij+int(modisIN%notSunlit(:))-1, :, :) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(ij+int(modisIN%notSunlit(:))-1, :, :) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(ij+int(modisIN%notSunlit(:))-1, :, :) = R_UNDEF + end if + else + ! It's nightime everywhere - everything is undefined + if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & + cospOUT%modis_Cloud_Fraction_Total_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & + cospOUT%modis_Cloud_Fraction_Water_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & + cospOUT%modis_Cloud_Fraction_Ice_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & + cospOUT%modis_Cloud_Fraction_High_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & + cospOUT%modis_Cloud_Fraction_Mid_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & + cospOUT%modis_Cloud_Fraction_Low_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & + cospOUT%modis_Optical_Thickness_Total_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & + cospOUT%modis_Optical_Thickness_Water_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & + cospOUT%modis_Optical_Thickness_Ice_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & + cospOUT%modis_Optical_Thickness_Total_LogMean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & + cospOUT%modis_Optical_Thickness_Water_LogMean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & + cospOUT%modis_Optical_Thickness_Ice_LogMean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & + cospOUT%modis_Cloud_Top_Pressure_Total_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & + cospOUT%modis_Liquid_Water_Path_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & + cospOUT%modis_Ice_Water_Path_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(ij:ik, :, :) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(ij+int(modisIN%notSunlit(:))-1, :, :) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(ij+int(modisIN%notSunlit(:))-1, :, :) = R_UNDEF + endif + ! Free up memory (if necessary) + if (allocated(modisRetrievedTau)) deallocate(modisRetrievedTau) + if (allocated(modisRetrievedSize)) deallocate(modisRetrievedSize) + if (allocated(modisRetrievedPhase)) deallocate(modisRetrievedPhase) + if (allocated(modisRetrievedCloudTopPressure)) deallocate(modisRetrievedCloudTopPressure) + if (allocated(modisCftotal)) deallocate(modisCftotal) + if (allocated(modisCfLiquid)) deallocate(modisCfLiquid) + if (allocated(modisCfIce)) deallocate(modisCfIce) + if (allocated(modisCfHigh)) deallocate(modisCfHigh) + if (allocated(modisCfMid)) deallocate(modisCfMid) + if (allocated(modisCfLow)) deallocate(modisCfLow) + if (allocated(modisMeanTauTotal)) deallocate(modisMeanTauTotal) + if (allocated(modisMeanTauLiquid)) deallocate(modisMeanTauLiquid) + if (allocated(modisMeanTauIce)) deallocate(modisMeanTauIce) + if (allocated(modisMeanLogTauTotal)) deallocate(modisMeanLogTauTotal) + if (allocated(modisMeanLogTauLiquid)) deallocate(modisMeanLogTauLiquid) + if (allocated(modisMeanLogTauIce)) deallocate(modisMeanLogTauIce) + if (allocated(modisMeanSizeLiquid)) deallocate(modisMeanSizeLiquid) + if (allocated(modisMeanSizeIce)) deallocate(modisMeanSizeIce) + if (allocated(modisMeanCloudTopPressure)) deallocate(modisMeanCloudTopPressure) + if (allocated(modisMeanLiquidWaterPath)) deallocate(modisMeanLiquidWaterPath) + if (allocated(modisMeanIceWaterPath)) deallocate(modisMeanIceWaterPath) + if (allocated(modisJointHistogram)) deallocate(modisJointHistogram) + if (allocated(modisJointHistogram_CtpCodLiq)) deallocate(modisJointHistogram_CtpCodLiq) + if (allocated(modisJointHistogram_CtpCodIce)) deallocate(modisJointHistogram_CtpCodIce) + if (allocated(modisJointHistogram_LwpRefLiq)) deallocate(modisJointHistogram_LwpRefLiq) + if (allocated(modisJointHistogram_IwpRefIce)) deallocate(modisJointHistogram_IwpRefIce) + if (allocated(modisJointHistogramIce)) deallocate(modisJointHistogramIce) + if (allocated(modisJointHistogramLiq)) deallocate(modisJointHistogramLiq) + if (allocated(isccp_boxttop)) deallocate(isccp_boxttop) + if (allocated(isccp_boxptop)) deallocate(isccp_boxptop) + if (allocated(isccp_boxtau)) deallocate(isccp_boxtau) + if (allocated(isccp_meantbclr)) deallocate(isccp_meantbclr) + if (allocated(isccpLEVMATCH)) deallocate(isccpLEVMATCH) + if (allocated(MODIS_SWATH_MASK)) deallocate(MODIS_SWATH_MASK) + endif + + ! RTTOV multi-instrument + if (Lrttov_column) then + do i=1,cospIN%Ninst_rttov + ! Allocate memory for the outputs - I won't need all of these in every situation. + ! Only allocate clear-sky memory when PC-RTTOV is run. + if (cospIN % cfg_rttov(i) % Lrttov_pc) then + allocate(rttov_bt_clear(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! all-sky brightness temp + allocate(rttov_rad_clear(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! all-sky radiance + rttov_bt_clear(:,:) = R_UNDEF + rttov_rad_clear(:,:) = R_UNDEF + ! Run simulator + call cosp_rttov_simulate(rttovIN,cospIN%cfg_rttov(i), & ! Inputs + cosp_simulator(nError+1), & ! Error message holder + bt_clear=rttov_bt_clear, & ! Clear-sky BT + rad_clear=rttov_rad_clear) ! Clear-sky radiance + else + allocate(rttov_bt_total(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! all-sky brightness temp + allocate(rttov_bt_clear(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! clear-sky brightness temp + allocate(rttov_rad_total(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! all-sky brightness temp + allocate(rttov_rad_clear(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! clear-sky brightness temp + allocate(rttov_rad_cloudy(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! cloudy-sky brightness temp + allocate(rttov_refl_total(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! all-sky Bi-directional reflectance factor + allocate(rttov_refl_clear(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! clear-sky Bi-directional reflectance factor + ! Init to R_UNDEF + rttov_bt_total(:,:) = R_UNDEF + rttov_bt_clear(:,:) = R_UNDEF + rttov_rad_total(:,:) = R_UNDEF + rttov_rad_clear(:,:) = R_UNDEF + rttov_rad_cloudy(:,:) = R_UNDEF + rttov_refl_total(:,:) = R_UNDEF + rttov_refl_clear(:,:) = R_UNDEF + ! Run simulator + call cosp_rttov_simulate(rttovIN,cospIN%cfg_rttov(i), & ! Inputs + cosp_simulator(nError+1), & ! Error message holder + bt_total=rttov_bt_total, & ! Brightness Temp Outputs + bt_clear=rttov_bt_clear, & + rad_total=rttov_rad_total, & ! Radiance Outputs + rad_clear=rttov_rad_clear, & + rad_cloudy=rttov_rad_cloudy, & + refl_total=rttov_refl_total, & ! Reflectance Outputs + refl_clear=rttov_refl_clear, & + debug=verbose) + endif + + ! Write to cospOUT + if (associated(cospOUT % rttov_outputs(i) % channel_indices)) & + cospOUT % rttov_outputs(i) % channel_indices(:) = cospIN % cfg_rttov(i) % iChannel + if (cospIN % cfg_rttov(i) % Lrttov_pc) then + if (associated(cospOUT % rttov_outputs(i) % bt_total_pc)) & + cospOUT % rttov_outputs(i) % bt_total_pc(ij:ik,:) = rttov_bt_clear + if (associated(cospOUT % rttov_outputs(i) % rad_total_pc)) & + cospOUT % rttov_outputs(i) % rad_total_pc(ij:ik,:) = rttov_rad_clear + else + if (associated(cospOUT % rttov_outputs(i) % bt_total)) & + cospOUT % rttov_outputs(i) % bt_total(ij:ik,:) = rttov_bt_total + if (associated(cospOUT % rttov_outputs(i) % bt_clear)) & + cospOUT % rttov_outputs(i) % bt_clear(ij:ik,:) = rttov_bt_clear + if (associated(cospOUT % rttov_outputs(i) % rad_total)) & + cospOUT % rttov_outputs(i) % rad_total(ij:ik,:) = rttov_rad_total + if (associated(cospOUT % rttov_outputs(i) % rad_clear)) & + cospOUT % rttov_outputs(i) % rad_clear(ij:ik,:) = rttov_rad_clear + if (associated(cospOUT % rttov_outputs(i) % rad_cloudy)) & + cospOUT % rttov_outputs(i) % rad_cloudy(ij:ik,:) = rttov_rad_cloudy + if (associated(cospOUT % rttov_outputs(i) % refl_total)) & + cospOUT % rttov_outputs(i) % refl_total(ij:ik,:) = rttov_refl_total + if (associated(cospOUT % rttov_outputs(i) % refl_clear)) & + cospOUT % rttov_outputs(i) % refl_clear(ij:ik,:) = rttov_refl_clear + endif + + ! Free up memory from output (if necessary) + if (allocated(rttov_bt_total)) deallocate(rttov_bt_total) + if (allocated(rttov_bt_clear)) deallocate(rttov_bt_clear) + if (allocated(rttov_rad_total)) deallocate(rttov_rad_total) + if (allocated(rttov_rad_clear)) deallocate(rttov_rad_clear) + if (allocated(rttov_rad_cloudy)) deallocate(rttov_rad_cloudy) + if (allocated(rttov_refl_total)) deallocate(rttov_refl_total) + if (allocated(rttov_refl_clear)) deallocate(rttov_refl_clear) + + end do + + endif + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! 6) Compute multi-instrument products + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + ! CLOUDSAT/CALIPSO products + if (Lradar_lidar_tcc .or. Llidar_only_freq_cloud .or. Lcloudsat_tcc .or. Lcloudsat_tcc2) then + if (calipsoIN%Npoints .gt. 0) then + if (use_vgrid) then + allocate(lidar_only_freq_cloud(cloudsatIN%Npoints,Nlvgrid), & + radar_lidar_tcc(cloudsatIN%Npoints), cloudsat_tcc(cloudsatIN%Npoints), & + cloudsat_tcc2(cloudsatIN%Npoints)) + allocate(betamol_in(cloudsatIN%Npoints,1,cloudsatIN%Nlevels), & + betamolI(cloudsatIN%Npoints,1,Nlvgrid), & + pnormI(cloudsatIN%Npoints,cloudsatIN%Ncolumns,Nlvgrid), & + Ze_totI(cloudsatIN%Npoints,cloudsatIN%Ncolumns,Nlvgrid)) + + ! Regrid in the vertical (*NOTE* This routine requires SFC-2-TOA ordering, so flip + ! inputs and outputs to maintain TOA-2-SFC ordering convention in COSP2.) + ! Use CLOUDSAT masking array here (it is the same as calipso) + if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + betamol_in(:,1,:) = calipso_beta_mol(:,cloudsatIN%Nlevels:1:-1) + call cosp_change_vertical_grid(cloudsatIN%Npoints,1,cloudsatIN%Nlevels, & + cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & + cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1),betamol_in, & + Nlvgrid,vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1), & + betamolI(:,1,Nlvgrid:1:-1)) + call cosp_change_vertical_grid(cloudsatIN%Npoints,cloudsatIN%Ncolumns, & + cloudsatIN%Nlevels,cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & + cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & + calipso_beta_tot(:,:,cloudsatIN%Nlevels:1:-1),Nlvgrid, & + vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1),pnormI(:,:,Nlvgrid:1:-1)) + call cosp_change_vertical_grid(cloudsatIN%Npoints,cloudsatIN%Ncolumns, & + cloudsatIN%Nlevels,cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & + cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & + cloudsatDBZe(:,:,cloudsatIN%Nlevels:1:-1),Nlvgrid,vgrid_zl(Nlvgrid:1:-1), & + vgrid_zu(Nlvgrid:1:-1),Ze_totI(:,:,Nlvgrid:1:-1),log_units=.true.) + else + betamol_in(:,1,:) = calipso_beta_mol(:,cloudsatIN%Nlevels:1:-1) + call cosp_change_vertical_grid(cloudsatIN%Npoints,1,cloudsatIN%Nlevels, & + cospgridIN%hgt_matrix(:,cloudsatIN%Nlevels:1:-1), & + cospgridIN%hgt_matrix_half(:,cloudsatIN%Nlevels:1:-1),betamol_in, & + Nlvgrid,vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1), & + betamolI(:,1,Nlvgrid:1:-1)) + + call cosp_change_vertical_grid(cloudsatIN%Npoints,cloudsatIN%Ncolumns, & + cloudsatIN%Nlevels,cospgridIN%hgt_matrix(:,cloudsatIN%Nlevels:1:-1), & + cospgridIN%hgt_matrix_half(:,cloudsatIN%Nlevels:1:-1), & + calipso_beta_tot(:,:,cloudsatIN%Nlevels:1:-1),Nlvgrid, & + vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1),pnormI(:,:,Nlvgrid:1:-1)) + + call cosp_change_vertical_grid(cloudsatIN%Npoints,cloudsatIN%Ncolumns, & + cloudsatIN%Nlevels,cospgridIN%hgt_matrix(:,cloudsatIN%Nlevels:1:-1), & + cospgridIN%hgt_matrix_half(:,cloudsatIN%Nlevels:1:-1), & + cloudsatDBZe(:,:,cloudsatIN%Nlevels:1:-1),Nlvgrid,vgrid_zl(Nlvgrid:1:-1), & + vgrid_zu(Nlvgrid:1:-1),Ze_totI(:,:,Nlvgrid:1:-1),log_units=.true.) + end if + call cosp_lidar_only_cloud(cloudsatIN%Npoints, cloudsatIN%Ncolumns, Nlvgrid, & + pnormI, betamolI, Ze_totI, lidar_only_freq_cloud, radar_lidar_tcc, & + cloudsat_tcc, cloudsat_tcc2) + deallocate(betamol_in,betamolI,pnormI,ze_totI) + else + allocate(lidar_only_freq_cloud(cloudsatIN%Npoints,cloudsatIN%Nlevels), & + radar_lidar_tcc(cloudsatIN%Npoints), cloudsat_tcc(cloudsatIN%Npoints), & + cloudsat_tcc2(cloudsatIN%Npoints)) + call cosp_lidar_only_cloud(cloudsatIN%Npoints,cloudsatIN%Ncolumns, & + cospIN%Nlevels,calipso_beta_tot(:,:,cloudsatIN%Nlevels:1:-1), & + calipso_beta_mol(:,cloudsatIN%Nlevels:1:-1), & + cloudsatDBZe(:,:,cloudsatIN%Nlevels:1:-1),lidar_only_freq_cloud, & + radar_lidar_tcc, cloudsat_tcc, cloudsat_tcc2) + endif + endif + + ! Store, when necessary + if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + if (associated(cospOUT%lidar_only_freq_cloud)) then + cospOUT%lidar_only_freq_cloud(ij:ik,:) = R_UNDEF + cospOUT%lidar_only_freq_cloud(ij+int(CSCAL_MASK_INDICES(:))-1,:) = lidar_only_freq_cloud(:,:) + endif + if (associated(cospOUT%radar_lidar_tcc)) then + cospOUT%radar_lidar_tcc(ij:ik) = R_UNDEF + cospOUT%radar_lidar_tcc(ij+int(CSCAL_MASK_INDICES(:))-1) = radar_lidar_tcc(:) + endif + if (associated(cospOUT%cloudsat_tcc)) then + cospOUT%cloudsat_tcc(ij:ik) = R_UNDEF + cospOUT%cloudsat_tcc(ij+int(CSCAL_MASK_INDICES(:))-1) = cloudsat_tcc(:) + endif + if (associated(cospOUT%cloudsat_tcc2)) then + cospOUT%cloudsat_tcc2(ij:ik) = R_UNDEF + cospOUT%cloudsat_tcc2(ij+int(CSCAL_MASK_INDICES(:))-1) = cloudsat_tcc2(:) + endif + else + if (associated(cospOUT%lidar_only_freq_cloud)) then + cospOUT%lidar_only_freq_cloud(ij:ik,:) = lidar_only_freq_cloud + endif + if (associated(cospOUT%radar_lidar_tcc)) then + cospOUT%radar_lidar_tcc(ij:ik) = radar_lidar_tcc + endif + if (associated(cospOUT%cloudsat_tcc)) then + cospOUT%cloudsat_tcc(ij:ik) = cloudsat_tcc + endif + if (associated(cospOUT%cloudsat_tcc2)) then + cospOUT%cloudsat_tcc2(ij:ik) = cloudsat_tcc2 + endif + endif + endif + + ! CloudSat/MODIS joint products (CFODDs and Occurrence Frequency of Warm Clouds) + if (Lcloudsat_modis_wr) then + if (cloudsatIN%Npoints .gt. 0) then + allocate( cfodd_ntotal(cloudsatIN%Npoints, CFODD_NDBZE, CFODD_NICOD, CFODD_NCLASS) ) + allocate( wr_occfreq_ntotal(cloudsatIN%Npoints, WR_NREGIME) ) + + if ( use_vgrid ) then + !! interporation for fixed vertical grid: + allocate( zlev(cloudsatIN%Npoints,Nlvgrid), & + t_in(cloudsatIN%Npoints,1,cloudsatIN%Nlevels), & + tempI(cloudsatIN%Npoints,1,Nlvgrid), & + Ze_totI(cloudsatIN%Npoints,cloudsatIN%Ncolumns,Nlvgrid), & + frac_outI(cloudsatIN%Npoints,cloudsatIN%Ncolumns,Nlvgrid) ) + do k = 1, Nlvgrid + zlev(:,k) = vgrid_zu(k) + enddo + ! Use CLOUDSAT masking array here (it is the same as calipso) + if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + t_in(:,1,:) = cospgridIN%at(int(CSCAL_MASK_INDICES(:)),:) + call cosp_change_vertical_grid ( & + cloudsatIN%Npoints, 1, cloudsatIN%Nlevels, & + cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & + cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & + t_in(:,:,cloudsatIN%Nlevels:1:-1), Nlvgrid, & + vgrid_zl(Nlvgrid:1:-1), vgrid_zu(Nlvgrid:1:-1), & + tempI(:,:,Nlvgrid:1:-1) ) + call cosp_change_vertical_grid ( & + cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels, & + cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & + cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & + cloudsatDBZe(:,:,cloudsatIN%Nlevels:1:-1), Nlvgrid, & + vgrid_zl(Nlvgrid:1:-1), vgrid_zu(Nlvgrid:1:-1), & + Ze_totI(:,:,Nlvgrid:1:-1), log_units=.true. ) + call cosp_change_vertical_grid ( & + cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels, & + cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & + cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & + cospIN%frac_out(int(CSCAL_MASK_INDICES(:)),:,cloudsatIN%Nlevels:1:-1), Nlvgrid, & + vgrid_zl(Nlvgrid:1:-1), vgrid_zu(Nlvgrid:1:-1), & + frac_outI(:,:,Nlvgrid:1:-1) ) + call cosp_diag_warmrain( & + cloudsatIN%Npoints, cloudsatIN%Ncolumns, Nlvgrid, & !! in + tempI, zlev, & !! in + cospOUT%modis_Liquid_Water_Path_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Optical_Thickness_Water_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Cloud_Fraction_Water_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Ice_Water_Path_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Optical_Thickness_Ice_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Cloud_Fraction_Ice_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + frac_outI, & !! in + Ze_totI, & !! in + cfodd_ntotal, wr_occfreq_ntotal ) !! inout + else + t_in(:,1,:) = cospgridIN%at(:,:) + call cosp_change_vertical_grid ( & + cloudsatIN%Npoints, 1, cloudsatIN%Nlevels, & + cospgridIN%hgt_matrix(:,cloudsatIN%Nlevels:1:-1), & + cospgridIN%hgt_matrix_half(:,cloudsatIN%Nlevels:1:-1), & + t_in(:,:,cloudsatIN%Nlevels:1:-1), Nlvgrid, & + vgrid_zl(Nlvgrid:1:-1), vgrid_zu(Nlvgrid:1:-1), & + tempI(:,:,Nlvgrid:1:-1) ) + call cosp_change_vertical_grid ( & + cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels, & + cospgridIN%hgt_matrix(:,cloudsatIN%Nlevels:1:-1), & + cospgridIN%hgt_matrix_half(:,cloudsatIN%Nlevels:1:-1), & + cloudsatDBZe(:,:,cloudsatIN%Nlevels:1:-1), Nlvgrid, & + vgrid_zl(Nlvgrid:1:-1), vgrid_zu(Nlvgrid:1:-1), & + Ze_totI(:,:,Nlvgrid:1:-1), log_units=.true. ) + call cosp_change_vertical_grid ( & + cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels, & + cospgridIN%hgt_matrix(:,cloudsatIN%Nlevels:1:-1), & + cospgridIN%hgt_matrix_half(:,cloudsatIN%Nlevels:1:-1), & + cospIN%frac_out(:,:,cloudsatIN%Nlevels:1:-1), Nlvgrid, & + vgrid_zl(Nlvgrid:1:-1), vgrid_zu(Nlvgrid:1:-1), & + frac_outI(:,:,Nlvgrid:1:-1) ) + call cosp_diag_warmrain( & + cloudsatIN%Npoints, cloudsatIN%Ncolumns, Nlvgrid, & !! in + tempI, zlev, & !! in + cospOUT%modis_Liquid_Water_Path_Mean(ij:ik), & !! in + cospOUT%modis_Optical_Thickness_Water_Mean(ij:ik), & !! in + cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij:ik), & !! in + cospOUT%modis_Cloud_Fraction_Water_Mean(ij:ik), & !! in + cospOUT%modis_Ice_Water_Path_Mean(ij:ik), & !! in + cospOUT%modis_Optical_Thickness_Ice_Mean(ij:ik), & !! in + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij:ik), & !! in + cospOUT%modis_Cloud_Fraction_Ice_Mean(ij:ik), & !! in + frac_outI, & !! in + Ze_totI, & !! in + cfodd_ntotal, wr_occfreq_ntotal ) !! inout + endif + deallocate( zlev, t_in, tempI, frac_outI, Ze_totI ) + else ! do not use vgrid interporation ---------------------------------------! + !! original model grid + if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + call cosp_diag_warmrain( & + cloudsatIN%Npoints, cloudsatIN%Ncolumns, cospIN%Nlevels, & !! in + cospgridIN%at(int(CSCAL_MASK_INDICES(:)),:), & !! in + cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),:), & !! in + cospOUT%modis_Liquid_Water_Path_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Optical_Thickness_Water_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Cloud_Fraction_Water_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Ice_Water_Path_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Optical_Thickness_Ice_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Cloud_Fraction_Ice_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospIN%frac_out(int(CSCAL_MASK_INDICES(:)),:,:), & !! in + cloudsatDBZe, & !! in + cfodd_ntotal, wr_occfreq_ntotal ) !! inout + else + call cosp_diag_warmrain( & + cloudsatIN%Npoints, cloudsatIN%Ncolumns, cospIN%Nlevels, & !! in + cospgridIN%at, cospgridIN%hgt_matrix, & !! in + cospOUT%modis_Liquid_Water_Path_Mean(ij:ik), & !! in + cospOUT%modis_Optical_Thickness_Water_Mean(ij:ik), & !! in + cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij:ik), & !! in + cospOUT%modis_Cloud_Fraction_Water_Mean(ij:ik), & !! in + cospOUT%modis_Ice_Water_Path_Mean(ij:ik), & !! in + cospOUT%modis_Optical_Thickness_Ice_Mean(ij:ik), & !! in + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij:ik), & !! in + cospOUT%modis_Cloud_Fraction_Ice_Mean(ij:ik), & !! in + cospIN%frac_out, & !! in + cloudsatDBZe, & !! in + cfodd_ntotal, wr_occfreq_ntotal ) !! inout + endif + endif !! use_vgrid or not + + ! Store, when necessary + if (associated(cospOUT%lidar_only_freq_cloud)) then + if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + cospOUT%lidar_only_freq_cloud(ij+int(CSCAL_MASK_INDICES(:))-1,:) = lidar_only_freq_cloud(:,:) + else + cospOUT%lidar_only_freq_cloud(ij:ik,:) = lidar_only_freq_cloud + endif + endif + + if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays for CSCAL + if (cospIN % cospswathsIN(6) % N_inst_swaths .gt. 0) then ! If MODIS is also swathed then use the joint mask MODIS_CSCAL_MASK_INDICES for setting R_UNDEF + if ( associated(cospOUT%cfodd_ntotal) ) then + cospOUT%cfodd_ntotal(ij+int(CSCAL_MASK_INDICES(:))-1,:,:,:) = cfodd_ntotal + cospOUT%cfodd_ntotal(ij+int(MODIS_CSCAL_MASK_INDICES(:))-1,:,:,:) = R_UNDEF + endif + if ( associated(cospOUT%wr_occfreq_ntotal) ) then + cospOUT%wr_occfreq_ntotal(ij+int(CSCAL_MASK_INDICES(:))-1,:) = wr_occfreq_ntotal + cospOUT%wr_occfreq_ntotal(ij+int(MODIS_CSCAL_MASK_INDICES(:))-1,:) = R_UNDEF + endif + else + if ( associated(cospOUT%cfodd_ntotal) ) then + cospOUT%cfodd_ntotal(ij:ik,:,:,:) = R_UNDEF + cospOUT%cfodd_ntotal(ij+int(CSCAL_MASK_INDICES(:))-1,:,:,:) = cfodd_ntotal + endif + if ( associated(cospOUT%wr_occfreq_ntotal) ) then + cospOUT%wr_occfreq_ntotal(ij:ik,:) = R_UNDEF + cospOUT%wr_occfreq_ntotal(ij+int(CSCAL_MASK_INDICES(:))-1,:) = wr_occfreq_ntotal + endif + endif + else + if ( associated(cospOUT%cfodd_ntotal) ) then + cospOUT%cfodd_ntotal(ij:ik,:,:,:) = cfodd_ntotal + endif + if ( associated(cospOUT%wr_occfreq_ntotal) ) then + cospOUT%wr_occfreq_ntotal(ij:ik,:) = wr_occfreq_ntotal + endif + endif + else + if ( associated(cospOUT%cfodd_ntotal) ) cospOUT%cfodd_ntotal(ij:ik,:,:,:) = R_UNDEF + if ( associated(cospOUT%wr_occfreq_ntotal) ) cospOUT%wr_occfreq_ntotal(ij:ik,:) = R_UNDEF + endif + endif + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! 7) Cleanup + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (Lisccp_subcolumn .or. Lmodis_subcolumn) then + nullify(isccpIN%Ncolumns,isccpIN%Nlevels,isccpIN%emsfc_lw, & + isccpIN%skt,isccpIN%qv,isccpIN%at,isccpIN%frac_out,isccpIN%dtau, & + isccpIN%dem,isccpIN%phalf,isccpIN%sunlit,isccpIN%pfull) + call COSP_ASSIGN_isccpIN_CLEAN() + endif + + if (Lmisr_subcolumn) then + nullify(misrIN%Ncolumns,misrIN%Nlevels,misrIN%dtau,misrIN%sunlit, & + misrIN%zfull,misrIN%at) + call COSP_ASSIGN_misrIN_CLEAN() + endif + + if (Lcalipso_subcolumn) then + nullify(calipsoIN%Ncolumns,calipsoIN%Nlevels,calipsoIN%beta_mol,& + calipsoIN%betatot,calipsoIN%betatot_liq,calipsoIN%betatot_ice, & + calipsoIN%tau_mol,calipsoIN%tautot,calipsoIN%tautot_liq,calipsoIN%tautot_ice) + if (allocated(CSCAL_MASK_INDICES)) deallocate(CSCAL_MASK_INDICES) + if (allocated(CSCAL_SWATH_MASK)) deallocate(CSCAL_SWATH_MASK) + call COSP_ASSIGN_calipsoIN_CLEAN() + endif + + if (LgrLidar532_subcolumn) then + nullify(grLidar532IN%Npoints,grLidar532IN%Ncolumns,grLidar532IN%Nlevels,grLidar532IN%beta_mol, & + grLidar532IN%betatot,grLidar532IN%tau_mol,grLidar532IN%tautot) + endif + + if (Latlid_subcolumn) then + nullify(atlidIN%Ncolumns,atlidIN%Nlevels,atlidIN%beta_mol_atlid, & + atlidIN%betatot_atlid,atlidIN%tau_mol_atlid,atlidIN%tautot_atlid) + call COSP_ASSIGN_atlidIN_CLEAN() + endif + + if (Lparasol_subcolumn) then + nullify(parasolIN%Nlevels,parasolIN%Ncolumns,parasolIN%Nrefl, & + parasolIN%tautot_S_liq,parasolIN%tautot_S_ice) + call COSP_ASSIGN_parasolIN_CLEAN() + endif + + if (Lcloudsat_subcolumn) then + nullify(cloudsatIN%Nlevels,cloudsatIN%Ncolumns,cloudsatIN%rcfg,& + cloudsatIN%kr_vol,cloudsatIN%g_vol,cloudsatIN%z_vol,cloudsatIN%hgt_matrix) + call COSP_ASSIGN_cloudsatIN_CLEAN() + if (allocated(CSCAL_MASK_INDICES)) deallocate(CSCAL_MASK_INDICES) + if (allocated(CSCAL_SWATH_MASK)) deallocate(CSCAL_SWATH_MASK) + endif + + if (Lmodis_subcolumn) then + nullify(modisIN%Npoints,modisIN%Ncolumns,modisIN%Nlevels,modisIN%tau,modisIN%g, & + modisIN%liqFrac,modisIN%w0) + if (allocated(modisIN%sunlit)) deallocate(modisIN%sunlit) + if (allocated(modisIN%notSunlit)) deallocate(modisIN%notSunlit) + if (allocated(modisIN%pres)) deallocate(modisIN%pres) + if (allocated(MODIS_CSCAL_MASK_INDICES)) deallocate(MODIS_CSCAL_MASK_INDICES) + endif + + if (Lrttov_column) then + nullify(rttovIN%nPoints,rttovIN%nLevels,rttovIN%nSubCols,rttovIN%co2,rttovIN%ch4, & + rttovIN%n2o,rttovIN%co,rttovIN%h_surf,rttovIN%u_surf,rttovIN%v_surf, & + rttovIN%t_skin,rttovIN%p_surf,rttovIN%sfcmask,rttovIN%latitude, & + rttovIN%longitude,rttovIN%p,rttovIN%ph,rttovIN%q2m,rttovIN%t2m,rttovIN%t, & + rttovIN%q,rttovIN%o3,rttovIN%rttov_date,rttovIN%rttov_time,rttovIN%tca, & + rttovIN%cldLiq,rttovIN%cldIce,rttovIN%DeffLiq,rttovIN%DeffIce, & + rttovIN%fl_rain,rttovIN%fl_snow) + endif + + if (allocated(calipso_beta_tot)) deallocate(calipso_beta_tot) + if (allocated(grLidar532_beta_tot)) deallocate(grLidar532_beta_tot) + if (allocated(atlid_beta_tot)) deallocate(atlid_beta_tot) + if (allocated(calipso_beta_mol)) deallocate(calipso_beta_mol) + if (allocated(grLidar532_beta_mol)) deallocate(grLidar532_beta_mol) + if (allocated(atlid_beta_mol)) deallocate(atlid_beta_mol) + if (allocated(calipso_betaperp_tot)) deallocate(calipso_betaperp_tot) + if (allocated(cloudsatDBZe)) deallocate(cloudsatDBZe) + if (allocated(lidar_only_freq_cloud)) deallocate(lidar_only_freq_cloud) + if (allocated(radar_lidar_tcc)) deallocate(radar_lidar_tcc) + if (allocated(cloudsat_tcc)) deallocate(cloudsat_tcc) + if (allocated(cloudsat_tcc2)) deallocate(cloudsat_tcc2) + if (allocated(cfodd_ntotal)) deallocate(cfodd_ntotal) + if (allocated(wr_occfreq_ntotal)) deallocate(wr_occfreq_ntotal) + + end function COSP_SIMULATOR + ! ###################################################################################### + ! SUBROUTINE cosp_init + ! ###################################################################################### + SUBROUTINE COSP_INIT(Lisccp, Lmodis, Lmisr, Lcloudsat, Lcalipso, LgrLidar532, Latlid, Lparasol, Lrttov, & + cloudsat_radar_freq, cloudsat_k2, cloudsat_use_gas_abs, cloudsat_do_ray, & + isccp_top_height, isccp_top_height_direction, surface_radar, rcfg, lusevgrid, & + luseCSATvgrid, Nvgrid, Nlevels, cloudsat_micro_scheme, & + rttov_Ninstruments, rttov_instrument_namelists,rttov_configs,unitn,debug) + + ! INPUTS + logical,intent(in) :: Lisccp,Lmodis,Lmisr,Lcloudsat,Lcalipso,LgrLidar532,Latlid,Lparasol + logical,intent(inout) :: Lrttov + integer,intent(in) :: & + cloudsat_use_gas_abs, & ! + cloudsat_do_ray, & ! + isccp_top_height, & ! + isccp_top_height_direction, & ! + Nlevels, & ! + Nvgrid, & ! Number of levels for new L3 grid + surface_radar, & ! + rttov_Ninstruments + real(wp),intent(in) :: & + cloudsat_radar_freq, & ! + cloudsat_k2 ! + logical,intent(in) :: & + lusevgrid, & ! Switch to use different vertical grid + luseCSATvgrid ! Switch to use CLOUDSAT grid spacing for new + ! vertical grid + character(len=64),intent(in) :: & + cloudsat_micro_scheme ! Microphysical scheme used by CLOUDSAT + + type(character(len=256)), dimension(rttov_Ninstruments) :: & + rttov_instrument_namelists ! Array of paths to RTTOV instrument namelists + + ! OUTPUTS + type(radar_cfg) :: rcfg + type(rttov_cfg), dimension(:), allocatable,intent(inout) :: rttov_configs + + ! Optional args + integer,intent(in),Optional :: unitn ! Used for io limits + logical,intent(in),Optional :: debug + logical :: verbose = .false. + + ! Local variables + integer :: i + real(wp) :: zstep + + ! Init debug print statements: + if (present(debug)) verbose = debug + + ! Initialize MODIS optical-depth bin boundaries for joint-histogram. (defined in cosp_config.F90) + if (.not. allocated(modis_histTau)) then + allocate(modis_histTau(ntau+1),modis_histTauEdges(2,ntau),modis_histTauCenters(ntau)) + numMODISTauBins = ntau + modis_histTau = tau_binBounds + modis_histTauEdges = tau_binEdges + modis_histTauCenters = tau_binCenters + endif + + ! Set up vertical grid used by CALIPSO and CLOUDSAT L3 + use_vgrid = lusevgrid + + if (use_vgrid) then + Nlvgrid = Nvgrid + allocate(vgrid_zl(Nlvgrid),vgrid_zu(Nlvgrid),vgrid_z(Nlvgrid),dz(Nlvgrid)) + ! CloudSat grid requested + if (luseCSATvgrid) zstep = 480._wp + ! Other grid requested. Constant vertical spacing with top at 20 km + if (.not. luseCSATvgrid) zstep = 20000._wp/Nvgrid + do i=1,Nvgrid + vgrid_zl(Nlvgrid-i+1) = (i-1)*zstep + vgrid_zu(Nlvgrid-i+1) = i*zstep + enddo + vgrid_z = (vgrid_zl+vgrid_zu)/2._wp + dz = zstep + else + Nlvgrid = Nlevels + allocate(vgrid_zl(Nlvgrid),vgrid_zu(Nlvgrid),vgrid_z(Nlvgrid),dz(Nlvgrid)) + vgrid_zl = 0._wp + vgrid_zu = 0._wp + vgrid_z = 0._wp + dz = 0._wp + endif + + ! Initialize simulators + if (Lisccp) call cosp_isccp_init(isccp_top_height,isccp_top_height_direction) + if (Lmodis) call cosp_modis_init() + if (Lmisr) call cosp_misr_init() + + if (Lrttov) then + if (present(unitn)) then + call cosp_rttov_init(Lrttov,Nlevels,rttov_Ninstruments, & + rttov_instrument_namelists, & + rttov_configs,unitn=unitn, & + debug=verbose) + else + call cosp_rttov_init(Lrttov,Nlevels,rttov_Ninstruments, & + rttov_instrument_namelists, & + rttov_configs,debug=verbose) + end if + endif + + if (Lcloudsat) call cosp_cloudsat_init(cloudsat_radar_freq,cloudsat_k2, & + cloudsat_use_gas_abs,cloudsat_do_ray,R_UNDEF,N_HYDRO, surface_radar, & + rcfg,cloudsat_micro_scheme) + if (Lcalipso) call cosp_calipso_init() + if (LgrLidar532) call cosp_grLidar532_init() + if (Latlid) call cosp_atlid_init() + if (Lparasol) call cosp_parasol_init() + + linitialization = .FALSE. + END SUBROUTINE COSP_INIT + + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE cosp_errorCheck + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + subroutine cosp_errorCheck(cospgridIN, cospIN, Lisccp_subcolumn, Lisccp_column, & + Lmisr_subcolumn, Lmisr_column, Lmodis_subcolumn, Lmodis_column, Lcloudsat_subcolumn, & + Lcloudsat_column, Lcalipso_subcolumn, Lcalipso_column, Latlid_subcolumn, & + Latlid_column, LgrLidar532_subcolumn, LgrLidar532_column, & + Lrttov_column, Lparasol_subcolumn, Lparasol_column, Lradar_lidar_tcc, & + Llidar_only_freq_cloud, Lcloudsat_tcc, Lcloudsat_tcc2, Lcloudsat_modis_wr, & + cospOUT, errorMessage, nError) + + ! Inputs + type(cosp_column_inputs),intent(in) :: & + cospgridIN ! Model grid inputs to COSP + type(cosp_optical_inputs),intent(in) :: & + cospIN ! Derived (optical) input to COSP + + ! Outputs + logical,intent(inout) :: & + Lisccp_subcolumn, & ! ISCCP subcolumn simulator on/off switch + Lisccp_column, & ! ISCCP column simulator on/off switch + Lmisr_subcolumn, & ! MISR subcolumn simulator on/off switch + Lmisr_column, & ! MISR column simulator on/off switch + Lmodis_subcolumn, & ! MODIS subcolumn simulator on/off switch + Lmodis_column, & ! MODIS column simulator on/off switch + Lcloudsat_subcolumn, & ! CLOUDSAT subcolumn simulator on/off switch + Lcloudsat_column, & ! CLOUDSAT column simulator on/off switch + Lcalipso_subcolumn, & ! CALIPSO subcolumn simulator on/off switch + Lcalipso_column, & ! CALIPSO column simulator on/off switch + Latlid_subcolumn, & ! EarthCare subcolumn simulator on/off switch + Latlid_column, & ! EarthCare column simulator on/off switch + LgrLidar532_subcolumn, & ! Ground Lidar subcolumn simulator on/off switch + LgrLidar532_column, & ! Ground Lidar column simulator on/off switch + Lparasol_subcolumn, & ! PARASOL subcolumn simulator on/off switch + Lparasol_column, & ! PARASOL column simulator on/off switch + Lrttov_column, & ! RTTOV column simulator on/off switch + Lcloudsat_tcc, & ! + Lcloudsat_tcc2, & ! + Lradar_lidar_tcc, & ! On/Off switch for joint Calipso/Cloudsat product + Llidar_only_freq_cloud, & ! On/Off switch for joint Calipso/Cloudsat product + Lcloudsat_modis_wr ! On/Off switch for joint CloudSat/MODIS warm rain product + type(cosp_outputs),intent(inout) :: & + cospOUT ! COSP Outputs + character(len=256),dimension(100) :: errorMessage + integer,intent(out) :: nError + + ! Local variables + logical :: alloc_status + integer :: i + + nError = 0 + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! PART 0: Ensure that the inputs needed by the requested simulators are allocated. + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! ISCCP simulator + if (Lisccp_subcolumn .or. Lisccp_column) then + alloc_status = .true. + if (.not. allocated(cospgridIN%skt)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospgridIN%skt has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%qv)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospgridIN%qv has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%at)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospgridIN%at has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%frac_out)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospIN%frac_out has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%tau_067)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospIN%tau_067 has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%emiss_11)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospIN%emiss_11 has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%phalf)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospgridIN%phalf has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%sunlit)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospgridIN%sunlit has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%pfull)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospgridIN%pfull has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + Lisccp_subcolumn = .false. + Lisccp_column = .false. + if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF + if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF + if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF + if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF + if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF + if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF + if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF + if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF + if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF + endif + endif + + ! MISR simulator + if (Lmisr_subcolumn .or. Lmisr_column) then + alloc_status = .true. + if (.not. allocated(cospIN%tau_067)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (MISR simulator): cospIN%tau_067 has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%sunlit)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (MISR simulator): cospgridIN%sunlit has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%hgt_matrix)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (MISR simulator): cospgridIN%hgt_matrix has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%at)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (MISR simulator): cospgridIN%at has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + Lmisr_subcolumn = .false. + Lmisr_column = .false. + if (associated(cospOUT%misr_fq)) cospOUT%misr_fq(:,:,:) = R_UNDEF + if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(:,:) = R_UNDEF + if (associated(cospOUT%misr_meanztop)) cospOUT%misr_meanztop(:) = R_UNDEF + if (associated(cospOUT%misr_cldarea)) cospOUT%misr_cldarea(:) = R_UNDEF + endif + endif + + ! EarthCare Lidar simulator. + if (Latlid_subcolumn .or. Latlid_column) then + alloc_status = .true. + if (.not. allocated(cospIN%beta_mol_atlid)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospIN%beta_mol_atlid has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%betatot_atlid)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospIN%betatot_atlid has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%tau_mol_atlid)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospIN%tau_mol_atlid has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%tautot_atlid)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospIN%tautot_atlid has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + Latlid_subcolumn = .false. + Latlid_column = .false. + if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%atlid_beta_mol)) cospOUT%atlid_beta_mol(:,:) = R_UNDEF + if (associated(cospOUT%atlid_beta_tot)) cospOUT%atlid_beta_tot(:,:,:) = R_UNDEF + endif + + ! EarthCare column simulator requires additional inputs not required by the subcolumn simulator. + alloc_status = .true. + if (.not. allocated(cospgridIN%hgt_matrix)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospgridIN%hgt_matrix has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%hgt_matrix_half)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospgridIN%hgt_matrix_half has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%phalf)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospgridIN%phalf has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + Latlid_column = .false. + if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF + endif + endif + + ! Ground Lidar simulator. + if (LgrLidar532_subcolumn .or. LgrLidar532_column) then + alloc_status = .true. + if (.not. allocated(cospIN%beta_mol_grLidar532)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospIN%beta_mol_grLidar532 has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%betatot_grLidar532)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospIN%betatot_grLidar532 has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%tau_mol_grLidar532)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospIN%tau_mol_grLidar532 has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%tautot_grLidar532)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospIN%tautot_grLidar532 has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + LgrLidar532_subcolumn = .false. + LgrLidar532_column = .false. + if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_beta_mol)) cospOUT%grLidar532_beta_mol(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_beta_tot)) cospOUT%grLidar532_beta_tot(:,:,:) = R_UNDEF + endif + + ! Ground Lidar column simulator requires additional inputs not required by the subcolumn simulator. + alloc_status = .true. + if (.not. allocated(cospgridIN%hgt_matrix)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospgridIN%hgt_matrix has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%hgt_matrix_half)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospgridIN%hgt_matrix_half has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%phalf)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospgridIN%phalf has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + LgrLidar532_column = .false. + if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF + endif + endif + + ! Calipso Lidar simulator + if (Lcalipso_subcolumn .or. Lcalipso_column) then + alloc_status = .true. + if (.not. allocated(cospIN%beta_mol_calipso)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospIN%beta_mol_calipso has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%betatot_calipso)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospIN%betatot_calipso has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%betatot_liq_calipso)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator):'//& + ' cospIN%betatot_liq_calipso has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%betatot_ice_calipso)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator):'//& + ' cospIN%betatot_ice_calipso has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%tau_mol_calipso)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospIN%tau_mol_calipso has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%tautot_calipso)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospIN%tautot_calipso has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%tautot_liq_calipso)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator):'//& + ' cospIN%tautot_liq has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%tautot_ice_calipso)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator):'//& + ' cospIN%tautot_ice has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + Lcalipso_subcolumn = .false. + Lcalipso_column = .false. + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_beta_mol)) cospOUT%calipso_beta_mol(:,:) = R_UNDEF + if (associated(cospOUT%calipso_beta_tot)) cospOUT%calipso_beta_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_betaperp_tot)) cospOUT%calipso_betaperp_tot(:,:,:) = R_UNDEF + ! Also, turn-off joint-products + if (Lradar_lidar_tcc) then + Lradar_lidar_tcc = .false. + if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF + endif + if (Lcloudsat_tcc) then + Lcloudsat_tcc = .false. + if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF + endif + if (Lcloudsat_tcc2) then + Lcloudsat_tcc2 = .false. + if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF + endif + if (Llidar_only_freq_cloud) then + Llidar_only_freq_cloud = .false. + if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF + endif + endif + + ! Calipso column simulator requires additional inputs not required by the subcolumn simulator. + alloc_status = .true. + if (.not. allocated(cospgridIN%hgt_matrix)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator):'//& + ' cospgridIN%hgt_matrix has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%hgt_matrix_half)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator):'//& + ' cospgridIN%hgt_matrix_half has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%at)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospgridIN%at has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%surfelev)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospgridIN%surfelev has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%phalf)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospgridIN%phalf has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + Lcalipso_column = .false. + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (Lcloudsat_tcc) then + Lcloudsat_tcc = .false. + if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF + endif + if (Lcloudsat_tcc2) then + Lcloudsat_tcc2 = .false. + if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF + endif + ! Also, turn-off joint-products + if (Lradar_lidar_tcc) then + Lradar_lidar_tcc = .false. + if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF + endif + if (Llidar_only_freq_cloud) then + Llidar_only_freq_cloud = .false. + if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF + endif + endif + endif + + ! PARASOL simulator + if (Lparasol_subcolumn .or. Lparasol_column) then + alloc_status = .true. + if (.not. allocated(cospIN%tautot_S_liq)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (PARASOL simulator): cospIN%tautot_S_liq has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%tautot_S_ice)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (PARASOL simulator): cospIN%tautot_S_ice has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + Lparasol_subcolumn = .false. + Lparasol_column = .false. + if (associated(cospOUT%parasolPix_refl)) cospOUT%parasolPix_refl(:,:,:) = R_UNDEF + if (associated(cospOUT%parasolGrid_refl)) cospOUT%parasolGrid_refl(:,:) = R_UNDEF + endif + + ! PARASOL column simulator requires additional inputs not required by the subcolumn simulator. + alloc_status = .true. + if (.not. allocated(cospgridIN%land)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (PARASOL simulator): cospgridIN%land has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + Lparasol_column = .false. + if (associated(cospOUT%parasolGrid_refl)) cospOUT%parasolGrid_refl(:,:) = R_UNDEF + endif + endif + + ! Cloudsat radar simulator + if (Lcloudsat_subcolumn .or. Lcloudsat_column) then + alloc_status = .true. + if (.not. allocated(cospIN%z_vol_cloudsat)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Cloudsat radar simulator):'//& + ' cospIN%z_vol_cloudsat has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%kr_vol_cloudsat)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Cloudsat radar simulator):'//& + ' cospIN%kr_vol_cloudsat has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%g_vol_cloudsat)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Cloudsat radar simulator):'//& + ' cospIN%g_vol_cloudsat has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%hgt_matrix)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Cloudsat radar simulator):'//& + ' cospgridIN%hgt_matrix has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%surfelev)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Cloudsat radar simulator):'//& + ' cospgridIN%surfelev has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + Lcloudsat_subcolumn = .false. + Lcloudsat_column = .false. + if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF + if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(:,:,:) = R_UNDEF + if (Lcloudsat_tcc) then + Lcloudsat_tcc = .false. + if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF + endif + if (Lcloudsat_tcc2) then + Lcloudsat_tcc2 = .false. + if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF + endif + ! Also, turn-off joint-products + if (Lradar_lidar_tcc) then + Lradar_lidar_tcc = .false. + if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF + endif + if (Llidar_only_freq_cloud) then + Llidar_only_freq_cloud = .false. + if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF + endif + if (Lcloudsat_modis_wr) then + Lcloudsat_modis_wr = .false. + if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF + if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF + endif + endif + + ! Cloudsat column simulator requires additional inputs not required by the subcolumn simulator. + alloc_status = .true. + if (.not. allocated(cospgridIN%hgt_matrix_half)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Cloudsat radar simulator):'//& + ' cospgridIN%hgt_matrix_half has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + Lcloudsat_column = .false. + if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF + if (Lcloudsat_tcc) then + Lcloudsat_tcc = .false. + if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF + endif + if (Lcloudsat_tcc2) then + Lcloudsat_tcc2 = .false. + if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF + endif + ! Also, turn-off joint-products + if (Lradar_lidar_tcc) then + Lradar_lidar_tcc = .false. + if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF + endif + if (Llidar_only_freq_cloud) then + Llidar_only_freq_cloud = .false. + if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF + endif + if (Lcloudsat_modis_wr) then + Lcloudsat_modis_wr = .false. + if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF + if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF + endif + endif + endif + + ! MODIS simulator + if (Lmodis_subcolumn .or. Lmodis_column) then + alloc_status = .true. + if (.not. allocated(cospIN%fracLiq)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (MODIS simulator): cospIN%fracLiq has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%tau_067)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (MODIS simulator): cospIN%tau_067 has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%asym)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (MODIS simulator): cospIN%asym has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%ss_alb)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (MODIS simulator): cospIN%ss_alb has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%sunlit)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (MODIS simulator): cospgridIN%sunlit has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + Lmodis_subcolumn = .false. + Lmodis_column = .false. + if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & + cospOUT%modis_Cloud_Fraction_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & + cospOUT%modis_Cloud_Fraction_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & + cospOUT%modis_Cloud_Fraction_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & + cospOUT%modis_Cloud_Fraction_High_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & + cospOUT%modis_Cloud_Fraction_Mid_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & + cospOUT%modis_Cloud_Fraction_Low_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & + cospOUT%modis_Optical_Thickness_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & + cospOUT%modis_Optical_Thickness_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & + cospOUT%modis_Optical_Thickness_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & + cospOUT%modis_Optical_Thickness_Total_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & + cospOUT%modis_Optical_Thickness_Water_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & + cospOUT%modis_Optical_Thickness_Ice_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & + cospOUT%modis_Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & + cospOUT%modis_Liquid_Water_Path_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & + cospOUT%modis_Ice_Water_Path_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) & + cospOUT%modis_LWP_vs_ReffLIQ(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_IWP_vs_ReffICE)) & + cospOUT%modis_IWP_vs_ReffICE(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) & + cospOUT%modis_Optical_Thickness_vs_ReffICE(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) & + cospOUT%modis_Optical_Thickness_vs_ReffLIQ(:,:,:) = R_UNDEF + ! Also, turn-off joint-products + if (Lcloudsat_modis_wr) then + Lcloudsat_modis_wr = .false. + if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF + if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF + endif + endif + endif + + ! RTTOV + if (Lrttov_column) then + alloc_status = .true. +! if (.not. allocated(cospgridIN%emis_in)) then +! nError=nError+1 +! errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%emis_in has not been allocated' +! alloc_status = .false. +! endif +! if (.not. allocated(cospgridIN%refl_in)) then +! nError=nError+1 +! errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%refl_in has not been allocated' +! alloc_status = .false. +! endif + if (.not. allocated(cospgridIN%hgt_matrix_half)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%hgt_matrix_half has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%u_sfc)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%u_sfc has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%v_sfc)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%v_sfc has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%skt)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%skt has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%phalf)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%phalf has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%qv)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%qv has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%at)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%at has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%rttov_sfcmask)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV simulator): cospgridIN%rttov_sfcmask has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%lat)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%lat has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%lon)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%lon has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%pfull)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%pfull has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%phalf)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%phalf has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%at)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%at has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%qv)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%qv has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%o3)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%o3 has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%tca)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%tca has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%sza)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%sza has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%cloudIce)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%cloudIce has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%cloudLiq)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%cloudLiq has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%fl_rain)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%fl_rain has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%fl_snow)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%fl_snow has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%rttov_date)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%rttov_date has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%rttov_time)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%rttov_time has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + endif + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! PART 1: Check input array values for out-of-bounds values. When an out-of-bound value + ! is encountered, COSP outputs that are dependent on that input are filled with + ! an undefined value (set in cosp_config.f90) and if necessary, that simulator + ! is turned off. + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (any([Lisccp_subcolumn, Lisccp_column, Lmisr_subcolumn, Lmisr_column, & + Lmodis_subcolumn, Lmodis_column, Lcloudsat_modis_wr])) then + if (any(cospgridIN%sunlit .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%sunlit contains values out of range (0 or 1)' + Lisccp_subcolumn = .false. + Lisccp_column = .false. + Lmisr_subcolumn = .false. + Lmisr_column = .false. + Lmodis_subcolumn = .false. + Lmodis_column = .false. + Lcloudsat_modis_wr = .false. + if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF + if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF + if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF + if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF + if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF + if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF + if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF + if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF + if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF + if (associated(cospOUT%misr_fq)) cospOUT%misr_fq(:,:,:) = R_UNDEF + if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(:,:) = R_UNDEF + if (associated(cospOUT%misr_meanztop)) cospOUT%misr_meanztop(:) = R_UNDEF + if (associated(cospOUT%misr_cldarea)) cospOUT%misr_cldarea(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & + cospOUT%modis_Cloud_Fraction_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & + cospOUT%modis_Cloud_Fraction_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & + cospOUT%modis_Cloud_Fraction_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & + cospOUT%modis_Cloud_Fraction_High_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & + cospOUT%modis_Cloud_Fraction_Mid_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & + cospOUT%modis_Cloud_Fraction_Low_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & + cospOUT%modis_Optical_Thickness_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & + cospOUT%modis_Optical_Thickness_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & + cospOUT%modis_Optical_Thickness_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & + cospOUT%modis_Optical_Thickness_Total_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & + cospOUT%modis_Optical_Thickness_Water_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & + cospOUT%modis_Optical_Thickness_Ice_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & + cospOUT%modis_Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & + cospOUT%modis_Liquid_Water_Path_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & + cospOUT%modis_Ice_Water_Path_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) & + cospOUT%modis_LWP_vs_ReffLIQ(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_IWP_vs_ReffICE)) & + cospOUT%modis_IWP_vs_ReffICE(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) & + cospOUT%modis_Optical_Thickness_vs_ReffICE(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) & + cospOUT%modis_Optical_Thickness_vs_ReffLIQ(:,:,:) = R_UNDEF + if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF + if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF + endif + endif + + if (any([Lisccp_subcolumn, Lisccp_column, Lmisr_subcolumn, Lmisr_column, Lrttov_column,& + Lcalipso_column, Lcloudsat_column, Lradar_lidar_tcc,Llidar_only_freq_cloud, & + Lcloudsat_tcc, Lcloudsat_tcc2, Lcloudsat_modis_wr])) then + if (any(cospgridIN%at .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%at contains values out of range (at<0), expected units (K)' + Lisccp_subcolumn = .false. + Lisccp_column = .false. + Lmisr_subcolumn = .false. + Lmisr_column = .false. + Lrttov_column = .false. + Lcalipso_column = .false. + Lcloudsat_column = .false. + Lradar_lidar_tcc = .false. + Llidar_only_freq_cloud = .false. + Lcloudsat_tcc = .false. + Lcloudsat_tcc2 = .false. + Lcloudsat_modis_wr = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF + if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF + if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF + if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF + if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF + if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF + if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF + if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF + if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF + if (associated(cospOUT%misr_fq)) cospOUT%misr_fq(:,:,:) = R_UNDEF + if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(:,:) = R_UNDEF + if (associated(cospOUT%misr_meanztop)) cospOUT%misr_meanztop(:) = R_UNDEF + if (associated(cospOUT%misr_cldarea)) cospOUT%misr_cldarea(:) = R_UNDEF + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF + if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF + if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF + if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF + if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF + endif + endif + if (any([Lisccp_subcolumn, Lisccp_column, Lrttov_column])) then + if (any(cospgridIN%pfull .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%pfull contains values out of range' + Lisccp_subcolumn = .false. + Lisccp_column = .false. + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF + if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF + if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF + if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF + if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF + if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF + if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF + if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF + if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF + endif + endif + if (any([Lisccp_subcolumn,Lisccp_column,Lmodis_subcolumn,Lmodis_column,Lcalipso_column,Lrttov_column,& + LgrLidar532_column,Latlid_column])) then + if (any(cospgridIN%phalf .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%phalf contains values out of range' + Lisccp_subcolumn = .false. + Lisccp_column = .false. + Lmodis_subcolumn = .false. + Lmodis_column = .false. + Lcalipso_column = .false. + Lrttov_column = .false. + Latlid_column = .false. + LgrLidar532_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF + if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF + if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF + if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF + if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF + if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF + if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF + if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF + if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & + cospOUT%modis_Cloud_Fraction_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & + cospOUT%modis_Cloud_Fraction_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & + cospOUT%modis_Cloud_Fraction_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & + cospOUT%modis_Cloud_Fraction_High_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & + cospOUT%modis_Cloud_Fraction_Mid_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & + cospOUT%modis_Cloud_Fraction_Low_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & + cospOUT%modis_Optical_Thickness_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & + cospOUT%modis_Optical_Thickness_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & + cospOUT%modis_Optical_Thickness_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & + cospOUT%modis_Optical_Thickness_Total_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & + cospOUT%modis_Optical_Thickness_Water_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & + cospOUT%modis_Optical_Thickness_Ice_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & + cospOUT%modis_Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & + cospOUT%modis_Liquid_Water_Path_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & + cospOUT%modis_Ice_Water_Path_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) & + cospOUT%modis_LWP_vs_ReffLIQ(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_IWP_vs_ReffICE)) & + cospOUT%modis_IWP_vs_ReffICE(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) & + cospOUT%modis_Optical_Thickness_vs_ReffICE(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) & + cospOUT%modis_Optical_Thickness_vs_ReffLIQ(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + endif + endif + if (any([Lisccp_subcolumn,Lisccp_column,Lrttov_column])) then + if (any(cospgridIN%qv .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%qv contains values out of range' + Lisccp_subcolumn = .false. + Lisccp_column = .false. + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF + if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF + if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF + if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF + if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF + if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF + if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF + if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF + if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF + endif + endif + if (any([Lmisr_subcolumn,Lmisr_column,Lcloudsat_subcolumn,Lcloudsat_column,Lcalipso_column,Lradar_lidar_tcc,& + Llidar_only_freq_cloud,LgrLidar532_column,Latlid_column,Lcloudsat_tcc, Lcloudsat_tcc2, & + Lcloudsat_modis_wr])) then + if (any(cospgridIN%hgt_matrix .lt. -300)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%hgt_matrix contains values out of range' + Lmisr_subcolumn = .false. + Lmisr_column = .false. + Lcloudsat_subcolumn = .false. + Lcloudsat_column = .false. + Lcalipso_column = .false. + Lradar_lidar_tcc = .false. + Llidar_only_freq_cloud = .false. + Lcloudsat_tcc = .false. + Lcloudsat_tcc2 = .false. + Latlid_column = .false. + LgrLidar532_column = .false. + Lcloudsat_modis_wr = .false. + if (associated(cospOUT%misr_fq)) cospOUT%misr_fq(:,:,:) = R_UNDEF + if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(:,:) = R_UNDEF + if (associated(cospOUT%misr_meanztop)) cospOUT%misr_meanztop(:) = R_UNDEF + if (associated(cospOUT%misr_cldarea)) cospOUT%misr_cldarea(:) = R_UNDEF + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF + if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF + if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF + if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF + if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF + endif + endif + if (any([Lrttov_column,Lcloudsat_column,Lcalipso_column,Lradar_lidar_tcc,Llidar_only_freq_cloud, & + LgrLidar532_column, Latlid_column, Lcloudsat_tcc, Lcloudsat_tcc2, Lcloudsat_modis_wr])) then + if (any(cospgridIN%hgt_matrix_half .lt. -300)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%hgt_matrix_half contains values out of range' + Lrttov_column = .false. + Lcloudsat_column = .false. + Lcalipso_column = .false. + Lradar_lidar_tcc = .false. + Llidar_only_freq_cloud = .false. + Lcloudsat_tcc = .false. + Lcloudsat_tcc2 = .false. + Latlid_column = .false. + LgrLidar532_column = .false. + Lcloudsat_modis_wr = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF + if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF + if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF + if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF + if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF + endif + endif + if (any([Lrttov_column,Lcalipso_column,Lparasol_column])) then + if (any(cospgridIN%land .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%land contains values out of range' + Lrttov_column = .false. + Lcalipso_column = .false. + Lparasol_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + if (associated(cospOUT%parasolGrid_refl)) cospOUT%parasolGrid_refl(:,:) = R_UNDEF + endif + endif + if (any([Lisccp_subcolumn,Lisccp_column,Lrttov_column])) then + if (any(cospgridIN%skt .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%skt contains values out of range' + Lisccp_subcolumn = .false. + Lisccp_column = .false. + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF + if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF + if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF + if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF + if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF + if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF + if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF + if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF + if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF + endif + endif + + ! RTTOV Inputs + if (Lrttov_column) then + if (any(cospgridIN%co2 .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%co2 contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%ch4 .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%ch4 contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%n2o .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%n2o contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%co.lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%co contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%o3 .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%o3 contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif +! if (any(cospgridIN%emis_in .lt. 0. .OR. cospgridIN%emis_in .gt. 1)) then +! nError=nError+1 +! errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%emis_in contains values out of range' +! Lrttov_column = .false. +! if (allocated(cospOUT%rttov_outputs)) then +! do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument +! if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 +! if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF +! end do +! end if +! endif +! if (any(cospgridIN%refl_in .lt. 0. .OR. cospgridIN%refl_in .gt. 1)) then +! nError=nError+1 +! errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%refl_in contains values out of range' +! Lrttov_column = .false. +! if (allocated(cospOUT%rttov_outputs)) then +! do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument +! if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 +! if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF +! end do +! end if +! endif + if (any(cospgridIN%rttov_sfcmask .lt. 0 .or. cospgridIN%rttov_sfcmask .gt. 2)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%rttov_sfcmask contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%u_sfc .lt. -100. .OR. cospgridIN%u_sfc .gt. 100.)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%u_sfc contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%v_sfc .lt. -100. .OR. cospgridIN%v_sfc .gt. 100.)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%v_sfc contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%lat .lt. -90 .OR. cospgridIN%lat .gt. 90)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%lat contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%lon .lt. -180 .OR. cospgridIN%lon .gt. 360)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%lon contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%tca .lt. 0 .OR. cospgridIN%tca .gt. 1)) then ! tca on [0,1] + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tca contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%rttov_time(:,1) .lt. 0 .OR. cospgridIN%rttov_time(:,1) .gt. 24)) then ! rttov_time(1), hour on [0,24] + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%rttov_time(1) contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%rttov_time(:,2) .lt. 0 .OR. cospgridIN%rttov_time(:,2) .gt. 60)) then ! rttov_time(2), minute on [0,60] + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%rttov_time(2) contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%rttov_time(:,3) .lt. 0 .OR. cospgridIN%rttov_time(:,3) .gt. 60)) then ! rttov_time(3), second on [0,60] + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%rttov_time(3) contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%rttov_date(:,1) .lt. 0)) then ! rttov_date(1), year on [0,inf] + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%rttov_date(1) contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%rttov_date(:,2) .lt. 0 .OR. cospgridIN%rttov_date(:,2) .gt. 12)) then ! rttov_date(2), month on [0,12] + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%rttov_date(2) contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%rttov_date(:,3) .lt. 1 .OR. cospgridIN%rttov_date(:,3) .gt. 31)) then ! rttov_date(3), day on [1,31] + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%rttov_date(3) contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + endif + + ! COSP_INPUTS + if (any([Lisccp_subcolumn,Lisccp_column])) then + if (cospIN%emsfc_lw .lt. 0. .OR. cospIN%emsfc_lw .gt. 1.) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%emsfc_lw contains values out of range' + Lisccp_subcolumn = .false. + Lisccp_column = .false. + if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF + if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF + if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF + if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF + if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF + if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF + if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF + if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF + if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF + endif + endif + if (any([Lisccp_subcolumn,Lisccp_column,Lmisr_subcolumn,Lmisr_column,Lmodis_subcolumn,Lmodis_column])) then + if (any(cospIN%tau_067 .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tau_067 contains values out of range' + Lisccp_subcolumn = .false. + Lisccp_column = .false. + Lmisr_subcolumn = .false. + Lmisr_column = .false. + Lmodis_subcolumn = .false. + Lmodis_column = .false. + if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF + if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF + if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF + if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF + if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF + if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF + if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF + if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF + if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF + if (associated(cospOUT%misr_fq)) cospOUT%misr_fq(:,:,:) = R_UNDEF + if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(:,:) = R_UNDEF + if (associated(cospOUT%misr_meanztop)) cospOUT%misr_meanztop(:) = R_UNDEF + if (associated(cospOUT%misr_cldarea)) cospOUT%misr_cldarea(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & + cospOUT%modis_Cloud_Fraction_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & + cospOUT%modis_Cloud_Fraction_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & + cospOUT%modis_Cloud_Fraction_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & + cospOUT%modis_Cloud_Fraction_High_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & + cospOUT%modis_Cloud_Fraction_Mid_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & + cospOUT%modis_Cloud_Fraction_Low_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & + cospOUT%modis_Optical_Thickness_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & + cospOUT%modis_Optical_Thickness_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & + cospOUT%modis_Optical_Thickness_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & + cospOUT%modis_Optical_Thickness_Total_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & + cospOUT%modis_Optical_Thickness_Water_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & + cospOUT%modis_Optical_Thickness_Ice_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & + cospOUT%modis_Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & + cospOUT%modis_Liquid_Water_Path_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & + cospOUT%modis_Ice_Water_Path_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) & + cospOUT%modis_LWP_vs_ReffLIQ(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_IWP_vs_ReffICE)) & + cospOUT%modis_IWP_vs_ReffICE(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) & + cospOUT%modis_Optical_Thickness_vs_ReffICE(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) & + cospOUT%modis_Optical_Thickness_vs_ReffLIQ(:,:,:) = R_UNDEF + endif + endif + if (any([Lisccp_subcolumn,Lisccp_column])) then + if (any(cospIN%emiss_11 .lt. 0. .OR. cospIN%emiss_11 .gt. 1)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%emiss_11 contains values out of range' + Lisccp_subcolumn = .false. + Lisccp_column = .false. + if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF + if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF + if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF + if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF + if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF + if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF + if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF + if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF + if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF + endif + endif + if (any([Lmodis_subcolumn,Lmodis_column])) then + if (any(cospIN%asym .lt. -1. .OR. cospIN%asym .gt. 1)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%asym contains values out of range' + Lmodis_subcolumn = .false. + Lmodis_column = .false. + if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & + cospOUT%modis_Cloud_Fraction_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & + cospOUT%modis_Cloud_Fraction_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & + cospOUT%modis_Cloud_Fraction_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & + cospOUT%modis_Cloud_Fraction_High_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & + cospOUT%modis_Cloud_Fraction_Mid_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & + cospOUT%modis_Cloud_Fraction_Low_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & + cospOUT%modis_Optical_Thickness_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & + cospOUT%modis_Optical_Thickness_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & + cospOUT%modis_Optical_Thickness_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & + cospOUT%modis_Optical_Thickness_Total_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & + cospOUT%modis_Optical_Thickness_Water_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & + cospOUT%modis_Optical_Thickness_Ice_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & + cospOUT%modis_Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & + cospOUT%modis_Liquid_Water_Path_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & + cospOUT%modis_Ice_Water_Path_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) & + cospOUT%modis_LWP_vs_ReffLIQ(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_IWP_vs_ReffICE)) & + cospOUT%modis_IWP_vs_ReffICE(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) & + cospOUT%modis_Optical_Thickness_vs_ReffICE(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) & + cospOUT%modis_Optical_Thickness_vs_ReffLIQ(:,:,:) = R_UNDEF + endif + if (any(cospIN%ss_alb .lt. 0 .OR. cospIN%ss_alb .gt. 1)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%ss_alb contains values out of range' + Lmodis_subcolumn = .false. + Lmodis_column = .false. + if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & + cospOUT%modis_Cloud_Fraction_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & + cospOUT%modis_Cloud_Fraction_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & + cospOUT%modis_Cloud_Fraction_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & + cospOUT%modis_Cloud_Fraction_High_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & + cospOUT%modis_Cloud_Fraction_Mid_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & + cospOUT%modis_Cloud_Fraction_Low_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & + cospOUT%modis_Optical_Thickness_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & + cospOUT%modis_Optical_Thickness_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & + cospOUT%modis_Optical_Thickness_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & + cospOUT%modis_Optical_Thickness_Total_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & + cospOUT%modis_Optical_Thickness_Water_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & + cospOUT%modis_Optical_Thickness_Ice_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & + cospOUT%modis_Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & + cospOUT%modis_Liquid_Water_Path_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & + cospOUT%modis_Ice_Water_Path_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) & + cospOUT%modis_LWP_vs_ReffLIQ(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_IWP_vs_ReffICE)) & + cospOUT%modis_IWP_vs_ReffICE(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) & + cospOUT%modis_Optical_Thickness_vs_ReffICE(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) & + cospOUT%modis_Optical_Thickness_vs_ReffLIQ(:,:,:) = R_UNDEF + endif + endif + if (any([Latlid_subcolumn,Latlid_column])) then + if (any(cospIN%betatot_atlid .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%betatot_atlid contains values out of range' + Latlid_subcolumn = .false. + Latlid_column = .false. + if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%atlid_beta_tot)) cospOUT%atlid_beta_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_beta_mol)) cospOUT%atlid_beta_mol(:,:) = R_UNDEF + endif + if (any(cospIN%beta_mol_atlid .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%beta_mol_atlid contains values out of range' + Latlid_subcolumn = .false. + Latlid_column = .false. + if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%atlid_beta_tot)) cospOUT%atlid_beta_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_beta_mol)) cospOUT%atlid_beta_mol(:,:) = R_UNDEF + endif + if (any(cospIN%tautot_atlid .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tautot_atlid contains values out of range' + Latlid_subcolumn = .false. + Latlid_column = .false. + if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%atlid_beta_tot)) cospOUT%atlid_beta_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_beta_mol)) cospOUT%atlid_beta_mol(:,:) = R_UNDEF + endif + if (any(cospIN%tau_mol_atlid .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tau_mol_atlid contains values out of range' + Latlid_subcolumn = .false. + Latlid_column = .false. + if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%atlid_beta_tot)) cospOUT%atlid_beta_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_beta_mol)) cospOUT%atlid_beta_mol(:,:) = R_UNDEF + endif + endif + + if (any([LgrLidar532_subcolumn,LgrLidar532_column])) then + if (any(cospIN%betatot_grLidar532 .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%betatot_grLidar532 contains values out of range' + LgrLidar532_subcolumn = .false. + LgrLidar532_column = .false. + if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_beta_tot)) cospOUT%grLidar532_beta_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_beta_mol)) cospOUT%grLidar532_beta_mol(:,:) = R_UNDEF + endif + if (any(cospIN%beta_mol_grLidar532 .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%beta_mol_grLidar532 contains values out of range' + LgrLidar532_subcolumn = .false. + LgrLidar532_column = .false. + if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_beta_tot)) cospOUT%grLidar532_beta_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_beta_mol)) cospOUT%grLidar532_beta_mol(:,:) = R_UNDEF + endif + if (any(cospIN%tautot_grLidar532 .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tautot_grLidar532 contains values out of range' + LgrLidar532_subcolumn = .false. + LgrLidar532_column = .false. + if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_beta_tot)) cospOUT%grLidar532_beta_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_beta_mol)) cospOUT%grLidar532_beta_mol(:,:) = R_UNDEF + endif + if (any(cospIN%tau_mol_grLidar532 .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tau_mol_grLidar532 contains values out of range' + LgrLidar532_subcolumn = .false. + LgrLidar532_column = .false. + if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_beta_tot)) cospOUT%grLidar532_beta_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_beta_mol)) cospOUT%grLidar532_beta_mol(:,:) = R_UNDEF + endif + endif + + if (any([Lcalipso_subcolumn,Lcalipso_column])) then + if (any(cospIN%betatot_calipso .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%betatot_calipso contains values out of range' + Lcalipso_subcolumn = .false. + Lcalipso_column = .false. + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + endif + if (any(cospIN%betatot_liq_calipso .lt. 0)) then + nError=nError+1 + errorMessage(nError) = ('ERROR: COSP input variable: cospIN%betatot_liq_calipso contains values out of range') + Lcalipso_subcolumn = .false. + Lcalipso_column = .false. + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + endif + if (any(cospIN%betatot_ice_calipso .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%betatot_ice_calipso contains values out of range' + Lcalipso_subcolumn = .false. + Lcalipso_column = .false. + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + endif + if (any(cospIN%tautot_calipso .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tautot_calipso contains values out of range' + Lcalipso_subcolumn = .false. + Lcalipso_column = .false. + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + endif + if (any(cospIN%tautot_liq_calipso .lt. 0)) then + nError=nError+1 + errorMessage(nError) = ('ERROR: COSP input variable: cospIN%tautot_liq_calipso contains values out of range') + Lcalipso_subcolumn = .false. + Lcalipso_column = .false. + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + endif + if (any(cospIN%tautot_ice_calipso .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tautot_ice_calipso contains values out of range' + Lcalipso_subcolumn = .false. + Lcalipso_column = .false. + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + endif + if (any(cospIN%tau_mol_calipso .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tau_mol_calipso contains values out of range' + Lcalipso_subcolumn = .false. + Lcalipso_column = .false. + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + endif + endif + if (any([Lcalipso_subcolumn,Lcalipso_column,Lcloudsat_column,Lradar_lidar_tcc, & + Llidar_only_freq_cloud, Lcloudsat_tcc, Lcloudsat_tcc2])) then + if (any(cospIN%beta_mol_calipso .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%beta_mol_calipso contains values out of range' + Lcalipso_subcolumn = .false. + Lcalipso_column = .false. + Lcloudsat_column = .false. + Lradar_lidar_tcc = .false. + Llidar_only_freq_cloud = .false. + Lcloudsat_tcc = .false. + Lcloudsat_tcc2 = .false. + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF + if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF + if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF + if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + endif + endif + if (any([Lparasol_subcolumn,Lparasol_column])) then + if (any(cospIN%tautot_S_liq .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tautot_S_liq contains values out of range' + Lparasol_subcolumn = .false. + Lparasol_column = .false. + if (associated(cospOUT%parasolPix_refl)) cospOUT%parasolPix_refl(:,:,:) = R_UNDEF + if (associated(cospOUT%parasolGrid_refl)) cospOUT%parasolGrid_refl(:,:) = R_UNDEF + endif + if (any(cospIN%tautot_S_ice .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tautot_S_ice contains values out of range' + Lparasol_subcolumn = .false. + Lparasol_column = .false. + if (associated(cospOUT%parasolPix_refl)) cospOUT%parasolPix_refl(:,:,:) = R_UNDEF + if (associated(cospOUT%parasolGrid_refl)) cospOUT%parasolGrid_refl(:,:) = R_UNDEF + endif + endif + if (any([Lcloudsat_subcolumn,Lcloudsat_column,Lradar_lidar_tcc,Llidar_only_freq_cloud, & + Lcloudsat_tcc, Lcloudsat_tcc2, Lcloudsat_modis_wr])) then + if (any(cospIN%z_vol_cloudsat .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%z_vol_cloudsat contains values out of range' + Lcloudsat_subcolumn = .false. + Lcloudsat_column = .false. + Lradar_lidar_tcc = .false. + Llidar_only_freq_cloud = .false. + Lcloudsat_tcc = .false. + Lcloudsat_tcc2 = .false. + Lcloudsat_modis_wr = .false. + if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF + if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF + if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF + if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF + if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF + endif + if (any(cospIN%kr_vol_cloudsat .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%kr_vol_cloudsat contains values out of range' + Lcloudsat_subcolumn = .false. + Lcloudsat_column = .false. + Lradar_lidar_tcc = .false. + Llidar_only_freq_cloud = .false. + Lcloudsat_tcc = .false. + Lcloudsat_tcc2 = .false. + Lcloudsat_modis_wr = .false. + if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF + if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF + if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF + if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF + if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF + endif + if (any(cospIN%g_vol_cloudsat .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%g_vol_cloudsat contains values out of range' + Lcloudsat_subcolumn = .false. + Lcloudsat_column = .false. + Lradar_lidar_tcc = .false. + Llidar_only_freq_cloud = .false. + Lcloudsat_tcc = .false. + Lcloudsat_tcc2 = .false. + Lcloudsat_modis_wr = .false. + if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF + if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF + if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF + if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF + if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF + endif + endif + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Part 2: Check input fields array size for consistency. This needs to be done for each + ! simulator + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! ISCCP + if (Lisccp_subcolumn .or. Lisccp_column) then + if (size(cospIN%frac_out,1) .ne. cospIN%Npoints .OR. & + size(cospIN%tau_067,1) .ne. cospIN%Npoints .OR. & + size(cospIN%emiss_11,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%skt) .ne. cospIN%Npoints .OR. & + size(cospgridIN%qv,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%at,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%phalf,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%sunlit) .ne. cospIN%Npoints .OR. & + size(cospgridIN%pfull,1) .ne. cospIN%Npoints) then + Lisccp_subcolumn = .false. + Lisccp_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(isccp_simulator): The number of points in the input fields are inconsistent' + endif + if (size(cospIN%frac_out,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%tau_067,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%emiss_11,2) .ne. cospIN%Ncolumns) then + Lisccp_subcolumn = .false. + Lisccp_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(isccp_simulator): The number of sub-columns in the input fields are inconsistent' + endif + if (size(cospIN%frac_out,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%tau_067,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%emiss_11,3) .ne. cospIN%Nlevels .OR. & + size(cospgridIN%qv,2) .ne. cospIN%Nlevels .OR. & + size(cospgridIN%at,2) .ne. cospIN%Nlevels .OR. & + size(cospgridIN%pfull,2) .ne. cospIN%Nlevels .OR. & + size(cospgridIN%phalf,2) .ne. cospIN%Nlevels+1) then + Lisccp_subcolumn = .false. + Lisccp_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(isccp_simulator): The number of levels in the input fields are inconsistent' + endif + endif + + ! MISR + if (Lmisr_subcolumn .or. Lmisr_column) then + if (size(cospIN%tau_067,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%sunlit) .ne. cospIN%Npoints .OR. & + size(cospgridIN%hgt_matrix,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%at,1) .ne. cospIN%Npoints) then + Lmisr_subcolumn = .false. + Lmisr_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(misr_simulator): The number of points in the input fields are inconsistent' + endif + if (size(cospIN%tau_067,2) .ne. cospIN%Ncolumns) then + Lmisr_subcolumn = .false. + Lmisr_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(misr_simulator): The number of sub-columns in the input fields are inconsistent' + endif + if (size(cospIN%tau_067,3) .ne. cospIN%Nlevels .OR. & + size(cospgridIN%hgt_matrix,2) .ne. cospIN%Nlevels .OR. & + size(cospgridIN%at,2) .ne. cospIN%Nlevels) then + Lmisr_subcolumn = .false. + Lmisr_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(misr_simulator): The number of levels in the input fields are inconsistent' + endif + endif + + ! MODIS + if (Lmodis_subcolumn .or. Lmodis_column) then + if (size(cospIN%fracLiq,1) .ne. cospIN%Npoints .OR. & + size(cospIN%tau_067,1) .ne. cospIN%Npoints .OR. & + size(cospIN%asym,1) .ne. cospIN%Npoints .OR. & + size(cospIN%ss_alb,1) .ne. cospIN%Npoints) then + Lmodis_subcolumn = .false. + Lmodis_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(modis_simulator): The number of points in the input fields are inconsistent' + endif + if (size(cospIN%fracLiq,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%tau_067,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%asym,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%ss_alb,2) .ne. cospIN%Ncolumns) then + Lmodis_subcolumn = .false. + Lmodis_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(modis_simulator): The number of sub-columns in the input fields are inconsistent' + endif + if (size(cospIN%fracLiq,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%tau_067,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%asym,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%ss_alb,3) .ne. cospIN%Nlevels) then + Lmodis_subcolumn = .false. + Lmodis_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(modis_simulator): The number of levels in the input fields are inconsistent' + endif + endif + + ! CLOUDSAT + if (Lcloudsat_subcolumn .or. Lcloudsat_column) then + if (size(cospIN%z_vol_cloudsat,1) .ne. cospIN%Npoints .OR. & + size(cospIN%kr_vol_cloudsat,1) .ne. cospIN%Npoints .OR. & + size(cospIN%g_vol_cloudsat,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%hgt_matrix,1) .ne. cospIN%Npoints) then + Lcloudsat_subcolumn = .false. + Lcloudsat_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(cloudsat_simulator): The number of points in the input fields are inconsistent' + endif + if (size(cospIN%z_vol_cloudsat,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%kr_vol_cloudsat,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%g_vol_cloudsat,2) .ne. cospIN%Ncolumns) then + Lcloudsat_subcolumn = .false. + Lcloudsat_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(cloudsat_simulator): The number of sub-columns in the input fields are inconsistent' + endif + if (size(cospIN%z_vol_cloudsat,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%kr_vol_cloudsat,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%g_vol_cloudsat,3) .ne. cospIN%Nlevels .OR. & + size(cospgridIN%hgt_matrix,2) .ne. cospIN%Nlevels) then + Lcloudsat_subcolumn = .false. + Lcloudsat_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(cloudsat_simulator): The number of levels in the input fields are inconsistent' + endif + endif + + ! GROUND LIDAR @ 532nm + if (LgrLidar532_subcolumn .or. LgrLidar532_column) then + if (size(cospIN%beta_mol_grLidar532,1) .ne. cospIN%Npoints .OR. & + size(cospIN%betatot_grLidar532,1) .ne. cospIN%Npoints .OR. & + size(cospIN%tau_mol_grLidar532,1) .ne. cospIN%Npoints .OR. & + size(cospIN%tautot_grLidar532,1) .ne. cospIN%Npoints) then + LgrLidar532_subcolumn = .false. + LgrLidar532_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(grLidar532_simulator): The number of points in the input fields are inconsistent' + endif + if (size(cospIN%betatot_grLidar532,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%tautot_grLidar532,2) .ne. cospIN%Ncolumns) then + LgrLidar532_subcolumn = .false. + LgrLidar532_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(grLidar532_simulator): The number of sub-columns in the input fields are inconsistent' + endif + if (size(cospIN%beta_mol_grLidar532,2) .ne. cospIN%Nlevels .OR. & + size(cospIN%betatot_grLidar532,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%tau_mol_grLidar532,2) .ne. cospIN%Nlevels .OR. & + size(cospIN%tautot_grLidar532,3) .ne. cospIN%Nlevels) then + LgrLidar532_subcolumn = .false. + LgrLidar532_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(grLidar532_simulator): The number of levels in the input fields are inconsistent' + endif + endif + + ! ATLID + if (Latlid_subcolumn .or. Latlid_column) then + if (size(cospIN%beta_mol_atlid,1) .ne. cospIN%Npoints .OR. & + size(cospIN%betatot_atlid,1) .ne. cospIN%Npoints .OR. & + size(cospIN%tau_mol_atlid,1) .ne. cospIN%Npoints .OR. & + size(cospIN%tautot_atlid,1) .ne. cospIN%Npoints) then + Latlid_subcolumn = .false. + Latlid_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(atlid_simulator): The number of points in the input fields are inconsistent' + endif + if (size(cospIN%betatot_atlid,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%tautot_atlid,2) .ne. cospIN%Ncolumns) then + Latlid_subcolumn = .false. + Latlid_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(atlid_simulator): The number of sub-columns in the input fields are inconsistent' + endif + if (size(cospIN%beta_mol_atlid,2) .ne. cospIN%Nlevels .OR. & + size(cospIN%betatot_atlid,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%tau_mol_atlid,2) .ne. cospIN%Nlevels .OR. & + size(cospIN%tautot_atlid,3) .ne. cospIN%Nlevels) then + Latlid_subcolumn = .false. + Latlid_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(atlid_simulator): The number of levels in the input fields are inconsistent' + endif + endif + + ! CALIPSO + if (Lcalipso_subcolumn .or. Lcalipso_column) then + if (size(cospIN%beta_mol_calipso,1) .ne. cospIN%Npoints .OR. & + size(cospIN%betatot_calipso,1) .ne. cospIN%Npoints .OR. & + size(cospIN%betatot_liq_calipso,1) .ne. cospIN%Npoints .OR. & + size(cospIN%betatot_ice_calipso,1) .ne. cospIN%Npoints .OR. & + size(cospIN%tau_mol_calipso,1) .ne. cospIN%Npoints .OR. & + size(cospIN%tautot_calipso,1) .ne. cospIN%Npoints .OR. & + size(cospIN%tautot_liq_calipso,1) .ne. cospIN%Npoints .OR. & + size(cospIN%tautot_ice_calipso,1) .ne. cospIN%Npoints) then + Lcalipso_subcolumn = .false. + Lcalipso_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(calipso_simulator): The number of points in the input fields are inconsistent' + endif + if (size(cospIN%betatot_calipso,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%betatot_liq_calipso,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%betatot_ice_calipso,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%tautot_calipso,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%tautot_liq_calipso,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%tautot_ice_calipso,2) .ne. cospIN%Ncolumns) then + Lcalipso_subcolumn = .false. + Lcalipso_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(calipso_simulator): The number of sub-columns in the input fields are inconsistent' + endif + if (size(cospIN%beta_mol_calipso,2) .ne. cospIN%Nlevels .OR. & + size(cospIN%betatot_calipso,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%betatot_liq_calipso,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%betatot_ice_calipso,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%tau_mol_calipso,2) .ne. cospIN%Nlevels .OR. & + size(cospIN%tautot_calipso,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%tautot_liq_calipso,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%tautot_ice_calipso,3) .ne. cospIN%Nlevels) then + Lcalipso_subcolumn = .false. + Lcalipso_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(calipso_simulator): The number of levels in the input fields are inconsistent' + endif + endif + + ! PARASOL + if (Lparasol_subcolumn .or. Lparasol_column) then + if (size(cospIN%tautot_S_liq,1) .ne. cospIN%Npoints .OR. & + size(cospIN%tautot_S_ice,1) .ne. cospIN%Npoints) then + Lparasol_subcolumn = .false. + Lparasol_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(parasol_simulator): The number of points in the input fields are inconsistent' + endif + if (size(cospIN%tautot_S_liq,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%tautot_S_ice,2) .ne. cospIN%Ncolumns) then + Lparasol_subcolumn = .false. + Lparasol_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(parasol_simulator): The number of levels in the input fields are inconsistent' + endif + endif + + ! RTTOV + if (Lrttov_column) then + if (size(cospgridIN%pfull,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%at,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%qv,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%hgt_matrix_half,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%u_sfc) .ne. cospIN%Npoints .OR. & + size(cospgridIN%v_sfc) .ne. cospIN%Npoints .OR. & + size(cospgridIN%skt) .ne. cospIN%Npoints .OR. & + size(cospgridIN%phalf,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%cloudIce,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%cloudLiq,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%rttov_sfcmask) .ne. cospIN%Npoints .OR. & + size(cospgridIN%lon) .ne. cospIN%Npoints .OR. & + size(cospgridIN%lat) .ne. cospIN%Npoints) then + Lrttov_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(rttov_simulator): The number of points in the input fields are inconsistent' + endif + if (size(cospgridIN%pfull,2) .ne. cospIN%Nlevels .OR. & + size(cospgridIN%at,2) .ne. cospIN%Nlevels .OR. & + size(cospgridIN%qv,2) .ne. cospIN%Nlevels .OR. & + size(cospgridIN%hgt_matrix_half,2) .ne. cospIN%Nlevels .OR. & + size(cospgridIN%phalf,2) .ne. cospIN%Nlevels+1) then + Lrttov_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(rttov_simulator): The number of levels in the input fields are inconsistent' + endif + endif + end subroutine cosp_errorCheck + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! END MODULE + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +END MODULE MOD_COSP diff --git a/dplrw_src/cosp2_io.f90 b/dplrw_src/cosp2_io.f90 new file mode 100644 index 0000000000..996a2c58cb --- /dev/null +++ b/dplrw_src/cosp2_io.f90 @@ -0,0 +1,3109 @@ +module mod_cosp_io + use cosp_kinds, only: wp + use mod_cosp, only: cosp_outputs + use netcdf + USE MOD_COSP_CONFIG, ONLY: Nlvgrid, LIDAR_NCAT, SR_BINS, PARASOL_NREFL, cloudsat_DBZE_BINS, & + numMODISReffIceBins, numMODISReffLiqBins, ntau, tau_binBounds, tau_binCenters, & + tau_binEdges,npres, pres_binBounds, pres_binCenters, pres_binEdges, nhgt, & + hgt_binBounds, hgt_binCenters, hgt_binEdges, vgrid_z, & + reffICE_binCenters, reffLIQ_binCenters, cloudsat_binCenters, PARASOL_SZA, & + calipso_binCenters, grLidar532_binCenters, atlid_binCenters, & + CFODD_NDBZE, CFODD_HISTDBZE, CFODD_HISTDBZEcenters, & + CFODD_NICOD, CFODD_HISTICOD, CFODD_HISTICODcenters + USE MOD_COSP_CONFIG, ONLY: Nlvtemp, NlvdBZe, Nlvdplr, Nlvspwd, & ! added by DPLRW + lvtemp_grid, lvdBZe_grid, lvdplr_grid, lvspwd_grid + implicit none + +contains + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE write_cosp2_output + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + subroutine write_cosp2_output(Npoints, Ncolumns, Nlevels, Ninst_rttov, lev, lon, lat, cospOUT, outFileName) + integer,intent(in) :: Npoints, Ncolumns, Nlevels, Ninst_rttov + real(wp),dimension(Npoints),intent(in) :: lon,lat + real(wp),dimension(Nlevels),intent(in) :: lev + type(cosp_outputs),intent(in) :: cospOUT + character(len=256),intent(in) :: outFileName + + integer :: fileID,status,ij,i,ii + integer,dimension(50) :: dimID + integer,dimension(250) :: varID + integer,dimension(Npoints) :: loc + integer,dimension(Ncolumns) :: cosp_scol + integer,dimension(2) :: bnds + character(len=8) :: & + fmt, & ! format descriptor for flexible RTTOV output + i_str + + loc=(/(ij,ij=1,Npoints)/) + cosp_scol=(/(ij,ij=1,Ncolumns)/) + bnds=(/(ij,ij=1,2)/) + fmt = '(I3.3)' ! an integer of width 3 with zeros at the left + + ! --------------------------------------------------------------------------------------- + ! Create output file. + ! --------------------------------------------------------------------------------------- + status = nf90_create(path=trim(outFileName),cmode=IOR(NF90_NETCDF4,NF90_CLOBBER),ncid=fileID) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + ! --------------------------------------------------------------------------------------- + ! Define GLOBAL attributes. + ! --------------------------------------------------------------------------------------- + status = nf90_put_att(fileID,NF90_GLOBAL,"Conventions","CF-1.6") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + ! --------------------------------------------------------------------------------------- + ! Define dimensions. + ! --------------------------------------------------------------------------------------- + status = nf90_def_dim(fileID,"loc",Npoints,dimID(1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"cosp_scol",Ncolumns,dimID(2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"lev",Nlevels,dimID(3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"levStat",Nlvgrid,dimID(4)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"tau7",ntau,dimID(5)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"bnds",2,dimID(6)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"pres7",npres,dimID(7)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"hgt16",nhgt,dimID(8)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"SR_BINS",SR_BINS,dimID(12)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"PARASOL_NREFL",PARASOL_NREFL,dimID(13)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"cloudsat_DBZE_BINS",cloudsat_DBZE_BINS,dimID(14)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"RELIQ_MODIS",numMODISReffLiqBins,dimID(15)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"REICE_MODIS",numMODISReffIceBins,dimID(16)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"CFODD_NDBZE",CFODD_NDBZE,dimID(17)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"CFODD_NICOD",CFODD_NICOD,dimID(18)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! added by DPLRW + status = nf90_def_dim(fileID,"Nlvtemp",Nlvtemp,dimID(19)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"NlvdBZe",NlvdBZe,dimID(20)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"Nlvdplr",Nlvdplr,dimID(21)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"Nlvspwd",Nlvspwd,dimID(22)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"regimeID",3,dimID(23)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"nrmlzdID",3,dimID(24)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + ! Define instrument channel indices for multiple RTTOV instruments + if (allocated(cospOUT%rttov_outputs)) then + do i=1,Ninst_rttov + write (i_str,fmt) i ! converting integer to string i_str using a 'internal file' + status = nf90_def_dim(fileID,"RTTOV_CHAN_INST"//trim(i_str),cospOUT % rttov_outputs(i) % nchan_out,dimID(24+i)) ! Start at 25 for RTTOV output channel dimensions + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + end do + end if + + ! --------------------------------------------------------------------------------------- + ! Define variables + ! --------------------------------------------------------------------------------------- + ! Longitude + status = nf90_def_var(fileID,"longitude", nf90_float, (/dimID(1)/),varID(1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(1),"long_name","longitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(1),"units", "degrees_east") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(1),"standard_name", "longitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Latitude + status = nf90_def_var(fileID,"latitude", nf90_float, (/dimID(1)/),varID(2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(2),"long_name","latitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(2),"units", "degrees_north") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(2),"standard_name", "latitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Joint-histogram axis + ! Tau + status = nf90_def_var(fileID,"tau7", nf90_float, (/dimID(5)/),varID(3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(3),"long_name","cloud_optical_depth_bin_centers") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(3),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(3),"standard_name", "atmosphere_optical_thickness_due_to_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Tau edges + status = nf90_def_var(fileID,"tau7_bnds", nf90_float, (/dimID(6),dimID(5)/),varID(4)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(4),"long_name","cloud_optical_depth_bin_edges") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(4),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(4),"standard_name", "atmosphere_optical_thickness_due_to_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Pressure + status = nf90_def_var(fileID,"pres7", nf90_float, (/dimID(7)/),varID(5)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(5),"long_name","air_pressure_bin_centers") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(5),"units", "Pa") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(5),"standard_name", "air_pressure") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Pressure Edges + status = nf90_def_var(fileID,"pres7_bnds", nf90_float, (/dimID(6),dimID(7)/),varID(6)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(6),"long_name","air_pressure_bin_edges") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(6),"units", "Pa") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(6),"standard_name", "air_pressure") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Height + status = nf90_def_var(fileID,"hgt16", nf90_float, (/dimID(8)/),varID(7)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(7),"long_name","altitude_bin_centers") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(7),"units", "m") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(7),"standard_name", "altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Height Edges + status = nf90_def_var(fileID,"hgt16_bnds", nf90_float, (/dimID(6),dimID(8)/),varID(8)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(8),"long_name","altitude_bin_edges") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(8),"units", "m") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(8),"standard_name", "altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Levels + status = nf90_def_var(fileID,"lev", nf90_float, (/dimID(3)/),varID(84)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(84),"long_name","level indices") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(84),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Levels for statistical diagnostics (lidar and radar) + status = nf90_def_var(fileID,"levStat", nf90_float, (/dimID(4)/),varID(85)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(85),"long_name","level indices") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(85),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + ! Subcolumms + status = nf90_def_var(fileID,"cosp_scol", nf90_float, (/dimID(2)/),varID(86)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(86),"long_name","subcolumn indices") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(86),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Bnds + status = nf90_def_var(fileID,"bnds", nf90_float, (/dimID(6)/),varID(82)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(82),"long_name","bounds") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(82),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! loc + status = nf90_def_var(fileID,"loc", nf90_float, (/dimID(1)/),varID(83)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(83),"long_name","loc") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(83),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + ! CALIPSO simulator output + if (associated(cospOUT%calipso_betaperp_tot)) then + status = nf90_def_var(fileID,"atb532_perp",nf90_float, (/dimID(1),dimID(2),dimID(3)/),varID(9)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(9),"long_name","CALIPSO Attenuated Total Perpendicular Backscatter (532nm)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(9),"units", "m-1 sr-1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(9),"standard_name", "volume_attenuated_backwards_scattering_function_in_air") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_beta_tot)) then + status = nf90_def_var(fileID,"atb532",nf90_float, (/dimID(1),dimID(2),dimID(3)/),varID(10)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(10),"long_name","CALIPSO Attenuated Total Backscatter (532nm)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(10),"units", "m-1 sr-1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(10),"standard_name", "volume_attenuated_backwards_scattering_function_in_air") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_lidarcldphase)) then + ! Ice + status = nf90_def_var(fileID,"clcalipsoice",nf90_float, (/dimID(1),dimID(4)/),varID(58)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(58),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(58),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(58),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Liquid + status = nf90_def_var(fileID,"clcalipsoliq",nf90_float, (/dimID(1),dimID(4)/),varID(59)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(59),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(59),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(59),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Undefined + status = nf90_def_var(fileID,"clcalipsoun",nf90_float, (/dimID(1),dimID(4)/),varID(60)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(60),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(60),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(60),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cldlayerphase)) then + ! Ice + status = nf90_def_var(fileID,"cllcalipsoice",nf90_float, (/dimID(1)/),varID(61)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(61),"long_name","CALIPSO Ice Low Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(61),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(61),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"clmcalipsoice",nf90_float, (/dimID(1)/),varID(62)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(62),"long_name","CALIPSO Ice Mid Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(62),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(62),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"clhcalipsoice",nf90_float, (/dimID(1)/),varID(63)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(63),"long_name","CALIPSO Ice High Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(63),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(63),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"cltcalipsoice",nf90_float, (/dimID(1)/),varID(64)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(64),"long_name","CALIPSO Ice Total Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(64),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(64),"standard_name", "cloud_area_fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Liquid + status = nf90_def_var(fileID,"cllcalipsoliq",nf90_float, (/dimID(1)/),varID(65)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(65),"long_name","CALIPSO Liquid Low Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(65),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(65),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"clmcalipsoliq",nf90_float, (/dimID(1)/),varID(66)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(66),"long_name","CALIPSO Liquid Mid Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(66),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(66),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"clhcalipsoliq",nf90_float, (/dimID(1)/),varID(67)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(67),"long_name","CALIPSO Liquid High Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(67),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(67),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"cltcalipsoliq",nf90_float, (/dimID(1)/),varID(68)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(68),"long_name","CALIPSO Liquid Total Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(68),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(68),"standard_name", "cloud_area_fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Undetermined + status = nf90_def_var(fileID,"cllcalipsoun",nf90_float, (/dimID(1)/),varID(69)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(69),"long_name","CALIPSO Undefined-Phase Low Level Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(69),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(69),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"clmcalipsoun",nf90_float, (/dimID(1)/),varID(70)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(70),"long_name","CALIPSO Undefined-Phase Mid Level Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(70),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(70),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"clhcalipsoun",nf90_float, (/dimID(1)/),varID(71)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(71),"long_name","CALIPSO Undefined-Phase High Level Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(71),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(71),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"cltcalipsoun",nf90_float, (/dimID(1)/),varID(72)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(72),"long_name","CALIPSO Undefined-Phase Total Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(72),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(72),"standard_name", "cloud_area_fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_lidarcldtmp)) then + status = nf90_def_var(fileID,"clcalipsotmp",nf90_float, (/dimID(1),dimID(4)/),varID(77)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(77),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(77),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(77),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"clcalipsotmpice",nf90_float, (/dimID(1),dimID(4)/),varID(78)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(78),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(78),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(78),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"clcalipsotmpliq",nf90_float, (/dimID(1),dimID(4)/),varID(79)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(79),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(79),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(79),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"clcalipsotmpun",nf90_float, (/dimID(1),dimID(4)/),varID(80)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(80),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(80),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(80),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cfad_sr)) then + status = nf90_def_var(fileID,"cfadLidarsr532",nf90_float, (/dimID(1),dimID(12),dimID(4)/),varID(15)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(15),"long_name","CALIPSO Scattering Ratio CFAD") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(15),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(15),"standard_name", "histogram_of_backscattering_ratio_over_height_above_reference_ellipsoid") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_lidarcld)) then + status = nf90_def_var(fileID,"clcalipso",nf90_float, (/dimID(1),dimID(4)/),varID(16)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(16),"long_name","CALIPSO Cloud Area Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(16),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(16),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cldlayer)) then + ! Low-level + status = nf90_def_var(fileID,"cllcalipso",nf90_float, (/dimID(1)/),varID(73)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(73),"long_name","CALIPSO Low Level Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(73),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(73),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Mid-level + status = nf90_def_var(fileID,"clmcalipso",nf90_float, (/dimID(1)/),varID(74)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(74),"long_name","CALIPSO Mid Level Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(74),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(74),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! High-level + status = nf90_def_var(fileID,"clhcalipso",nf90_float, (/dimID(1)/),varID(75)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(75),"long_name","CALIPSO High Level Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(75),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(75),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Total + status = nf90_def_var(fileID,"cltcalipso",nf90_float, (/dimID(1)/),varID(76)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(76),"long_name","CALIPSO Total Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(76),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(76),"standard_name", "cloud_area_fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_beta_mol)) then + status = nf90_def_var(fileID,"lidarBetaMol532",nf90_float, (/dimID(1),dimID(3)/),varID(18)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(18),"long_name","CALIPSO Molecular Backscatter Coefficient (532nm)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(18),"units", "m-1 sr-1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(18),"standard_name", "volume_attenuated_backwards_scattering_function_in_air_assuming_no_aerosol_or_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_srbval) .or. associated(cospOUT%calipso_cfad_sr)) then + status = nf90_def_var(fileID,"SR_BINS",nf90_float, (/dimID(12)/),varID(81)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(81),"long_name","CALIPSO Backscattering Ratio (SR) Bin Centers") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(81),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(81),"standard_name", "backscattering_ratio") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"SR_EDGES",nf90_float, (/dimID(6),dimID(12)/),varID(19)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(19),"long_name","CALIPSO Backscattering Ratio (SR) Bin Bounds") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(19),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(19),"standard_name", "backscattering_ratio") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + !OPAQ diagnostics + if (associated(cospOUT%calipso_cldtype)) then + ! Opaque cloud cover + status = nf90_def_var(fileID,"clopaquecalipso",nf90_float, (/dimID(1)/),varID(91)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(91),"long_name","CALIPSO Opaque Cloud Cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(91),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(91),"standard_name", "opaque_cloud_cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Thin cloud cover + status = nf90_def_var(fileID,"clthincalipso",nf90_float, (/dimID(1)/),varID(92)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(92),"long_name","CALIPSO Thin Cloud Cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(92),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(92),"standard_name", "thin_cloud_cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! z_opaque altitude + status = nf90_def_var(fileID,"clzopaquecalipso",nf90_float, (/dimID(1)/),varID(93)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(93),"long_name","CALIPSO z_opaque Altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(93),"units", "m") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(93),"standard_name", "z_opaque") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + !3D cloud fractions + if (associated(cospOUT%calipso_lidarcldtype)) then + ! Opaque profiles cloud fraction + status = nf90_def_var(fileID,"clcalipsoopaque",nf90_float, (/dimID(1),dimID(4)/),varID(94)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(94),"long_name","CALIPSO Opaque Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(94),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(94),"standard_name", "opaque_cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Non-Opaque profiles cloud fraction + status = nf90_def_var(fileID,"clcalipsothin",nf90_float, (/dimID(1),dimID(4)/),varID(95)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(95),"long_name","CALIPSO Thin Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(95),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(95),"standard_name", "thin_cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! z_opaque fraction + status = nf90_def_var(fileID,"clcalipsozopaque",nf90_float, (/dimID(1),dimID(4)/),varID(96)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(96),"long_name","CALIPSO z_opaque Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(96),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(96),"standard_name", "z_opaque_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Lidar opacity fraction + status = nf90_def_var(fileID,"clcalipsoopacity",nf90_float, (/dimID(1),dimID(4)/),varID(97)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(97),"long_name","CALIPSO opacity Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(97),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(97),"standard_name", "opacity_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cldtypetemp)) then + ! Opaque cloud temperature + status = nf90_def_var(fileID,"clopaquetemp",nf90_float, (/dimID(1)/),varID(98)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(98),"long_name","CALIPSO Opaque Cloud Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(98),"units", "K") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(98),"standard_name", "opaque_cloud_temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Thin cloud temperature + status = nf90_def_var(fileID,"clthintemp",nf90_float, (/dimID(1)/),varID(99)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(99),"long_name","CALIPSO Thin Cloud Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(99),"units", "K") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(99),"standard_name", "thin_cloud_temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! z_opaque temperature + status = nf90_def_var(fileID,"clzopaquetemp",nf90_float, (/dimID(1)/),varID(100)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(100),"long_name","CALIPSO z_opaque Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(100),"units", "K") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(100),"standard_name", "z_opaque_temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cldtypemeanz)) then + ! Opaque cloud altitude + status = nf90_def_var(fileID,"clopaquemeanz",nf90_float, (/dimID(1)/),varID(101)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(101),"long_name","CALIPSO Opaque Cloud Altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(101),"units", "m") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(101),"standard_name", "opaque_cloud_altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Thin cloud altitude + status = nf90_def_var(fileID,"clthinmeanz",nf90_float, (/dimID(1)/),varID(102)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(102),"long_name","CALIPSO Thin Cloud Altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(102),"units", "m") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(102),"standard_name", "thin_cloud_altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cldthinemis)) then + ! Thin cloud emissivity + status = nf90_def_var(fileID,"clthinemis",nf90_float, (/dimID(1)/),varID(103)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(103),"long_name","CALIPSO Thin Cloud Emissivity") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(103),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(103),"standard_name", "thin_cloud_emissivity") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cldtypemeanzse)) then + ! Opaque cloud altitude with respect to Surface Elevation + status = nf90_def_var(fileID,"clopaquemeanzse",nf90_float, (/dimID(1)/),varID(104)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(104),"long_name","CALIPSO Opaque Cloud Altitude with respect to SE") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(104),"units", "m") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(104),"standard_name", "opaque_cloud_altitude_se") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Thin cloud altitude with respect to Surface Elevation + status = nf90_def_var(fileID,"clthinmeanzse",nf90_float, (/dimID(1)/),varID(105)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(105),"long_name","CALIPSO Thin Cloud Altitude with respect to SE") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(105),"units", "m") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(105),"standard_name", "thin_cloud_altitude_se") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! z_opaque altitude with respect to Surface Elevation + status = nf90_def_var(fileID,"clzopaquecalipsose",nf90_float, (/dimID(1)/),varID(106)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(106),"long_name","CALIPSO z_opaque Altitude with respect to SE") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(106),"units", "m") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(106),"standard_name", "z_opaque_se") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + !GROUND LIDAR simulator output + if (associated(cospOUT%grLidar532_cldlayer)) then + ! Low-level cloud cover + status = nf90_def_var(fileID,"cllgrLidar532",nf90_float, (/dimID(1)/),varID(107)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(107),"long_name","GROUND LIDAR Low Level Cloud Cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(107),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(107),"standard_name", "grLidar532_low_cloud_cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Mid-level cloud cover + status = nf90_def_var(fileID,"clmgrLidar532",nf90_float, (/dimID(1)/),varID(108)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(108),"long_name","GROUND LIDAR Mid Level Cloud Cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(108),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(108),"standard_name", "grLidar532_mid_cloud_cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! High-level cloud cover + status = nf90_def_var(fileID,"clhgrLidar532",nf90_float, (/dimID(1)/),varID(109)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(109),"long_name","GROUND LIDAR High Level Cloud Cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(109),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(109),"standard_name", "grLidar532_high_cloud_cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Total cloud cover + status = nf90_def_var(fileID,"cltgrLidar532",nf90_float, (/dimID(1)/),varID(110)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(110),"long_name","GROUND LIDAR Total Cloud Cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(110),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(110),"standard_name", "grLidar532_total_cloud_cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + !3D cloud fraction + if (associated(cospOUT%grLidar532_lidarcld)) then + status = nf90_def_var(fileID,"clgrLidar532",nf90_float, (/dimID(1),dimID(4)/),varID(111)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(111),"long_name","GROUND LIDAR Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(111),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(111),"standard_name", "grLidar532_cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + !Molecular backscatter + if (associated(cospOUT%grLidar532_beta_mol)) then + status = nf90_def_var(fileID,"lidarBetaMol532gr",nf90_float, (/dimID(1),dimID(3)/),varID(112)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(112),"long_name","GROUND LIDAR Molecular Backscatter Coefficient (532nm)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(112),"units", "m-1 sr-1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(112),"standard_name", "grLidar532_volume_attenuated_backwards_scattering_function_in_air_assuming_no_aerosol_or_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + !Height-Intensity histogram (SR) + if (associated(cospOUT%grLidar532_cfad_sr)) then + status = nf90_def_var(fileID,"cfadLidarsr532gr",nf90_float, (/dimID(1),dimID(12),dimID(4)/),varID(113)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(113),"long_name","GROUND LIDAR Scattering Ratio CFAD") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(113),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(113),"standard_name", "grLidar532_histogram_of_backscattering_ratio_over_height_above_reference_ellipsoid") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%grLidar532_beta_tot)) then + status = nf90_def_var(fileID,"atb532gr",nf90_float, (/dimID(1),dimID(2),dimID(3)/),varID(114)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(114),"long_name","GROUND LIDAR Attenuated Total Backscatter (532nm)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(114),"units", "m-1 sr-1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(114),"standard_name", "volume_attenuated_backwards_scattering_function_in_air") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + if (associated(cospOUT%grLidar532_srbval) .or. associated(cospOUT%grLidar532_cfad_sr)) then + status = nf90_def_var(fileID,"SR_BINS_GR",nf90_float, (/dimID(12)/),varID(115)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(115),"long_name","GROUND LIDAR Backscattering Ratio (SR) Bin Centers") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(115),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(115),"standard_name", "backscattering_ratio") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"SR_EDGES_GR",nf90_float, (/dimID(6),dimID(12)/),varID(116)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(116),"long_name","GROUND LIDAR Backscattering Ratio (SR) Bin Bounds") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(116),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(116),"standard_name", "backscattering_ratio") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + !ATLID simulator output + if (associated(cospOUT%atlid_cldlayer)) then + ! Low-level cloud cover + status = nf90_def_var(fileID,"cllatlid",nf90_float, (/dimID(1)/),varID(117)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(117),"long_name","ATLID Low Level Cloud Cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(117),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(117),"standard_name", "atlid_low_cloud_cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Mid-level cloud cover + status = nf90_def_var(fileID,"clmatlid",nf90_float, (/dimID(1)/),varID(118)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(118),"long_name","ATLID Mid Level Cloud Cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(118),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(118),"standard_name", "atlid_mid_cloud_cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! High-level cloud cover + status = nf90_def_var(fileID,"clhatlid",nf90_float, (/dimID(1)/),varID(119)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(119),"long_name","ATLID High Level Cloud Cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(119),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(119),"standard_name", "atlid_high_cloud_cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Total cloud cover + status = nf90_def_var(fileID,"cltatlid",nf90_float, (/dimID(1)/),varID(120)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(120),"long_name","ATLID Total Cloud Cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(120),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(120),"standard_name", "atlid_total_cloud_cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + !3D cloud fraction + if (associated(cospOUT%atlid_lidarcld)) then + status = nf90_def_var(fileID,"clatlid",nf90_float, (/dimID(1),dimID(4)/),varID(121)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(121),"long_name","ATLID Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(121),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(121),"standard_name", "atlid_cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + !Molecular backscatter + if (associated(cospOUT%atlid_beta_mol)) then + status = nf90_def_var(fileID,"lidarBetaMol355",nf90_float, (/dimID(1),dimID(3)/),varID(122)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(122),"long_name","ATLID Molecular Backscatter Coefficient (355nm)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(122),"units", "m-1 sr-1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(122),"standard_name", "atlid_volume_attenuated_backwards_scattering_function_in_air_assuming_no_aerosol_or_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + !Height-Intensity histogram (SR) + if (associated(cospOUT%atlid_cfad_sr)) then + status = nf90_def_var(fileID,"cfadLidarsr355",nf90_float, (/dimID(1),dimID(12),dimID(4)/),varID(123)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(123),"long_name","ATLID Scattering Ratio CFAD") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(123),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(123),"standard_name", "atlid_histogram_of_backscattering_ratio_over_height_above_reference_ellipsoid") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%atlid_beta_tot)) then + status = nf90_def_var(fileID,"atb355",nf90_float, (/dimID(1),dimID(2),dimID(3)/),varID(124)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(124),"long_name","ATLID Attenuated Total Backscatter (355nm)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(124),"units", "m-1 sr-1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(124),"standard_name", "volume_attenuated_backwards_scattering_function_in_air") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + if (associated(cospOUT%atlid_srbval) .or. associated(cospOUT%atlid_cfad_sr)) then + status = nf90_def_var(fileID,"SR_BINS_ATLID",nf90_float, (/dimID(12)/),varID(125)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(125),"long_name","ATLID Backscattering Ratio (SR) Bin Centers") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(125),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(125),"standard_name", "backscattering_ratio") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"SR_EDGES_ATLID",nf90_float, (/dimID(6),dimID(12)/),varID(126)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(126),"long_name","ATLID Backscattering Ratio (SR) Bin Bounds") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(126),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(126),"standard_name", "backscattering_ratio") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! PARASOL simulator output + if (associated(cospOUT%parasolPix_refl)) then + status = nf90_def_var(fileID,"parasolPix_refl",nf90_float, (/dimID(1),dimID(2),dimID(13)/),varID(20)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(20),"long_name","PARASOL Subcolumn Reflectance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(20),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(20),"standard_name", "toa_bidirectional_reflectance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%parasolGrid_refl)) then + status = nf90_def_var(fileID,"parasolGrid_refl",nf90_float, (/dimID(1),dimID(13)/),varID(21)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(21),"long_name","PARASOL Reflectance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(21),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(21),"standard_name", "toa_bidirectional_reflectance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%parasolPix_refl) .or.associated(cospOUT%parasolGrid_refl)) then + status = nf90_def_var(fileID,"PARASOL_NREFL",nf90_float, (/dimID(13)/),varID(87)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(87),"long_name","PARASOL Solar Zenith Angle") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(87),"units", "degree") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(87),"standard_name", "solar_zenith_angle") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! Cloudsat simulator output + if (associated(cospOUT%cloudsat_Ze_tot)) then + status = nf90_def_var(fileID,"dbze94",nf90_float, (/dimID(1),dimID(2),dimID(3)/),varID(22)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(22),"long_name","CloudSat Radar Reflectivity") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(22),"units", "dBZ") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(22),"standard_name", "equivalent_reflectivity_factor") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%cloudsat_cfad_ze)) then + status = nf90_def_var(fileID,"cfadDbze94",nf90_float, (/dimID(1),dimID(14),dimID(4)/),varID(23)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(23),"long_name","CloudSat Radar reflectivity CFAD") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(23),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(23),"standard_name", "histogram_of_equivalent_reflectivity_factor_over_height_above_reference_ellipsoid") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"cloudsat_DBZE_BINS",nf90_float, (/dimID(14)/),varID(88)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(88),"long_name","CloudSat simulator equivalent radar reflectivity factor") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(88),"units", "dBZ") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(88),"standard_name", "equivalent_reflectivity_factor") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%cloudsat_precip_cover)) then + status = nf90_def_var(fileID,"ptcloudsatflag0",nf90_float, (/dimID(1)/),varID(127)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(127),"long_name","Cloudsat precipitation cover for flag0") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(127),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"ptcloudsatflag1",nf90_float, (/dimID(1)/),varID(128)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(128),"long_name","Cloudsat precipitation cover for flag1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(128),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"ptcloudsatflag2",nf90_float, (/dimID(1)/),varID(129)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(129),"long_name","Cloudsat precipitation cover for flag2") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(129),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"ptcloudsatflag3",nf90_float, (/dimID(1)/),varID(130)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(130),"long_name","Cloudsat precipitation cover for flag3") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(130),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"ptcloudsatflag4",nf90_float, (/dimID(1)/),varID(131)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(131),"long_name","Cloudsat precipitation cover for flag4") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(131),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"ptcloudsatflag5",nf90_float, (/dimID(1)/),varID(132)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(132),"long_name","Cloudsat precipitation cover for flag5") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(132),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"ptcloudsatflag6",nf90_float, (/dimID(1)/),varID(133)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(133),"long_name","Cloudsat precipitation cover for flag6") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(133),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"ptcloudsatflag7",nf90_float, (/dimID(1)/),varID(134)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(134),"long_name","Cloudsat precipitation cover for flag7") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(134),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"ptcloudsatflag8",nf90_float, (/dimID(1)/),varID(135)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(135),"long_name","Cloudsat precipitation cover for flag8") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(135),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"ptcloudsatflag9",nf90_float, (/dimID(1)/),varID(136)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(136),"long_name","Cloudsat precipitation cover for flag9") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(136),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%cloudsat_pia)) then + status = nf90_def_var(fileID,"cloudsatpia",nf90_float, (/dimID(1)/),varID(137)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(137),"long_name","Cloudsat path integrated attenuation") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(137),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! ISCCP simulator outputs + if (associated(cospOUT%isccp_totalcldarea)) then + status = nf90_def_var(fileID,"cltisccp",nf90_float, (/dimID(1)/),varID(24)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(24),"long_name","ISCCP Total Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(24),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(24),"standard_name", "cloud_area_fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_meantb)) then + status = nf90_def_var(fileID,"meantbisccp",nf90_float, (/dimID(1)/),varID(25)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(25),"long_name","ISCCP all-sky 10.5 micron brightness temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(25),"units", "K") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(25),"standard_name", "toa_brightness_temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_meantbclr)) then + status = nf90_def_var(fileID,"meantbclrisccp",nf90_float, (/dimID(1)/),varID(26)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(26),"long_name","ISCCP clear-sky 10.5 micron brightness temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(26),"units", "K") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(26),"standard_name", "toa_brightness_temperature_assuming_clear_sky") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_meanptop)) then + status = nf90_def_var(fileID,"pctisccp",nf90_float, (/dimID(1)/),varID(27)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(27),"long_name","ISCCP Mean Cloud Top Pressure") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(27),"units", "hPa") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(27),"standard_name", "air_pressure_at_cloud_top") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_meantaucld)) then + status = nf90_def_var(fileID,"tauisccp",nf90_float, (/dimID(1)/),varID(28)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(28),"long_name","ISCCP Mean Optical Depth") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(28),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(28),"standard_name", "atmosphere_optical_thickness_due_to_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_meanalbedocld)) then + status = nf90_def_var(fileID,"albisccp",nf90_float, (/dimID(1)/),varID(29)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(29),"long_name","ISCCP Mean Cloud Albedo") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(29),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(29),"standard_name", "cloud_albedo") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_boxtau)) then + status = nf90_def_var(fileID,"boxtauisccp",nf90_float, (/dimID(1),dimID(2)/),varID(30)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(30),"long_name","ISCCP Subcolumn Optical Depth") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(30),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(30),"standard_name", "atmosphere_optical_thickness_due_to_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_boxptop)) then + status = nf90_def_var(fileID,"boxptopisccp",nf90_float, (/dimID(1),dimID(2)/),varID(31)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(31),"long_name","ISCCP Subcolumn Cloud Top Pressure") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(31),"units", "Pa") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(31),"standard_name", "air_pressure_at_cloud_top") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_fq)) then + status = nf90_def_var(fileID,"clisccp",nf90_float, (/dimID(1),dimID(5),dimID(7)/),varID(32)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(32),"long_name","ISCCP joint-PDF of cloud top pressure and optical depth") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(32),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(32),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! MISR simulator output + if (associated(cospOUT%misr_fq)) then + status = nf90_def_var(fileID,"clMISR",nf90_float, (/dimID(1),dimID(5),dimID(8)/),varID(33)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(33),"long_name","MISR joint-PDF of cloud top pressure and optical depth") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(33),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(33),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%misr_meanztop)) then + status = nf90_def_var(fileID,"misr_meanztop",nf90_float, (/dimID(1)/),varID(34)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(34),"long_name","MISR Mean Cloud Top Height") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(34),"units", "m") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(34),"standard_name", "cloud_top_altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%misr_cldarea)) then + status = nf90_def_var(fileID,"misr_cldarea",nf90_float, (/dimID(1)/),varID(35)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(35),"long_name","MISR cloud cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(35),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(35),"standard_name", "cloud_area_fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! MODIS simulator output + if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) then + status = nf90_def_var(fileID,"cltmodis",nf90_float, (/dimID(1)/),varID(36)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(36),"long_name","MODIS Total Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(36),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(36),"standard_name", "cloud_area_fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) then + status = nf90_def_var(fileID,"clwmodis",nf90_float, (/dimID(1)/),varID(37)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(37),"long_name","MODIS Liquid Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(37),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(37),"standard_name", "cloud_area_fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) then + status = nf90_def_var(fileID,"climodis",nf90_float, (/dimID(1)/),varID(38)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(38),"long_name","MODIS Ice Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(38),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(38),"standard_name", "cloud_area_fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) then + status = nf90_def_var(fileID,"clhmodis",nf90_float, (/dimID(1)/),varID(39)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(39),"long_name","MODIS High Level Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(39),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(39),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) then + status = nf90_def_var(fileID,"clmmodis",nf90_float, (/dimID(1)/),varID(40)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(40),"long_name","MODIS Mid Level Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(40),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(40),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) then + status = nf90_def_var(fileID,"cllmodis",nf90_float, (/dimID(1)/),varID(41)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(41),"long_name","MODIS Low Level Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(41),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(41),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) then + status = nf90_def_var(fileID,"tautmodis",nf90_float, (/dimID(1)/),varID(42)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(42),"long_name","MODIS Total Cloud Optical Thickness") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(42),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(42),"standard_name", "atmosphere_optical_thickness_due_to_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) then + status = nf90_def_var(fileID,"tauwmodis",nf90_float, (/dimID(1)/),varID(43)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(43),"long_name","MODIS Liquid Cloud Optical Thickness") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(43),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(43),"standard_name", "atmosphere_optical_thickness_due_to_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) then + status = nf90_def_var(fileID,"tauimodis",nf90_float, (/dimID(1)/),varID(44)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(44),"long_name","MODIS Ice Cloud Optical Thickness") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(44),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(44),"standard_name", "atmosphere_optical_thickness_due_to_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_Total_logMean)) then + status = nf90_def_var(fileID,"tautlogmodis",nf90_float, (/dimID(1)/),varID(45)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(45),"long_name","MODIS Total Cloud Optical Thickness (Log10 Mean)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(45),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(45),"standard_name", "atmosphere_optical_thickness_due_to_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_Water_logMean)) then + status = nf90_def_var(fileID,"tauwlogmodis",nf90_float, (/dimID(1)/),varID(46)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(46),"long_name","MODIS Liquid Cloud Optical Thickness (Log10 Mean)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(46),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(46),"standard_name", "atmosphere_optical_thickness_due_to_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_Ice_logMean)) then + status = nf90_def_var(fileID,"tauilogmodis",nf90_float, (/dimID(1)/),varID(47)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(47),"long_name","MODIS Ice Cloud Optical Thickness (Log10 Mean)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(47),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(47),"standard_name", "atmosphere_optical_thickness_due_to_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) then + status = nf90_def_var(fileID,"reffclwmodis",nf90_float, (/dimID(1)/),varID(48)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(48),"long_name","MODIS Liquid Cloud Particle Size") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(48),"units", "m") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(48),"standard_name", "effective_radius_of_cloud_liquid_water_particle") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) then + status = nf90_def_var(fileID,"reffclimodis",nf90_float, (/dimID(1)/),varID(49)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(49),"long_name","MODIS Ice Cloud Particle Size") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(49),"units", "m") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(49),"standard_name", "effective_radius_of_cloud_liquid_water_particle") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) then + status = nf90_def_var(fileID,"pctmodis",nf90_float, (/dimID(1)/),varID(50)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(50),"long_name","MODIS Cloud Top Pressure") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(50),"units", "hPa") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(50),"standard_name", "air_pressure_at_cloud_top") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) then + status = nf90_def_var(fileID,"lwpmodis",nf90_float, (/dimID(1)/),varID(51)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(51),"long_name","MODIS Cloud Liquid Water Path") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(51),"units", "kg m-2") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(51),"standard_name", "atmosphere_cloud_liquid_water_content") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Ice_Water_Path_Mean)) then + status = nf90_def_var(fileID,"iwpmodis",nf90_float, (/dimID(1)/),varID(52)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(52),"long_name","MODIS Cloud Ice Water Path") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(52),"units", "kg m-2") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(52),"standard_name", "atmosphere_mass_content_of_cloud_ice") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) then + status = nf90_def_var(fileID,"clmodis",nf90_float, (/dimID(1),dimID(5),dimID(7)/),varID(53)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(53),"long_name","MODIS joint-PDF of cloud top pressure and optical depth") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(53),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(53),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) then + status = nf90_def_var(fileID,"clmodis_liq",nf90_float, (/dimID(1),dimID(5),dimID(7)/),varID(148)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(148),"long_name","MODIS joint-PDF of liquid cloud top pressure and optical depth") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(148),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(148),"standard_name", "cloud_area_fraction_in_atmosphere_layer_liq") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) then + status = nf90_def_var(fileID,"clmodis_ice",nf90_float, (/dimID(1),dimID(5),dimID(7)/),varID(149)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(149),"long_name","MODIS joint-PDF of ice cloud top pressure and optical depth") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(149),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(149),"standard_name", "cloud_area_fraction_in_atmosphere_layer_ice") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) then + status = nf90_def_var(fileID,"modis_Optical_Thickness_vs_ReffICE",nf90_float, (/dimID(1),dimID(5),dimID(16)/),varID(54)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(54),"long_name","MODIS Joint-PDF of optical-depth and ice particle size") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(54),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"REICE_MODIS",nf90_float, (/dimID(16)/),varID(89)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(89),"long_name","MODIS Joint-PDF ice particle size bin centers") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(89),"units", "meters") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) then + status = nf90_def_var(fileID,"modis_Optical_Thickness_vs_ReffLIQ",nf90_float, (/dimID(1),dimID(5),dimID(15)/),varID(55)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(55),"long_name","MODIS Joint-PDF of optical-depth and liquid particle size") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(55),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"RELIQ_MODIS",nf90_float, (/dimID(15)/),varID(90)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(90),"long_name","MODIS Joint-PDF liquid particle size bin centers") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(90),"units", "meters") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! Joint simulator products. + if (associated(cospOUT%lidar_only_freq_cloud)) then + status = nf90_def_var(fileID,"clcalipso2",nf90_float, (/dimID(1),dimID(4)/),varID(56)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(56),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(56),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(56),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%radar_lidar_tcc)) then + status = nf90_def_var(fileID,"cltlidarradar",nf90_float, (/dimID(1)/),varID(57)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(57),"long_name","CALIPSO and CloudSat Total Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(57),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(57),"standard_name", "cloud_area_fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%cloudsat_tcc)) then + status = nf90_def_var(fileID,"cloudsat_tcc",nf90_float, (/dimID(1)/),varID(138)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(138),"long_name","CloudSat Total Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(138),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(138),"standard_name", "cloud_area_fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%cloudsat_tcc2)) then + status = nf90_def_var(fileID,"cloudsat_tcc2",nf90_float, (/dimID(1)/),varID(139)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(139),"long_name","CloudSat Total Cloud Fraction (no 1km)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(139),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(139),"standard_name", "cloud_area_fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + ! warm-rain occurrence frequency diagnostics + if (associated(cospOUT%wr_occfreq_ntotal)) then + status = nf90_def_var(fileID,"npdfcld",nf90_float, (/dimID(1)/),varID(140)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(140),"long_name","# of Non-Precipitating Clouds") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(140),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(140),"standard_name", "number_of_slwc_nonprecip") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"npdfdrz",nf90_float, (/dimID(1)/),varID(141)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(141),"long_name","# of Drizzling Clouds") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(141),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(141),"standard_name", "number_of_slwc_drizzle") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"npdfrain",nf90_float, (/dimID(1)/),varID(142)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(142),"long_name","# of Precipitating Clouds") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(142),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(142),"standard_name", "number_of_slwc_precip") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + ! Contoured Frequency by Optical Depth Diagram (CFODD) + if (associated(cospOUT%cfodd_ntotal)) then + status = nf90_def_var(fileID,"ncfodd1",nf90_float, (/dimID(1),dimID(17),dimID(18)/),varID(143)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(143),"long_name","# of CFODD (05 < Reff < 12 micron)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(143),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(143),"standard_name", "cfodd_reff_small") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"ncfodd2",nf90_float, (/dimID(1),dimID(17),dimID(18)/),varID(144)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(144),"long_name","# of CFODD (12 < Reff < 18 micron)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(144),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(144),"standard_name", "cfodd_reff_medium") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"ncfodd3",nf90_float, (/dimID(1),dimID(17),dimID(18)/),varID(145)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(145),"long_name","# of CFODD (18 < Reff < 35 micron)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(145),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(145),"standard_name", "cfodd_reff_large") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + !! axes for CFODD + status = nf90_def_var(fileID,"CFODD_NDBZE",nf90_float,(/dimID(17)/),varID(146)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(146),"long_name","CloudSat+MODIS dBZe vs ICOD joint PDF X-axis") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(146),"units", "dBZ") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(146),"standard_name", "cloudsat_quivalent_reflectivity_factor") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"CFODD_NICOD",nf90_float,(/dimID(18)/),varID(147)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(147),"long_name","CloudSat+MODIS dBZe vs ICOD joint PDF Y-axis") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(147),"units", "none") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(147),"standard_name", "modis_in-cloud_optical_depth") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! added by DPLRW + if (associated(cospOUT%dplrw_Z)) then + ! axes + status = nf90_def_var(fileID,"lvtemp_grid",nf90_float,(/dimID(19)/),varID(150)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(150),"long_name","Temperature axis for DPLRW CFED") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(150),"units", "degree C") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"lvdBZe_grid",nf90_float,(/dimID(20)/),varID(151)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(151),"long_name","dBZe axis for DPLRW CFED") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(151),"units", "dBZe") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"lvdplr_grid",nf90_float,(/dimID(21)/),varID(152)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(152),"long_name","Doppler velocity axis for DPLRW CFED") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(152),"units", "m/s") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"lvspwd_grid",nf90_float,(/dimID(22)/),varID(153)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(153),"long_name","spectrum width axis for DPLRW CFED") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(153),"units", "m/s") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"regimeID",nf90_INT,(/dimID(23)/),varID(154)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(154),"long_name","regime ID: 0=ALL, 1=LS, 2=CU") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(154),"units", "None") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"nrmlzdID",nf90_INT,(/dimID(24)/),varID(155)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(155),"long_name","normalized ID: 1=Ze, 2=mass, 3=number") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(155),"units", "None") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + ! variables + status = nf90_def_var(fileID,"dplrw_Z",nf90_float,(/dimID(1),dimID(21),dimID(4),dimID(23)/),varID(156)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(156),"long_name","Number of samples onto histogram, Doppler velocity/Altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(156),"units", "#") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"spwid_Z",nf90_float,(/dimID(1),dimID(22),dimID(4),dimID(23)/),varID(157)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(157),"long_name","Number of samples onto histogram, Spectrum width/Altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(157),"units", "#") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"Zef94_Z",nf90_float,(/dimID(1),dimID(20),dimID(4),dimID(23)/),varID(158)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(158),"long_name","Number of samples onto histogram, Radar reflectivity/Altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(158),"units", "#") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + status = nf90_def_var(fileID,"dplrw_T",nf90_float,(/dimID(1),dimID(21),dimID(19),dimID(23)/),varID(159)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(159),"long_name","Number of samples onto histogram, Doppler velocity/Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(159),"units", "#") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"spwid_T",nf90_float,(/dimID(1),dimID(22),dimID(19),dimID(23)/),varID(160)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(160),"long_name","Number of samples onto histogram, Spectrum width/Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(160),"units", "#") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"Zef94_T",nf90_float,(/dimID(1),dimID(20),dimID(19),dimID(23)/),varID(161)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(161),"long_name","Number of samples onto histogram, Radar reflectivity/Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(161),"units", "#") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + status = nf90_def_var(fileID,"ZefVd_2",nf90_float,(/dimID(1),dimID(21),dimID(20),dimID(23)/),varID(162)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(162),"long_name","Number of samples onto histogram, Radar reflectivity/Doppler velocity") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(162),"units", "#") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + status = nf90_def_var(fileID,"gwcum",nf90_float,(/dimID(1),dimID(3)/),varID(163)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(163),"long_name","in-cloud cumulus upward velocity") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(163),"units", "m/s") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + !~~~ + status = nf90_def_var(fileID,"vfall_Z",nf90_float,(/dimID(1),dimID(21),dimID(4),dimID(23),dimID(24)/),varID(164)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(164),"long_name","Number of samples onto histogram, terminal velocity/Altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(164),"units", "#") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"gridw_Z",nf90_float,(/dimID(1),dimID(21),dimID(4),dimID(23)/),varID(165)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(165),"long_name","Number of samples onto histogram, grid w velocity/Altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(165),"units", "#") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + status = nf90_def_var(fileID,"vfall_T",nf90_float,(/dimID(1),dimID(21),dimID(19),dimID(23),dimID(24)/),varID(166)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(166),"long_name","Number of samples onto histogram, terminal velocity/Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(166),"units", "#") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"gridw_T",nf90_float,(/dimID(1),dimID(21),dimID(19),dimID(23)/),varID(167)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(167),"long_name","Number of samples onto histogram, grid w velocity/Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(167),"units", "#") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + status = nf90_def_var(fileID,"ZefVf_2",nf90_float,(/dimID(1),dimID(21),dimID(20),dimID(23),dimID(24)/),varID(168)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(168),"long_name","Number of samples onto histogram, Radar reflectivity/terminal velocity") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(168),"units", "#") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + end if + + + ! --------------------------------------------------------------------------------------- + ! RTTOV - JKS + ! --------------------------------------------------------------------------------------- + + ! Define instrument channel indices for multiple RTTOV instruments + ii = 169 ! RTTOV variable indices start at 170 + if (allocated(cospOUT%rttov_outputs)) then + do i=1,Ninst_rttov + write (i_str,fmt) i ! converting integer to string i_str using a 'internal file' + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) then + ii = ii + 1 + status = nf90_def_var(fileID,"RTTOV_CHAN_INST"//trim(i_str),nf90_float, (/dimID(24+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Channel Indices") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_ichan") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%bt_total)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_bt_total_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV All-sky Brightness Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "Degrees Kelvin") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_allsky_bt") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_bt_clear_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Clear-sky Brightness Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "Degrees Kelvin") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_clearsky_bt") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%rad_total)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_rad_total_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV All-sky Radiance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_allsky_rad") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_rad_clear_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Clear-sky Radiance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_clearsky_rad") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_rad_cloudy_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Cloudy-sky Radiance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_cloudysky_rad") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%refl_total)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_refl_total_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV All-sky Reflectance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "unitless") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "bleh") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_refl_clear_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Clear-sky Reflectance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "unitless") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_allsky_refl") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_bt_clear_pc_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","PC-RTTOV Clear-sky Brightness Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "Degrees Kelvin") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "pcrttov_clearsky_bt") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_rad_clear_pc_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","PC-RTTOV Clear-sky Radiance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "pcrttov_clearsky_rad") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + end do + end if + + + ! --------------------------------------------------------------------------------------- + ! RTTOV - JKS + ! --------------------------------------------------------------------------------------- + + ! Define instrument channel indices for multiple RTTOV instruments + ii = 165 ! RTTOV variable indices start at 165 + if (allocated(cospOUT%rttov_outputs)) then + do i=1,Ninst_rttov + write (i_str,fmt) i ! converting integer to string i_str using a 'internal file' + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) then + ii = ii + 1 + status = nf90_def_var(fileID,"RTTOV_CHAN_INST"//trim(i_str),nf90_float, (/dimID(20+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Channel Indices") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_ichan") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%bt_total)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_bt_total_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV All-sky Brightness Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "Degrees Kelvin") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_allsky_bt") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_bt_clear_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Clear-sky Brightness Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "Degrees Kelvin") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_clearsky_bt") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%rad_total)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_rad_total_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV All-sky Radiance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_allsky_rad") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_rad_clear_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Clear-sky Radiance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_clearsky_rad") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_rad_cloudy_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Cloudy-sky Radiance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_cloudysky_rad") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%refl_total)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_refl_total_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV All-sky Reflectance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "unitless") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "bleh") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_refl_clear_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Clear-sky Reflectance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "unitless") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_allsky_refl") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_bt_clear_pc_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","PC-RTTOV Clear-sky Brightness Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "Degrees Kelvin") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "pcrttov_clearsky_bt") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_rad_clear_pc_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","PC-RTTOV Clear-sky Radiance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "pcrttov_clearsky_rad") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + end do + end if + + ! --------------------------------------------------------------------------------------- + ! Exit define mode + ! --------------------------------------------------------------------------------------- + status = nf90_enddef(fileID) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + ! --------------------------------------------------------------------------------------- + ! Populate outputs + ! --------------------------------------------------------------------------------------- + ! Geo + status = nf90_put_var(fileID,varID(1),lon) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(2),lat) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Joint-histogram axis variables + status = nf90_put_var(fileID,varID(3),tau_binCenters) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(4),tau_binEdges) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(5),pres_binCenters) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(6),pres_binEdges) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(7),hgt_binCenters) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(8),hgt_binEdges) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(84),lev) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(85),vgrid_z) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(86),cosp_scol) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(82),bnds) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(83),loc) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! added by DPLRW + status = nf90_put_var(fileID,varID(150),lvtemp_grid) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(151),lvdBZe_grid) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(152),lvdplr_grid) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(153),lvspwd_grid) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(154),(/0,1,2/) ) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(155),(/1,2,3/) ) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + ! CALIPSO simulator output + if (associated(cospOUT%calipso_betaperp_tot)) then + status = nf90_put_var(fileID,varID(9),cospOUT%calipso_betaperp_tot) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_beta_tot)) then + status = nf90_put_var(fileID,varID(10),cospOUT%calipso_beta_tot) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_lidarcldphase)) then + status = nf90_put_var(fileID,varID(58),cospOUT%calipso_lidarcldphase(:,:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(59),cospOUT%calipso_lidarcldphase(:,:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(60),cospOUT%calipso_lidarcldphase(:,:,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cldlayerphase)) then + ! Ice + status = nf90_put_var(fileID,varID(61),cospOUT%calipso_cldlayerphase(:,1,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(62),cospOUT%calipso_cldlayerphase(:,2,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(63),cospOUT%calipso_cldlayerphase(:,3,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(64),cospOUT%calipso_cldlayerphase(:,4,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Liquid + status = nf90_put_var(fileID,varID(65),cospOUT%calipso_cldlayerphase(:,1,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(66),cospOUT%calipso_cldlayerphase(:,2,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(67),cospOUT%calipso_cldlayerphase(:,3,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(68),cospOUT%calipso_cldlayerphase(:,4,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Undetermined + status = nf90_put_var(fileID,varID(69),cospOUT%calipso_cldlayerphase(:,1,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(70),cospOUT%calipso_cldlayerphase(:,2,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(71),cospOUT%calipso_cldlayerphase(:,3,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(72),cospOUT%calipso_cldlayerphase(:,4,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_lidarcldtmp)) then + status = nf90_put_var(fileID,varID(77),cospOUT%calipso_lidarcldtmp(:,:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(78),cospOUT%calipso_lidarcldtmp(:,:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(79),cospOUT%calipso_lidarcldtmp(:,:,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(80),cospOUT%calipso_lidarcldtmp(:,:,4)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cfad_sr)) then + status = nf90_put_var(fileID,varID(15),cospOUT%calipso_cfad_sr) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_lidarcld)) then + status = nf90_put_var(fileID,varID(16),cospOUT%calipso_lidarcld) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cldlayer)) then + status = nf90_put_var(fileID,varID(73),cospOUT%calipso_cldlayer(:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(74),cospOUT%calipso_cldlayer(:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(75),cospOUT%calipso_cldlayer(:,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(76),cospOUT%calipso_cldlayer(:,4)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_beta_mol)) then + status = nf90_put_var(fileID,varID(18),cospOUT%calipso_beta_mol) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_srbval)) then + status = nf90_put_var(fileID,varID(19),reshape([cospOUT%calipso_srbval(1:SR_BINS),cospOUT%calipso_srbval(2:SR_BINS+1)],(/2,SR_BINS/))) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_srbval) .or. associated(cospOUT%calipso_cfad_sr)) then + status = nf90_put_var(fileID,varID(81),calipso_binCenters) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + !OPAQ diagnostics + if (associated(cospOUT%calipso_cldtype)) then + status = nf90_put_var(fileID,varID(91),cospOUT%calipso_cldtype(:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(92),cospOUT%calipso_cldtype(:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(93),cospOUT%calipso_cldtype(:,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_lidarcldtype)) then + status = nf90_put_var(fileID,varID(94),cospOUT%calipso_lidarcldtype(:,:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(95),cospOUT%calipso_lidarcldtype(:,:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(96),cospOUT%calipso_lidarcldtype(:,:,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(97),cospOUT%calipso_lidarcldtype(:,:,4)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cldtypetemp)) then + status = nf90_put_var(fileID,varID(98),cospOUT%calipso_cldtypetemp(:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(99),cospOUT%calipso_cldtypetemp(:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(100),cospOUT%calipso_cldtypetemp(:,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cldtypemeanz)) then + status = nf90_put_var(fileID,varID(101),cospOUT%calipso_cldtypemeanz(:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(102),cospOUT%calipso_cldtypemeanz(:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cldthinemis)) then + status = nf90_put_var(fileID,varID(103),cospOUT%calipso_cldthinemis) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cldtypemeanzse)) then + status = nf90_put_var(fileID,varID(104),cospOUT%calipso_cldtypemeanzse(:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(105),cospOUT%calipso_cldtypemeanzse(:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(106),cospOUT%calipso_cldtypemeanzse(:,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! GROUND LIDAR simulator output + if (associated(cospOUT%grLidar532_cldlayer)) then + status = nf90_put_var(fileID,varID(107),cospOUT%grLidar532_cldlayer(:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(108),cospOUT%grLidar532_cldlayer(:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(109),cospOUT%grLidar532_cldlayer(:,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(110),cospOUT%grLidar532_cldlayer(:,4)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%grLidar532_lidarcld)) then + status = nf90_put_var(fileID,varID(111),cospOUT%grLidar532_lidarcld) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%grLidar532_beta_mol)) then + status = nf90_put_var(fileID,varID(112),cospOUT%grLidar532_beta_mol) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%grLidar532_cfad_sr)) then + status = nf90_put_var(fileID,varID(113),cospOUT%grLidar532_cfad_sr) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%grLidar532_beta_tot)) then + status = nf90_put_var(fileID,varID(114),cospOUT%grLidar532_beta_tot) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + if (associated(cospOUT%grLidar532_srbval)) then + status = nf90_put_var(fileID,varID(116),reshape([cospOUT%grLidar532_srbval(1:SR_BINS),cospOUT%grLidar532_srbval(2:SR_BINS+1)],(/2,SR_BINS/))) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%grLidar532_srbval) .or. associated(cospOUT%grLidar532_cfad_sr)) then + status = nf90_put_var(fileID,varID(115),grLidar532_binCenters) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! ATLID simulator output + if (associated(cospOUT%atlid_cldlayer)) then + status = nf90_put_var(fileID,varID(117),cospOUT%atlid_cldlayer(:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(118),cospOUT%atlid_cldlayer(:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(119),cospOUT%atlid_cldlayer(:,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(120),cospOUT%atlid_cldlayer(:,4)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%atlid_lidarcld)) then + status = nf90_put_var(fileID,varID(121),cospOUT%atlid_lidarcld) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%atlid_beta_mol)) then + status = nf90_put_var(fileID,varID(122),cospOUT%atlid_beta_mol) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%atlid_cfad_sr)) then + status = nf90_put_var(fileID,varID(123),cospOUT%atlid_cfad_sr) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%atlid_beta_tot)) then + status = nf90_put_var(fileID,varID(124),cospOUT%atlid_beta_tot) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + if (associated(cospOUT%atlid_srbval)) then + status = nf90_put_var(fileID,varID(126),reshape([cospOUT%atlid_srbval(1:SR_BINS),cospOUT%atlid_srbval(2:SR_BINS+1)],(/2,SR_BINS/))) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%atlid_srbval) .or. associated(cospOUT%atlid_cfad_sr)) then + status = nf90_put_var(fileID,varID(125),atlid_binCenters) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! PARASOL simulator output + if (associated(cospOUT%parasolPix_refl)) then + status = nf90_put_var(fileID,varID(20),cospOUT%parasolPix_refl) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%parasolGrid_refl)) then + status = nf90_put_var(fileID,varID(21),cospOUT%parasolGrid_refl) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%parasolPix_refl) .or.associated(cospOUT%parasolGrid_refl)) then + status = nf90_put_var(fileID,varID(87),PARASOL_SZA) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! Cloudsat simulator output + if (associated(cospOUT%cloudsat_Ze_tot)) then + status = nf90_put_var(fileID,varID(22),cospOUT%cloudsat_Ze_tot) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%cloudsat_cfad_ze)) then + status = nf90_put_var(fileID,varID(23),cospOUT%cloudsat_cfad_ze) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(88),cloudsat_binCenters) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%cloudsat_precip_cover)) then + status = nf90_put_var(fileID,varID(127),cospOUT%cloudsat_precip_cover(:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(128),cospOUT%cloudsat_precip_cover(:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(129),cospOUT%cloudsat_precip_cover(:,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(130),cospOUT%cloudsat_precip_cover(:,4)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(131),cospOUT%cloudsat_precip_cover(:,5)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(132),cospOUT%cloudsat_precip_cover(:,6)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(133),cospOUT%cloudsat_precip_cover(:,7)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(134),cospOUT%cloudsat_precip_cover(:,8)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(135),cospOUT%cloudsat_precip_cover(:,9)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(136),cospOUT%cloudsat_precip_cover(:,10)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%cloudsat_pia)) then + status = nf90_put_var(fileID,varID(137),cospOUT%cloudsat_pia) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + if (associated(cospOUT%isccp_totalcldarea)) then + status = nf90_put_var(fileID,varID(24),cospOUT%isccp_totalcldarea) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_meantb)) then + status = nf90_put_var(fileID,varID(25),cospOUT%isccp_meantb) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_meantbclr)) then + status = nf90_put_var(fileID,varID(26),cospOUT%isccp_meantbclr) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_meanptop)) then + status = nf90_put_var(fileID,varID(27),cospOUT%isccp_meanptop) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_meantaucld)) then + status = nf90_put_var(fileID,varID(28),cospOUT%isccp_meantaucld) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_meanalbedocld)) then + status = nf90_put_var(fileID,varID(29),cospOUT%isccp_meanalbedocld) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_boxtau)) then + status = nf90_put_var(fileID,varID(30),cospOUT%isccp_boxtau) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_boxptop)) then + status = nf90_put_var(fileID,varID(31),cospOUT%isccp_boxptop) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_fq)) then + status = nf90_put_var(fileID,varID(32),cospOUT%isccp_fq) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + ! MISR simulator output + if (associated(cospOUT%misr_fq)) then + status = nf90_put_var(fileID,varID(33),cospOUT%misr_fq) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%misr_meanztop)) then + status = nf90_put_var(fileID,varID(34),cospOUT%misr_meanztop) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%misr_cldarea)) then + status = nf90_put_var(fileID,varID(35),cospOUT%misr_cldarea) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + ! MODIS simulator output + if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) then + status = nf90_put_var(fileID,varID(36),cospOUT%modis_Cloud_Fraction_Total_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) then + status = nf90_put_var(fileID,varID(37),cospOUT%modis_Cloud_Fraction_Water_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) then + status = nf90_put_var(fileID,varID(38),cospOUT%modis_Cloud_Fraction_Ice_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) then + status = nf90_put_var(fileID,varID(39),cospOUT%modis_Cloud_Fraction_High_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) then + status = nf90_put_var(fileID,varID(40),cospOUT%modis_Cloud_Fraction_Mid_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) then + status = nf90_put_var(fileID,varID(41),cospOUT%modis_Cloud_Fraction_Low_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) then + status = nf90_put_var(fileID,varID(42),cospOUT%modis_Optical_Thickness_Total_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) then + status = nf90_put_var(fileID,varID(43),cospOUT%modis_Optical_Thickness_Water_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) then + status = nf90_put_var(fileID,varID(44),cospOUT%modis_Optical_Thickness_Ice_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) then + status = nf90_put_var(fileID,varID(45),cospOUT%modis_Optical_Thickness_Total_LogMean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) then + status = nf90_put_var(fileID,varID(46),cospOUT%modis_Optical_Thickness_Water_LogMean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) then + status = nf90_put_var(fileID,varID(47),cospOUT%modis_Optical_Thickness_Ice_LogMean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) then + status = nf90_put_var(fileID,varID(48),cospOUT%modis_Cloud_Particle_Size_Water_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) then + status = nf90_put_var(fileID,varID(49),cospOUT%modis_Cloud_Particle_Size_Ice_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) then + status = nf90_put_var(fileID,varID(50),cospOUT%modis_Cloud_Top_Pressure_Total_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) then + status = nf90_put_var(fileID,varID(51),cospOUT%modis_Liquid_Water_Path_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Ice_Water_Path_Mean)) then + status = nf90_put_var(fileID,varID(52),cospOUT%modis_Ice_Water_Path_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) then + status = nf90_put_var(fileID,varID(53),cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) then + status = nf90_put_var(fileID,varID(148),cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) then + status = nf90_put_var(fileID,varID(149),cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) then + status = nf90_put_var(fileID,varID(54),cospOUT%modis_Optical_Thickness_vs_ReffICE) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(89),reffICE_binCenters) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) then + status = nf90_put_var(fileID,varID(55),cospOUT%modis_Optical_Thickness_vs_ReffLIQ) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(90),reffLIQ_binCenters) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + if (associated(cospOUT%lidar_only_freq_cloud)) then + status = nf90_put_var(fileID,varID(56),cospOUT%lidar_only_freq_cloud) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%radar_lidar_tcc)) then + status = nf90_put_var(fileID,varID(57),cospOUT%radar_lidar_tcc) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%cloudsat_tcc)) then + status = nf90_put_var(fileID,varID(138),cospOUT%cloudsat_tcc) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%cloudsat_tcc2)) then + status = nf90_put_var(fileID,varID(139),cospOUT%cloudsat_tcc2) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! Cloudsat+MODIS Joint simulators output + !! warm-rain occurrence frequency diagnostics + if (associated(cospOUT%wr_occfreq_ntotal)) then + status = nf90_put_var(fileID,varID(140),cospOUT%wr_occfreq_ntotal(:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(141),cospOUT%wr_occfreq_ntotal(:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(142),cospOUT%wr_occfreq_ntotal(:,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + !! Contoured Frequency by Optical Depth Diagram (CFODD) + if (associated(cospOUT%cfodd_ntotal)) then + status = nf90_put_var(fileID,varID(143),cospOUT%cfodd_ntotal(:,:,:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(144),cospOUT%cfodd_ntotal(:,:,:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(145),cospOUT%cfodd_ntotal(:,:,:,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(146),CFODD_HISTDBZEcenters) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(147),CFODD_HISTICODcenters) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! added by DPLRW + if (associated(cospOUT%dplrw_Z))then + status = nf90_put_var(fileID,varID(156),cospOUT%dplrw_Z) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(157),cospOUT%spwid_Z) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(158),cospOUT%Zef94_Z) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + status = nf90_put_var(fileID,varID(159),cospOUT%dplrw_T) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(160),cospOUT%spwid_T) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(161),cospOUT%Zef94_T) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + status = nf90_put_var(fileID,varID(162),cospOUT%ZefVd_2) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + status = nf90_put_var(fileID,varID(163),cospOUT%gcumw) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + status = nf90_put_var(fileID,varID(164),cospOUT%vfall_Z) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(165),cospOUT%gridw_Z) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + status = nf90_put_var(fileID,varID(166),cospOUT%vfall_T) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(167),cospOUT%gridw_T) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + status = nf90_put_var(fileID,varID(168),cospOUT%ZefVf_2) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + end if + + ! Define instrument channel indices for multiple RTTOV instruments + ii = 169 ! RTTOV variable indices start at 170 + if (allocated(cospOUT%rttov_outputs)) then + do i=1,Ninst_rttov + write (i_str,fmt) i ! converting integer to string i_str using a 'internal file' + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) then + ii = ii + 1 + status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%channel_indices) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%bt_total)) then + ii = ii + 1 + status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%bt_total) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) then + ii = ii + 1 + status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%bt_clear) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%rad_total)) then + ii = ii + 1 + status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%rad_total) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) then + ii = ii + 1 + status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%rad_clear) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) then + ii = ii + 1 + status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%rad_cloudy) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%refl_total)) then + ii = ii + 1 + status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%refl_total) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) then + ii = ii + 1 + status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%refl_clear) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) then + ii = ii + 1 + status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%bt_total_pc) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) then + ii = ii + 1 + status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%rad_total_pc) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + end do + end if + + ! Close file + status = nf90_close(fileID) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + end subroutine write_cosp2_output + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE nc_read_input_file + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + SUBROUTINE NC_READ_INPUT_FILE(fname,Npnts,Nl,Nhydro,lon,lat,p,ph,z,zh,T,qv,rh,tca,cca, & + mr_lsliq,mr_lsice,mr_ccliq,mr_ccice,fl_lsrain,fl_lssnow, & + fl_lsgrpl,fl_ccrain,fl_ccsnow,Reff,dtau_s,dtau_c,dem_s, & + dem_c,skt,psfc,landmask,mr_ozone,u_wind,v_wind,sunlit, & + gwvel, gcumf, & ! added by DPLRW + mr_lsrain, mr_lssnow, & ! adjust to prognostic precipitation + emsfc_lw,mode,Nlon,Nlat,surfelev, & + year,month,day,hour,minute,seconds) + + ! Arguments + character(len=512),intent(in) :: fname ! File name + integer,intent(in) :: Npnts,Nl,Nhydro + real(wp),dimension(Npnts),intent(out) :: lon,lat + real(wp),dimension(Npnts,Nl),target,intent(out) :: p,ph,z,zh,T,qv,rh,tca,cca, & + mr_lsliq,mr_lsice,mr_ccliq,mr_ccice,fl_lsrain,fl_lssnow,fl_lsgrpl, & + fl_ccrain,fl_ccsnow,dtau_s,dtau_c,dem_s,dem_c,mr_ozone + real(wp),dimension(Npnts,Nl,Nhydro),intent(out) :: Reff + real(wp),dimension(Npnts),intent(out) :: skt,psfc,landmask,u_wind,v_wind,sunlit,surfelev, & + year,month,day,hour,minute,seconds + real(wp),dimension(Npnts,Nl),intent(out) :: gwvel,gcumf ! added by DPLRW + real(wp),dimension(Npnts,Nl),intent(out) :: mr_lsrain,mr_lssnow ! adjust to prognostic precipitation + real(wp),intent(out) :: emsfc_lw + integer,intent(out) :: mode,Nlon,Nlat + + ! Local variables + integer,parameter :: NMAX_DIM=5 + integer :: Npoints,Nlevels,i,j,k,vrank,vdimid(NMAX_DIM),ncid,vid,ndims,nvars,ngatts, & + recdim,dimsize(NMAX_DIM),errst,Na,Nb,Nc,Nd,Ne + integer,dimension(:),allocatable :: plon,plat + logical :: Llat,Llon,Lpoint + real(wp),dimension(Npnts) :: ll + real(wp),allocatable :: x1(:),x2(:,:),x3(:,:,:),x4(:,:,:,:),x5(:,:,:,:,:) ! Temporary arrays + character(len=128) :: vname + character(len=256) :: dimname(NMAX_DIM) ! 256 hardcoded, instead of MAXNCNAM. This works for NetCDF 3 and 4. + character(len=64) :: routine_name='NC_READ_INPUT_FILE' + character(len=128) :: errmsg,straux + + mode = 0 + Nlon = 0 + Nlat = 0 + + Npoints = Npnts + Nlevels = Nl + + ! Open file + errst = nf90_open(fname, nf90_nowrite, ncid) + if (errst /= 0) then + errmsg="Couldn't open "//trim(fname) + call cosp_error(routine_name,errmsg) + endif + + ! Get information about dimensions. Curtain mode or lat/lon mode? + Llat =.false. + Llon =.false. + Lpoint=.false. + errst = nf90_inquire(ncid, ndims, nvars, ngatts, recdim) + if (errst /= 0) then + errmsg="Error in nf90_inquire" + call cosp_error(routine_name,errmsg,errcode=errst) + endif + do i = 1,ndims + errst = nf90_Inquire_Dimension(ncid,i,name=dimname(i),len=dimsize(i)) + if (errst /= 0) then + write(straux, *) i + errmsg="Error in nf90_Inquire_Dimension, i: "//trim(straux) + call cosp_error(routine_name,errmsg) + endif + if ((trim(dimname(i)).eq.'level').and.(Nlevels > dimsize(i))) then + errmsg='Number of levels selected is greater than in input file '//trim(fname) + call cosp_error(routine_name,errmsg) + endif + if (trim(dimname(i)).eq.'point') then + Lpoint = .true. + if (Npnts > dimsize(i)) then + errmsg='Number of points selected is greater than in input file '//trim(fname) + call cosp_error(routine_name,errmsg) + endif + endif + if (trim(dimname(i)).eq.'lon') then + Llon = .true. + Nlon = dimsize(i) + endif + if (trim(dimname(i)).eq.'lat') then + Llat = .true. + Nlat = dimsize(i) + endif + enddo + + ! Get lon and lat + if (Llon.and.Llat) then ! 2D mode + if ((Npnts) > Nlon*Nlat) Npoints=Nlon*Nlat + lon = -1.0E30 + lat = -1.0E30 + mode = 2 ! Don't know yet if (lon,lat) or (lat,lon) at this point + else if (Lpoint) then ! 1D mode + Nlon = Npoints + Nlat = Npoints + mode = 1 + else + errmsg= trim(fname)//' file contains wrong dimensions' + call cosp_error(routine_name,errmsg) + endif + errst = nf90_inq_varid(ncid, 'lon', vid) + if (errst /= 0) then + errmsg="Error in nf90_inq_varid, var: lon" + call cosp_error(routine_name,errmsg,errcode=errst) + endif + errst = nf90_get_var(ncid, vid, lon, start = (/1/), count = (/Nlon/)) + if (errst /= 0) then + errmsg="Error in nf90_get_var, var: lon" + call cosp_error(routine_name,errmsg,errcode=errst) + endif + errst = nf90_inq_varid(ncid, 'lat', vid) + if (errst /= 0) then + errmsg="Error in nf90_inq_varid, var: lat" + call cosp_error(routine_name,errmsg,errcode=errst) + endif + errst = nf90_get_var(ncid, vid, lat, start = (/1/), count = (/Nlat/)) + if (errst /= 0) then + errmsg="Error in nf90_get_var, var: lat" + call cosp_error(routine_name,errmsg,errcode=errst) + endif + + ! Get all variables + do vid = 1,nvars + vdimid=0 + errst = nf90_Inquire_Variable(ncid, vid, name=vname, ndims=vrank, dimids=vdimid) + if (errst /= 0) then + write(straux, *) vid + errmsg='Error in nf90_Inquire_Variable, vid '//trim(straux) + call cosp_error(routine_name,errmsg,errcode=errst) + endif + ! Read in into temporary array of correct shape + if (vrank == 1) then + Na = dimsize(vdimid(1)) + allocate(x1(Na)) + errst = nf90_get_var(ncid, vid, x1, start=(/1/), count=(/Na/)) + endif + if (vrank == 2) then + Na = dimsize(vdimid(1)) + Nb = dimsize(vdimid(2)) + allocate(x2(Na,Nb)) + errst = nf90_get_var(ncid, vid, x2, start=(/1,1/), count=(/Na,Nb/)) + endif + if (vrank == 3) then + Na = dimsize(vdimid(1)) + Nb = dimsize(vdimid(2)) + Nc = dimsize(vdimid(3)) + allocate(x3(Na,Nb,Nc)) + errst = nf90_get_var(ncid, vid, x3, start=(/1,1,1/), count=(/Na,Nb,Nc/)) + if ((mode == 2).or.(mode == 3)) then + if ((Na == Nlon).and.(Nb == Nlat)) then + mode = 2 + else if ((Na == Nlat).and.(Nb == Nlon)) then + mode = 3 + else + errmsg='Wrong mode for variable '//trim(vname) + call cosp_error(routine_name,errmsg) + endif + endif + endif + if (vrank == 4) then + Na = dimsize(vdimid(1)) + Nb = dimsize(vdimid(2)) + Nc = dimsize(vdimid(3)) + Nd = dimsize(vdimid(4)) + allocate(x4(Na,Nb,Nc,Nd)) + errst = nf90_get_var(ncid, vid, x4, start=(/1,1,1,1/), count=(/Na,Nb,Nc,Nd/)) + endif + if (vrank == 5) then + Na = dimsize(vdimid(1)) + Nb = dimsize(vdimid(2)) + Nc = dimsize(vdimid(3)) + Nd = dimsize(vdimid(4)) + Ne = dimsize(vdimid(5)) + allocate(x5(Na,Nb,Nc,Nd,Ne)) + errst = nf90_get_var(ncid, vid, x5, start=(/1,1,1,1,1/), count=(/Na,Nb,Nc,Nd,Ne/)) + endif + if (errst /= 0) then + write(straux, *) vid + errmsg='Error in nf90_get_var, vid '//trim(straux) + call cosp_error(routine_name,errmsg,errcode=errst) + endif + ! Map to the right input argument + select case (trim(vname)) + case ('pfull') + if (Lpoint) then + p(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=p) + endif + case ('phalf') + if (Lpoint) then + ph(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=ph) + endif + case ('height') + if (Lpoint) then + z(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=z) + endif + case ('height_half') + if (Lpoint) then + zh(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=zh) + endif + case ('T_abs') + if (Lpoint) then + T(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=T) + endif + case ('qv') + if (Lpoint) then + qv(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=qv) + endif + case ('rh') + if (Lpoint) then + rh(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=rh) + endif + case ('tca') + if (Lpoint) then + tca(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=tca) + endif + tca = tca + case ('cca') + if (Lpoint) then + cca(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=cca) + endif + cca = cca + case ('mr_lsliq') + if (Lpoint) then + mr_lsliq(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_lsliq) + endif + case ('mr_lsice') + if (Lpoint) then + mr_lsice(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_lsice) + endif + case ('mr_ccliq') + if (Lpoint) then + mr_ccliq(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_ccliq) + endif + case ('mr_ccice') + if (Lpoint) then + mr_ccice(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_ccice) + endif + case ('fl_lsrain') + if (Lpoint) then + fl_lsrain(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=fl_lsrain) + endif + case ('fl_lssnow') + if (Lpoint) then + fl_lssnow(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=fl_lssnow) + endif + case ('mr_lsrain') + if (Lpoint) then + mr_lsrain(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_lsrain) + endif + case ('mr_lssnow') + if (Lpoint) then + mr_lssnow(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_lssnow) + endif + case ('fl_lsgrpl') + if (Lpoint) then + fl_lsgrpl(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=fl_lsgrpl) + endif + case ('fl_ccrain') + if (Lpoint) then + fl_ccrain(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=fl_ccrain) + endif + case ('fl_ccsnow') + if (Lpoint) then + fl_ccsnow(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=fl_ccsnow) + endif + case ('dtau_s') + if (Lpoint) then + dtau_s(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=dtau_s) + endif + case ('dtau_c') + if (Lpoint) then + dtau_c(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=dtau_c) + endif + case ('dem_s') + if (Lpoint) then + dem_s(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=dem_s) + endif + case ('dem_c') + if (Lpoint) then + dem_c(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=dem_c) + endif + case ('Reff') + if (Lpoint) then + Reff(1:Npoints,:,:) = x3(1:Npoints,1:Nlevels,:) + else + call map_ll_to_point(Na,Nb,Npoints,x4=x4,y3=Reff) + endif + case ('skt') + if (Lpoint) then + skt(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=skt) + endif + case ('psfc') + if (Lpoint) then + psfc(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=psfc) + endif + case ('orography') + if (Lpoint) then + surfelev(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=surfelev) + endif + case ('landmask') + if (Lpoint) then + landmask(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=landmask) + endif + case ('mr_ozone') + if (Lpoint) then + mr_ozone(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_ozone) + endif + case ('u_wind') + if (Lpoint) then + u_wind(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=u_wind) + endif + case ('v_wind') + if (Lpoint) then + v_wind(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=v_wind) + endif + case ('sunlit') + if (Lpoint) then + sunlit(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=sunlit) + endif + + case ('gwvel') ! added by DPLRW + if (Lpoint) then + gwvel(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=gwvel) + endif + case ('gcumf') + if (Lpoint) then + gcumf(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=gcumf) + endif + + case ('year') + if (Lpoint) then + year(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=year) + endif + case ('month') + if (Lpoint) then + month(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=month) + endif + case ('day') + if (Lpoint) then + day(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=day) + endif + case ('hour') + if (Lpoint) then + hour(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=hour) + endif + case ('minute') + if (Lpoint) then + minute(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=minute) + endif + case ('second') + if (Lpoint) then + seconds(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=seconds) + endif + + end select + ! Free memory + if (vrank == 1) deallocate(x1) + if (vrank == 2) deallocate(x2) + if (vrank == 3) deallocate(x3) + if (vrank == 4) deallocate(x4) + if (vrank == 5) deallocate(x5) + enddo + + ! SFC emissivity + errst = nf90_inq_varid(ncid, 'emsfc_lw', vid) + if (errst /= 0) then + if (errst == nf90_enotvar) then ! Does not exist, use 1.0 + emsfc_lw = 1.0 + print *, ' ********* COSP Warning: emsfc_lw does not exist in input file. Set to 1.0.' + else ! Other error, stop + errmsg='Error in nf90_inq_varid, var: emsfc_lw' + call cosp_error(routine_name,errmsg,errcode=errst) + endif + else + errst = nf90_get_var(ncid, vid, emsfc_lw) + if (errst /= 0) then + errmsg='Error in nf90_get_var, var: emsfc_lw' + call cosp_error(routine_name,errmsg,errcode=errst) + endif + endif + + + ! Fill in the lat/lon vectors with the right values for 2D modes + ! This might be helpful if the inputs are 2D (gridded) and + ! you want outputs in 1D mode + allocate(plon(Npoints),plat(Npoints)) + if (mode == 2) then !(lon,lat) + ll = lat + do j=1,Nb + do i=1,Na + k = (j-1)*Na + i + plon(k) = i + plat(k) = j + enddo + enddo + lon(1:Npoints) = lon(plon(1:Npoints)) + lat(1:Npoints) = ll(plat(1:Npoints)) + else if (mode == 3) then !(lat,lon) + ll = lon + do j=1,Nb + do i=1,Na + k = (j-1)*Na + i + lon(k) = ll(j) + lat(k) = lat(i) + enddo + enddo + lon(1:Npoints) = ll(plon(1:Npoints)) + lat(1:Npoints) = lat(plat(1:Npoints)) + endif + deallocate(plon,plat) + + ! Close file + errst = nf90_close(ncid) + if (errst /= 0) then + errmsg='Error in nf90_close' + call cosp_error(routine_name,errmsg,errcode=errst) + endif + END SUBROUTINE NC_READ_INPUT_FILE + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE map_ll_to_point + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + SUBROUTINE MAP_LL_TO_POINT(Nx,Ny,Np,x2,x3,x4,x5,y1,y2,y3,y4) + ! Input arguments + integer,intent(in) :: Nx,Ny,Np + real(wp),intent(in),optional :: x2(:,:),x3(:,:,:), & + x4(:,:,:,:),x5(:,:,:,:,:) + real(wp),intent(out),optional :: y1(:),y2(:,:),y3(:,:,:), & + y4(:,:,:,:) + ! Local variables + integer :: px(Nx*Ny),py(Nx*Ny) + integer :: i,j,k,l,m + integer :: Ni,Nj,Nk,Nl,Nm + integer :: Mi,Mj,Mk,Ml + character(len=128) :: proname='MAP_LL_TO_POINT' + + px=0 + py=0 + if (Nx*Ny < Np) then + print *, ' -- '//trim(proname)//': Nx*Ny < Np' + stop + endif + do j=1,Ny + do i=1,Nx + k = (j-1)*Nx+i + px(k) = i + py(k) = j + enddo + enddo + + if (present(x2).and.present(y1)) then + Ni = size(x2,1) + Nj = size(x2,2) + Mi = size(y1,1) + if (Ni*Nj < Mi) then + print *, ' -- '//trim(proname)//': Nlon*Nlat < Npoints (opt 1)' + stop + endif + do j=1,Np + y1(j) = x2(px(j),py(j)) + enddo + else if (present(x3).and.present(y2)) then + Ni = size(x3,1) + Nj = size(x3,2) + Nk = size(x3,3) + Mi = size(y2,1) + Mj = size(y2,2) + if (Ni*Nj < Mi) then + print *, ' -- '//trim(proname)//': Nlon*Nlat < Npoints (opt 2)' + stop + endif + if (Nk /= Mj) then + print *, ' -- '//trim(proname)//': Nk /= Mj (opt 2)' + stop + endif + do k=1,Nk + do j=1,Np + y2(j,k) = x3(px(j),py(j),k) + enddo + enddo + else if (present(x4).and.present(y3)) then + Ni = size(x4,1) + Nj = size(x4,2) + Nk = size(x4,3) + Nl = size(x4,4) + Mi = size(y3,1) + Mj = size(y3,2) + Mk = size(y3,3) + if (Ni*Nj < Mi) then + print *, ' -- '//trim(proname)//': Nlon*Nlat < Npoints (opt 3)' + stop + endif + if (Nk /= Mj) then + print *, ' -- '//trim(proname)//': Nk /= Mj (opt 3)' + stop + endif + if (Nl /= Mk) then + print *, ' -- '//trim(proname)//': Nl /= Mk (opt 3)' + stop + endif + do l=1,Nl + do k=1,Nk + do j=1,Np + y3(j,k,l) = x4(px(j),py(j),k,l) + enddo + enddo + enddo + else if (present(x5).and.present(y4)) then + Ni = size(x5,1) + Nj = size(x5,2) + Nk = size(x5,3) + Nl = size(x5,4) + Nm = size(x5,5) + Mi = size(y4,1) + Mj = size(y4,2) + Mk = size(y4,3) + Ml = size(y4,4) + if (Ni*Nj < Mi) then + print *, ' -- '//trim(proname)//': Nlon*Nlat < Npoints (opt 4)' + stop + endif + if (Nk /= Mj) then + print *, ' -- '//trim(proname)//': Nk /= Mj (opt 4)' + stop + endif + if (Nl /= Mk) then + print *, ' -- '//trim(proname)//': Nl /= Mk (opt 4)' + stop + endif + if (Nm /= Ml) then + print *, ' -- '//trim(proname)//': Nm /= Ml (opt 4)' + stop + endif + do m=1,Nm + do l=1,Nl + do k=1,Nk + do j=1,Np + y4(j,k,l,m) = x5(px(j),py(j),k,l,m) + enddo + enddo + enddo + enddo + else + print *, ' -- '//trim(proname)//': wrong option' + stop + endif + END SUBROUTINE MAP_LL_TO_POINT + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Subrotuine cosp_error + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + SUBROUTINE COSP_ERROR(routine_name,message,errcode) + character(len = *), intent(in) :: routine_name + character(len = *), intent(in) :: message + integer,optional :: errcode + + write(6, *) " ********** Failure in ", trim(routine_name) + write(6, *) " ********** ", trim(message) + if (present(errcode)) write(6, *) " ********** errcode: ", errcode + flush(6) + stop + END SUBROUTINE COSP_ERROR + end module mod_cosp_io diff --git a/dplrw_src/cosp2_test.F90 b/dplrw_src/cosp2_test.F90 new file mode 100755 index 0000000000..7b6d14df27 --- /dev/null +++ b/dplrw_src/cosp2_test.F90 @@ -0,0 +1,2231 @@ +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +! Copyright (c) 2016, Regents of the University of Colorado +! All rights reserved. +! +! Redistribution and use in source and binary forms, with or without modification, are +! permitted provided that the following conditions are met: +! +! 1. Redistributions of source code must retain the above copyright notice, this list of +! conditions and the following disclaimer. +! +! 2. Redistributions in binary form must reproduce the above copyright notice, this list +! of conditions and the following disclaimer in the documentation and/or other +! materials provided with the distribution. +! +! 3. Neither the name of the copyright holder nor the names of its contributors may be +! used to endorse or promote products derived from this software without specific prior +! written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +! +! History +! March 2016 - D. Swales - Original version +! April 2018 - R. Guzman - Added OPAQ diagnostics and Ground LIDar (GLID) simulator +! April 2018 - R. Guzman - Added ATLID simulator +! Nov 2018 - T. Michibata - Added CloudSat+MODIS Warmrain Diagnostics +! June 2025 - J.K. Shaw - Added COSP-RTTOV integration and swathing +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +program cosp2_test + use cosp_kinds, only: wp + USE MOD_COSP_CONFIG, ONLY: R_UNDEF,PARASOL_NREFL,LIDAR_NCAT,LIDAR_NTYPE,SR_BINS, & + N_HYDRO,numMISRHgtBins, & + cloudsat_DBZE_BINS,LIDAR_NTEMP,calipso_histBsct, & + CFODD_NDBZE, CFODD_NICOD, & + CFODD_BNDRE, CFODD_NCLASS, & + CFODD_DBZE_MIN, CFODD_DBZE_MAX, & + CFODD_ICOD_MIN, CFODD_ICOD_MAX, & + CFODD_DBZE_WIDTH, CFODD_ICOD_WIDTH, & + WR_NREGIME, & + numMODISTauBins,numMODISPresBins, & + numMODISReffIceBins,numMODISReffLiqBins, & + numISCCPTauBins,numISCCPPresBins,numMISRTauBins, & + ntau,modis_histTau,tau_binBounds, & + modis_histTauEdges,tau_binEdges, & + modis_histTauCenters,tau_binCenters,ntauV1p4, & + tau_binBoundsV1p4,tau_binEdgesV1p4, tau_binCentersV1p4, & + grLidar532_histBsct,atlid_histBsct,vgrid_zu,vgrid_zl, & + Nlvgrid_local => Nlvgrid, & + vgrid_z,cloudsat_preclvl + use cosp_phys_constants, only: amw,amd,amO3,amCO2,amCH4,amN2O,amCO + use mod_cosp_io, only: nc_read_input_file,write_cosp2_output + USE mod_quickbeam_optics,only: size_distribution,hydro_class_init,quickbeam_optics, & + quickbeam_optics_init,gases + use mod_cosp, only: cosp_init, & + cosp_outputs,swath_inputs,cosp_simulator + USE mod_rng, ONLY: rng_state, init_rng + USE mod_scops, ONLY: scops + USE mod_prec_scops, ONLY: prec_scops + USE MOD_COSP_UTILS, ONLY: cosp_precip_mxratio + use MOD_COSP_RTTOV_UTIL, only: rttov_cfg, rttov_output + use cosp_optics, ONLY: cosp_simulator_optics,lidar_optics,modis_optics, & + modis_optics_partition + use mod_cosp_stats, ONLY: COSP_CHANGE_VERTICAL_GRID,cosp_optical_inputs, & + cosp_column_inputs,radar_cfg,cosp_cleanUp + use mod_cosp_config, ONLY: Nlvdplr, Nlvspwd, NlvdBZe, Nlvtemp ! added by DPLRW + + implicit none + + ! Input/Output driver file control + character(len=256) :: cosp_input_namelist + character(len=64) :: cosp_output_namelist = 'cosp2_output_nl.txt' + + ! Test data + integer :: & + Nlon,Nlat,geomode + real(wp) :: & + emsfc_lw + real(wp),dimension(:),allocatable,target :: & + lon, & ! Longitude (deg) + lat, & ! Latitude (deg) + skt, & ! Skin temperature (K) + psfc, & ! Surface Pressure (Pa) + surfelev, & ! Surface Elevation (m) + landmask, & ! Land/sea mask (0/1) + u_wind, & ! U-component of wind (m/s) + v_wind, & ! V-component of wind (m/s) + sunlit ! Sunlit flag + real(wp),dimension(:),allocatable :: & + year, & ! Year (CE) + month, & ! Month [1,12] + day, & ! Day [1,31] + hour, & ! Hour [0,24] + minute, & ! Minute [0,60] + seconds ! Second [0,60] + real(wp),dimension(:,:),allocatable,target :: & + p, & ! Model pressure levels (pa) + ph, & ! Model pressure @ half levels (pa) + zlev, & ! Model level height (m) + zlev_half, & ! Model level height @ half-levels (m) + T, & ! Temperature (K) + sh, & ! Specific humidity (kg/kg) + rh, & ! Relative humidity (1) + tca, & ! Total cloud fraction (1) + cca, & ! Convective cloud fraction (1) + mr_lsliq, & ! Mass mixing ratio for stratiform cloud liquid (kg/kg) + mr_lsice, & ! Mass mixing ratio for stratiform cloud ice (kg/kg) + mr_ccliq, & ! Mass mixing ratio for convective cloud liquid (kg/kg) + mr_ccice, & ! Mass mixing ratio for convective cloud ice (kg/kg) + mr_ozone, & ! Mass mixing ratio for ozone (kg/kg) + fl_lsrain, & ! Precipitation flux (rain) for stratiform cloud (kg/m^2/s) + fl_lssnow, & ! Precipitation flux (snow) for stratiform cloud (kg/m^2/s) + fl_lsgrpl, & ! Precipitation flux (groupel) for stratiform cloud (kg/m^2/s) + fl_ccrain, & ! Precipitation flux (rain) for convective cloud (kg/m^2/s) + fl_ccsnow, & ! Precipitation flux (snow) for convective cloud (kg/m^2/s) + dtau_s, & ! 0.67micron optical depth (stratiform cloud) (1) + dtau_c, & ! 0.67micron optical depth (convective cloud) (1) + dem_s, & ! 11micron emissivity (stratiform cloud) + dem_c ! 11microm emissivity (convective cloud) + real(wp),dimension(:,:,:),allocatable,target :: & + frac_out, & ! Subcolumn cloud cover (0/1) + Reff ! Subcolumn effective radius + + ! additional inputs for DPLRW + real(wp),dimension(:,:),allocatable,target :: & + gwvel, & ! Model grid vertical velocity (m/s) + gcumf ! Model cumulus mass flux (kg/m^2/s) + + ! adjust to prognostic precipitation + real(wp),dimension(:,:),allocatable,target :: & + mr_lsrain, & ! Mass mixing ratio for stratiform cloud rain (kg/kg) + mr_lssnow ! Mass mixing ratio for stratiform cloud snow (kg/kg) + + ! Input namelist fields + integer :: & ! + Npoints, & ! Number of gridpoints + Ncolumns, & ! Number of subcolumns + Nlevels, & ! Number of model vertical levels + Npoints_it, & ! Number of gridpoints to be processed in one + ! iteration + Nlvgrid, & ! Number of vertical levels for statistical outputs + ! (USE_VGRID=.true.) + surface_radar, & ! surface=1/spaceborne=0 + cloudsat_use_gas_abs, & ! Include gaseous absorption (1=yes/0=no) + cloudsat_do_ray, & ! Calculate output Rayleigh (1=yes/0=no) + lidar_ice_type, & ! Ice particle shape in lidar calculations + ! (0=ice-spheres/1=ice-non-spherical) + overlap, & ! Overlap type: 1=max, 2=rand, 3=max/rand + isccp_topheight, & ! ISCCP cloud top height + isccp_topheight_direction ! ISCCP cloud top height direction + real(wp) :: & ! + cloudsat_radar_freq, & ! CloudSat radar frequency (GHz) + cloudsat_k2 ! |K|^2, -1=use frequency dependent default + logical :: & ! + use_vgrid, & ! Use fixed vertical grid for outputs? + csat_vgrid, & ! CloudSat vertical grid? + use_precipitation_fluxes ! True if precipitation fluxes are input to the flux + + character(len=64) :: & + cloudsat_micro_scheme ! Microphysical scheme used in cloudsat radar simulator + character(len=64) :: & + finput ! Input NetCDF file + character(len=256) :: & + foutput + character(len=512) :: & + dinput ! Directory where the input files are located + character(len=600) :: & + fileIN ! dinput+finput + + ! RTTOV + integer :: rttov_Ninstruments = 0 + character(len=256), dimension(50) :: & ! Arbitrary limit of 50 should be fine. + rttov_instrument_namelists ! Input of paths to RTTOV instrument namelists + character(len=256), allocatable :: & + rttov_instrument_namelists_final(:) ! Array of paths to RTTOV instrument namelists + logical :: rttov_verbose = .false. + + ! Inputs for orbit swathing + integer :: N_SWATHS_ISCCP = 0 ! Number of ISCCP swaths + integer :: N_SWATHS_MISR = 0 ! Number of MISR swaths + integer :: N_SWATHS_MODIS = 0 ! Number of MODIS swaths + integer :: N_SWATHS_PARASOL = 0 ! Number of PARASOL swaths + integer :: N_SWATHS_CSCAL = 0 ! Number of CLOUDSAT+CALIPSO swaths + integer :: N_SWATHS_ATLID = 0 ! Number of ATLID swaths + real(wp),dimension(10),target :: & ! Arbitrary limit of 10 swaths seems reasonable. + SWATH_LOCALTIMES_ISCCP, & ! Local time of ISCCP satellite overpasses (hrs GMT) + SWATH_LOCALTIMES_MISR, & ! Local time of MISR satellite overpasses (hrs GMT) + SWATH_LOCALTIMES_MODIS, & ! Local time of MODIS satellite overpasses (hrs GMT) + SWATH_LOCALTIMES_PARASOL, & ! Local time of PARASOL satellite overpasses (hrs GMT) + SWATH_LOCALTIMES_CSCAL, & ! Local time of CLOUDSAT+CALIPSO satellite overpasses (hrs GMT) + SWATH_LOCALTIMES_ATLID, & ! Local time of ATLID satellite overpasses (hrs GMT) + SWATH_WIDTHS_ISCCP, & ! Width in km of ISCCP satellite overpasses + SWATH_WIDTHS_MISR, & ! Width in km of MISR satellite overpasses + SWATH_WIDTHS_MODIS, & ! Width in km of MODIS satellite overpasses + SWATH_WIDTHS_PARASOL, & ! Width in km of PARASOL satellite overpasses + SWATH_WIDTHS_CSCAL, & ! Width in km of CLOUDSAT+CALIPSO satellite overpasses + SWATH_WIDTHS_ATLID ! Width in km of ATLID satellite overpasses + + namelist/COSP_INPUT/overlap, isccp_topheight, isccp_topheight_direction, npoints, & + npoints_it, ncolumns, nlevels, use_vgrid, Nlvgrid, csat_vgrid, dinput, finput, & + foutput, cloudsat_radar_freq, surface_radar, cloudsat_use_gas_abs,cloudsat_do_ray,& + cloudsat_k2, cloudsat_micro_scheme, lidar_ice_type, use_precipitation_fluxes, & + rttov_Ninstruments, rttov_instrument_namelists, rttov_verbose, & + N_SWATHS_ISCCP, SWATH_LOCALTIMES_ISCCP, SWATH_WIDTHS_ISCCP, N_SWATHS_MISR, & + SWATH_LOCALTIMES_MISR, SWATH_WIDTHS_MISR, N_SWATHS_MODIS, SWATH_LOCALTIMES_MODIS, & + SWATH_WIDTHS_MODIS, N_SWATHS_PARASOL, SWATH_LOCALTIMES_PARASOL, & + SWATH_WIDTHS_PARASOL, N_SWATHS_CSCAL, SWATH_LOCALTIMES_CSCAL, & + SWATH_WIDTHS_CSCAL, N_SWATHS_ATLID, SWATH_LOCALTIMES_ATLID, SWATH_WIDTHS_ATLID + + ! Output namelist + logical :: Lcfaddbze94,Ldbze94,Latb532,LcfadLidarsr532,Lclcalipso,Lclhcalipso, & + Lcllcalipso,Lclmcalipso,Lcltcalipso,LparasolRefl,Lclcalipsoliq, & + Lclcalipsoice,Lclcalipsoun,Lclcalipsotmp,Lclcalipsotmpliq,Lclcalipsotmpice, & + Lclcalipsotmpun,Lclhcalipsoliq,Lcllcalipsoliq,Lclmcalipsoliq,Lcltcalipsoliq,& + Lclhcalipsoice,Lcllcalipsoice,Lclmcalipsoice,Lcltcalipsoice,Lclhcalipsoun, & + Lcllcalipsoun,Lclmcalipsoun,Lcltcalipsoun,Lclopaquecalipso,Lclthincalipso, & + Lclzopaquecalipso,Lclcalipsoopaque,Lclcalipsothin,Lclcalipsozopaque, & + Lclcalipsoopacity,Lclopaquetemp,Lclthintemp,Lclzopaquetemp,Lclopaquemeanz, & + Lclthinmeanz,Lclthinemis,Lclopaquemeanzse,Lclthinmeanzse,Lclzopaquecalipsose,& + LlidarBetaMol532gr,LcfadLidarsr532gr,Latb532gr,LclgrLidar532,LclhgrLidar532,& + LcllgrLidar532,LclmgrLidar532,LcltgrLidar532,LlidarBetaMol355, & + LcfadLidarsr355,Latb355,Lclatlid,Lclhatlid,Lcllatlid,Lclmatlid,Lcltatlid, & + Lalbisccp,Lboxptopisccp,Lboxtauisccp,Lpctisccp,Lclisccp,Ltauisccp,Lcltisccp,& + Lmeantbisccp,Lmeantbclrisccp,LclMISR,Lclcalipso2,Lcltlidarradar, & + Lcloudsat_tcc, Lcloudsat_tcc2,Lfracout, & + LlidarBetaMol532,Lcltmodis,Lclwmodis,Lclimodis,Lclhmodis,Lclmmodis, & + Lcllmodis,Ltautmodis,Ltauwmodis,Ltauimodis,Ltautlogmodis,Ltauwlogmodis, & + Ltauilogmodis,Lreffclwmodis,Lreffclimodis,Lpctmodis,Llwpmodis,Liwpmodis, & + Lclmodis,Lptradarflag0,Lptradarflag1,Lptradarflag2,Lptradarflag3, & + Lptradarflag4,Lptradarflag5,Lptradarflag6,Lptradarflag7,Lptradarflag8, & + Lptradarflag9,Lradarpia, & + Lwr_occfreq, Lcfodd, & + Ldplrw ! for DPLRW + + namelist/COSP_OUTPUT/Lcfaddbze94,Ldbze94,Latb532,LcfadLidarsr532,Lclcalipso, & + Lclhcalipso,Lcllcalipso,Lclmcalipso,Lcltcalipso,LparasolRefl, & + Lclcalipsoliq,Lclcalipsoice,Lclcalipsoun,Lclcalipsotmp, & + Lclcalipsotmpliq,Lclcalipsotmpice,Lclcalipsotmpun,Lclhcalipsoliq, & + Lcllcalipsoliq,Lclmcalipsoliq,Lcltcalipsoliq,Lclhcalipsoice, & + Lcllcalipsoice,Lclmcalipsoice,Lcltcalipsoice,Lclhcalipsoun, & + Lcllcalipsoun,Lclmcalipsoun,Lcltcalipsoun,Lclopaquecalipso, & + Lclthincalipso,Lclzopaquecalipso,Lclcalipsoopaque,Lclcalipsothin, & + Lclcalipsozopaque,Lclcalipsoopacity,Lclopaquetemp,Lclthintemp, & + Lclzopaquetemp,Lclopaquemeanz,Lclthinmeanz,Lclthinemis, & + Lclopaquemeanzse,Lclthinmeanzse,Lclzopaquecalipsose, & + LlidarBetaMol532gr,LcfadLidarsr532gr,Latb532gr,LclgrLidar532, & + LclhgrLidar532,LcllgrLidar532,LclmgrLidar532,LcltgrLidar532, & + LlidarBetaMol355,LcfadLidarsr355,Latb355,Lclatlid, & + Lclhatlid,Lcllatlid,Lclmatlid,Lcltatlid,Lalbisccp,Lboxptopisccp, & + Lboxtauisccp,Lpctisccp,Lclisccp,Ltauisccp,Lcltisccp,Lmeantbisccp, & + Lmeantbclrisccp,LclMISR,Lclcalipso2,Lcltlidarradar, & + Lcloudsat_tcc, Lcloudsat_tcc2, Lfracout, & + LlidarBetaMol532,Lcltmodis,Lclwmodis,Lclimodis,Lclhmodis, & + Lclmmodis,Lcllmodis,Ltautmodis,Ltauwmodis,Ltauimodis, & + Ltautlogmodis,Ltauwlogmodis,Ltauilogmodis,Lreffclwmodis, & + Lreffclimodis,Lpctmodis,Llwpmodis,Liwpmodis,Lclmodis, & + Lptradarflag0,Lptradarflag1,Lptradarflag2,Lptradarflag3, & + Lptradarflag4,Lptradarflag5,Lptradarflag6,Lptradarflag7, & + Lptradarflag8,Lptradarflag9,Lradarpia, & + Lwr_occfreq, Lcfodd, & + Ldplrw + + ! Local variables + logical :: & + lsingle = .true., & ! True if using MMF_v3_single_moment CLOUDSAT microphysical scheme (default) + ldouble = .false., & ! True if using MMF_v3.5_two_moment CLOUDSAT microphysical scheme + lisccp = .false. ,& ! Local on/off switch for simulators (used by initialization) + lmodis = .false., & ! + lmisr = .false., & ! + lcalipso = .false., & ! + lgrLidar532 = .false., & ! + latlid = .false., & ! + lcloudsat = .false., & ! + lrttov = .false., & ! + lparasol = .false. ! + type(size_distribution) :: & + sd ! Hydrometeor description + type(radar_cfg) :: & + rcfg_cloudsat ! Radar configuration + type(rttov_cfg), dimension(:), allocatable, target :: & + rttov_configs + type(cosp_outputs) :: & + cospOUT ! COSP simulator outputs + type(cosp_optical_inputs) :: & + cospIN ! COSP optical (or derived?) fields needed by simulators + type(cosp_column_inputs) :: & + cospstateIN ! COSP model fields needed by simulators + integer :: iChunk,nChunks,start_idx,end_idx,nPtsPerIt,ij + real(wp),dimension(10) :: driver_time + character(len=256),dimension(100) :: cosp_status + + ! Indices to address arrays of LS and CONV hydrometeors + integer,parameter :: & + I_LSCLIQ = 1, & ! Large-scale (stratiform) liquid + I_LSCICE = 2, & ! Large-scale (stratiform) ice + I_LSRAIN = 3, & ! Large-scale (stratiform) rain + I_LSSNOW = 4, & ! Large-scale (stratiform) snow + I_CVCLIQ = 5, & ! Convective liquid + I_CVCICE = 6, & ! Convective ice + I_CVRAIN = 7, & ! Convective rain + I_CVSNOW = 8, & ! Convective snow + I_LSGRPL = 9 ! Large-scale (stratiform) groupel + + ! Stratiform and convective clouds in frac_out (scops output). + integer, parameter :: & + I_LSC = 1, & ! Large-scale clouds + I_CVC = 2 ! Convective clouds + + ! Microphysical settings for the precipitation flux to mixing ratio conversion + real(wp),parameter,dimension(N_HYDRO) :: & + ! LSL LSI LSR LSS CVL CVI CVR CVS LSG + N_ax = (/-1., -1., 8.e6, 3.e6, -1., -1., 8.e6, 3.e6, 4.e6/),& + N_bx = (/-1., -1., 0.0, 0.0, -1., -1., 0.0, 0.0, 0.0/),& + alpha_x = (/-1., -1., 0.0, 0.0, -1., -1., 0.0, 0.0, 0.0/),& + c_x = (/-1., -1., 842.0, 4.84, -1., -1., 842.0, 4.84, 94.5/),& + d_x = (/-1., -1., 0.8, 0.25, -1., -1., 0.8, 0.25, 0.5/),& + g_x = (/-1., -1., 0.5, 0.5, -1., -1., 0.5, 0.5, 0.5/),& + a_x = (/-1., -1., 524.0, 52.36, -1., -1., 524.0, 52.36, 209.44/),& + b_x = (/-1., -1., 3.0, 3.0, -1., -1., 3.0, 3.0, 3.0/),& + gamma_1 = (/-1., -1., 17.83725, 8.284701, -1., -1., 17.83725, 8.284701, 11.63230/),& + gamma_2 = (/-1., -1., 6.0, 6.0, -1., -1., 6.0, 6.0, 6.0/),& + gamma_3 = (/-1., -1., 2.0, 2.0, -1., -1., 2.0, 2.0, 2.0/),& + gamma_4 = (/-1., -1., 6.0, 6.0, -1., -1., 6.0, 6.0, 6.0/) + + ! Swathing DDT array + type(swath_inputs),dimension(6) :: & + cospswathsIN + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + call cpu_time(driver_time(1)) + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Read in namelists + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Input namelist (cosp setup) + call get_command_argument(1, cosp_input_namelist) + open(10,file=cosp_input_namelist,status='unknown') + read(10,nml=cosp_input) + close(10) + + ! Output namelist (logical flags to turn on/off outputs) + if (command_argument_count() .ge. 2) call get_command_argument(2, cosp_output_namelist) + open(10,file=cosp_output_namelist,status='unknown') + read(10,nml=cosp_output) + close(10) + + ! Shift the namelists read in into a shorter array for cosp_init: + allocate(rttov_instrument_namelists_final(rttov_Ninstruments)) + rttov_instrument_namelists_final(:) = rttov_instrument_namelists(1:rttov_Ninstruments) + + ! Read orbital swathing inputs into structure: + ! Indexing order is ISCCP, MISR, CLOUDSAT-CALIPSO, ATLID, PARASOL, MODIS + cospswathsIN(1) % N_inst_swaths = N_SWATHS_ISCCP + cospswathsIN(1) % inst_localtimes(1:N_SWATHS_ISCCP) = SWATH_LOCALTIMES_ISCCP(1:N_SWATHS_ISCCP) + cospswathsIN(1) % inst_localtime_widths(1:N_SWATHS_ISCCP) = SWATH_WIDTHS_ISCCP(1:N_SWATHS_ISCCP) + cospswathsIN(2) % N_inst_swaths = N_SWATHS_MISR + cospswathsIN(2) % inst_localtimes(1:N_SWATHS_MISR) = SWATH_LOCALTIMES_MISR(1:N_SWATHS_MISR) + cospswathsIN(2) % inst_localtime_widths(1:N_SWATHS_MISR) = SWATH_WIDTHS_MISR(1:N_SWATHS_MISR) + cospswathsIN(3) % N_inst_swaths = N_SWATHS_CSCAL + cospswathsIN(3) % inst_localtimes(1:N_SWATHS_CSCAL) = SWATH_LOCALTIMES_CSCAL(1:N_SWATHS_CSCAL) + cospswathsIN(3) % inst_localtime_widths(1:N_SWATHS_CSCAL) = SWATH_WIDTHS_CSCAL(1:N_SWATHS_CSCAL) + cospswathsIN(4) % N_inst_swaths = N_SWATHS_ATLID + cospswathsIN(4) % inst_localtimes(1:N_SWATHS_ATLID) = SWATH_LOCALTIMES_ATLID(1:N_SWATHS_ATLID) + cospswathsIN(4) % inst_localtime_widths(1:N_SWATHS_ATLID) = SWATH_WIDTHS_ATLID(1:N_SWATHS_ATLID) + cospswathsIN(5) % N_inst_swaths = N_SWATHS_PARASOL + cospswathsIN(5) % inst_localtimes(1:N_SWATHS_PARASOL) = SWATH_LOCALTIMES_PARASOL(1:N_SWATHS_PARASOL) + cospswathsIN(5) % inst_localtime_widths(1:N_SWATHS_PARASOL) = SWATH_WIDTHS_PARASOL(1:N_SWATHS_PARASOL) + cospswathsIN(6) % N_inst_swaths = N_SWATHS_MODIS + cospswathsIN(6) % inst_localtimes(1:N_SWATHS_MODIS) = SWATH_LOCALTIMES_MODIS(1:N_SWATHS_MODIS) + cospswathsIN(6) % inst_localtime_widths(1:N_SWATHS_MODIS) = SWATH_WIDTHS_MODIS(1:N_SWATHS_MODIS) + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Read in sample input data. + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + allocate(lon(Npoints),lat(Npoints),p(Npoints,Nlevels),ph(Npoints,Nlevels), & + zlev(Npoints,Nlevels),zlev_half(Npoints,Nlevels),T(Npoints,Nlevels), & + sh(Npoints,Nlevels),rh(Npoints,Nlevels),tca(Npoints,Nlevels), & + cca(Npoints,Nlevels),mr_lsliq(Npoints,Nlevels),mr_lsice(Npoints,Nlevels), & + mr_ccliq(Npoints,Nlevels),mr_ccice(Npoints,Nlevels), & + fl_lsrain(Npoints,Nlevels),fl_lssnow(Npoints,Nlevels), & + fl_lsgrpl(Npoints,Nlevels),fl_ccrain(Npoints,Nlevels), & + fl_ccsnow(Npoints,Nlevels),Reff(Npoints,Nlevels,N_HYDRO), & + dtau_s(Npoints,Nlevels),dtau_c(Npoints,Nlevels),dem_s(Npoints,Nlevels), & + dem_c(Npoints,Nlevels),skt(Npoints),psfc(Npoints),landmask(Npoints), & + mr_ozone(Npoints,Nlevels),u_wind(Npoints),v_wind(Npoints),sunlit(Npoints), & + gwvel(Npoints,Nlevels),gcumf(Npoints,Nlevels), & ! added by DPLRW + mr_lsrain(Npoints,Nlevels),mr_lssnow(Npoints,Nlevels), & + frac_out(Npoints,Ncolumns,Nlevels),surfelev(Npoints),year(Npoints), & + month(Npoints),day(Npoints),hour(Npoints),minute(Npoints),seconds(Npoints)) + + ! Set some fields to masked values if the COSP offline driver outputs are inconsistent + year(:) = R_UNDEF + month(:) = R_UNDEF + day(:) = R_UNDEF + hour(:) = R_UNDEF + minute(:) = R_UNDEF + seconds(:) = R_UNDEF + + fileIN = trim(dinput)//trim(finput) + call nc_read_input_file(fileIN,Npoints,Nlevels,N_HYDRO,lon,lat,p,ph,zlev,zlev_half, & + T,sh,rh,tca,cca,mr_lsliq,mr_lsice,mr_ccliq,mr_ccice,fl_lsrain, & + fl_lssnow,fl_lsgrpl,fl_ccrain,fl_ccsnow,Reff,dtau_s,dtau_c, & + dem_s,dem_c,skt,psfc,landmask,mr_ozone,u_wind,v_wind,sunlit, & + gwvel, gcumf, & ! added by DPLRW + mr_lsrain, mr_lssnow, & ! adjust to prognostic precipitation + emsfc_lw,geomode,Nlon,Nlat,surfelev, & + year,month,day,hour,minute,seconds) + call cpu_time(driver_time(2)) + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Which simulators need to be run? Look at which outputs are requested. + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (Lpctisccp .or. Lclisccp .or. Lboxptopisccp .or. Lboxtauisccp .or. Ltauisccp .or. & + Lcltisccp .or. Lmeantbisccp .or. Lmeantbclrisccp .or. Lalbisccp) Lisccp = .true. + if (LclMISR) Lmisr = .true. + if (Lcltmodis .or. Lclwmodis .or. Lclimodis .or. Lclhmodis .or. Lclmmodis .or. & + Lcllmodis .or. Ltautmodis .or. Ltauwmodis .or. Ltauimodis .or. Ltautlogmodis .or. & + Ltauwlogmodis .or. Ltauilogmodis .or. Lreffclwmodis .or. Lreffclimodis .or. & + Lpctmodis .or. Llwpmodis .or. Liwpmodis .or. Lclmodis) Lmodis = .true. + if (Lclcalipso2 .or. Lclcalipso .or. Lclhcalipso .or. Lcllcalipso .or. Lclmcalipso & + .or. Lcltcalipso .or. Lcltlidarradar .or. Lclcalipsoliq .or. Lclcalipsoice .or. & + Lclcalipsoun .or. Lclcalipsotmp .or. Lclcalipsotmpliq .or. Lclcalipsotmpice .or. & + Lclcalipsotmpun .or. Lcltcalipsoliq .or. Lcltcalipsoice .or. Lcltcalipsoun .or. & + Lclhcalipsoliq .or. Lclhcalipsoice .or. Lclhcalipsoun .or. Lclmcalipsoliq .or. & + Lclmcalipsoice .or. Lclmcalipsoun .or. Lcllcalipsoliq .or. Lcllcalipsoice .or. & + Lcllcalipsoun .or. LlidarBetaMol532 .or. LcfadLidarsr532 .or. Lcltlidarradar .or. & + Lcltlidarradar .or. Lclopaquecalipso .or. Lclthincalipso .or. Lclzopaquecalipso & + .or. Lclcalipsoopaque .or. Lclcalipsothin .or. Lclcalipsozopaque .or. & + Lclcalipsoopacity .or. Lclopaquetemp .or. Lclthintemp .or. Lclzopaquetemp .or. & + Lclopaquemeanz .or. Lclthinmeanz .or. Lclthinemis .or. Lclopaquemeanzse .or. & + Lclthinmeanzse .or. Lclzopaquecalipsose) Lcalipso = .true. + + if (LlidarBetaMol532gr .or. LcfadLidarsr532gr .or. Latb532gr .or. LclgrLidar532 .or. & + LclhgrLidar532 .or. LcllgrLidar532 .or. LclmgrLidar532 .or. LcltgrLidar532) & + LgrLidar532 = .true. + + if (LlidarBetaMol355 .or. LcfadLidarsr355 .or. Latb355 .or. Lclatlid .or. & + Lclhatlid .or. Lcllatlid .or. Lclmatlid .or. Lcltatlid) & + Latlid = .true. + + if (LcfadDbze94 .or. Ldbze94 .or. Lcltlidarradar) Lcloudsat = .true. + + if (LcfadDbze94 .or. Ldbze94 .or. Lcltlidarradar .or. Lptradarflag0 .or. Lptradarflag1 & + .or. Lptradarflag2 .or. Lptradarflag3 .or. Lptradarflag4 .or. Lptradarflag5 .or. & + Lptradarflag6 .or. Lptradarflag7 .or. Lptradarflag8 .or. Lptradarflag9 .or. & + Lradarpia) Lcloudsat = .true. + if (Lparasolrefl) Lparasol = .true. + if (rttov_Ninstruments .gt. 0) Lrttov = .true. + if (Ldplrw) Lcloudsat = .true. ! added by DPLRW + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! IF IMPLEMTING COSP IN GCM, HERE IS WHERE TO START!!! + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Initialize COSP + !*This only needs to be done the first time that COSP is called.* + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + ! Initialize quickbeam_optics, also if two-moment radar microphysics scheme is wanted... + if (cloudsat_micro_scheme == 'MMF_v3.5_two_moment') then + ldouble = .true. + lsingle = .false. + endif + call quickbeam_optics_init() + + ! Initialize the distributional parameters for hydrometeors in radar simulator + call hydro_class_init(lsingle,ldouble,sd) + + ! Initialize COSP simulator + call COSP_INIT(Lisccp, Lmodis, Lmisr, Lcloudsat, Lcalipso, LgrLidar532, Latlid, & + Lparasol, Lrttov, & + cloudsat_radar_freq, cloudsat_k2, cloudsat_use_gas_abs, & + cloudsat_do_ray, isccp_topheight, isccp_topheight_direction, surface_radar, & + rcfg_cloudsat, use_vgrid, csat_vgrid, Nlvgrid, Nlevels, cloudsat_micro_scheme, & + rttov_Ninstruments, rttov_instrument_namelists_final, rttov_configs, & + debug=rttov_verbose) + call cpu_time(driver_time(3)) + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Construct output derived type. + ! *NOTE* The "construct/destroy" subroutines are local to this module and should be + ! modified for your configuration. E.g. it may be overkill to query each field. + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + call construct_cosp_outputs(Lpctisccp, Lclisccp, Lboxptopisccp, Lboxtauisccp, & + Ltauisccp, Lcltisccp, Lmeantbisccp, Lmeantbclrisccp, Lalbisccp, LclMISR, & + Lcltmodis, Lclwmodis, Lclimodis, Lclhmodis, Lclmmodis, Lcllmodis, Ltautmodis, & + Ltauwmodis, Ltauimodis, Ltautlogmodis, Ltauwlogmodis, Ltauilogmodis, & + Lreffclwmodis, Lreffclimodis, Lpctmodis, Llwpmodis, Liwpmodis, Lclmodis, Latb532, & + Latb532gr, Latb355, LlidarBetaMol532, LlidarBetaMol532gr, LlidarBetaMol355, & + LcfadLidarsr532, LcfadLidarsr532gr, LcfadLidarsr355, Lclcalipso2, & + Lclcalipso, LclgrLidar532, Lclatlid, Lclhcalipso, Lcllcalipso, Lclmcalipso, & + Lcltcalipso, LclhgrLidar532, LcllgrLidar532, LclmgrLidar532, LcltgrLidar532, & + Lclhatlid, Lcllatlid, Lclmatlid, Lcltatlid, Lcltlidarradar, Lcloudsat_tcc, & + Lcloudsat_tcc2, Lclcalipsoliq, & + Lclcalipsoice, Lclcalipsoun, Lclcalipsotmp, Lclcalipsotmpliq, Lclcalipsotmpice, & + Lclcalipsotmpun, Lcltcalipsoliq, Lcltcalipsoice, Lcltcalipsoun, Lclhcalipsoliq, & + Lclhcalipsoice, Lclhcalipsoun, Lclmcalipsoliq, Lclmcalipsoice, Lclmcalipsoun, & + Lcllcalipsoliq, Lcllcalipsoice, Lcllcalipsoun, Lclopaquecalipso, Lclthincalipso, & + Lclzopaquecalipso, Lclcalipsoopaque, Lclcalipsothin, Lclcalipsozopaque, & + Lclcalipsoopacity, Lclopaquetemp, Lclthintemp, Lclzopaquetemp, Lclopaquemeanz, & + Lclthinmeanz, Lclthinemis, Lclopaquemeanzse, Lclthinmeanzse, Lclzopaquecalipsose, & + LcfadDbze94, Ldbze94, Lparasolrefl, & + Lptradarflag0,Lptradarflag1,Lptradarflag2,Lptradarflag3,Lptradarflag4, & + Lptradarflag5,Lptradarflag6,Lptradarflag7,Lptradarflag8,Lptradarflag9,Lradarpia, & + Lwr_occfreq, Lcfodd, rttov_Ninstruments, rttov_configs, Ldplrw, & + Npoints, Ncolumns, Nlevels, Nlvgrid_local, use_vgrid, cospOUT) + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Break COSP up into pieces and loop over each COSP 'chunk'. + ! nChunks = # Points to Process (nPoints) / # Points per COSP iteration (nPoints_it) + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (MOD(nPoints,nPoints_it) .eq. 0) then + nChunks = Npoints/Npoints_it + else + nChunks = nPoints/nPoints_it+1 + endif + if (nPoints .eq. nPoints_it) nChunks = 1 + write(*,*) 'nChunks = ',nChunks + do iChunk=1,nChunks + write(*,*) 'Now ... iChunk = ',iChunk + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Determine indices for "chunking" (again, if necessary) + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if (nChunks .eq. 1) then + start_idx = 1 + end_idx = nPoints + nPtsPerIt = nPoints + else + start_idx = (iChunk-1)*nPoints_it+1 + end_idx = iChunk*nPoints_it + if (end_idx .gt. nPoints) end_idx=nPoints + nPtsPerIt = end_idx-start_idx+1 + endif + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Construct COSP input types + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (iChunk .eq. 1) then + call construct_cospIN(Nptsperit,nColumns,nLevels,rttov_Ninstruments,cospIN,emis_grey=1.0_wp) + ! call construct_cospIN(Nptsperit,nColumns,nLevels,rttov_Ninstruments,cospIN) + call construct_cospstateIN(Nptsperit,nLevels,cospstateIN) + endif + if (iChunk .eq. nChunks) then + call destroy_cospIN(cospIN) + call destroy_cospstateIN(cospstateIN) + call construct_cospIN(Nptsperit,nColumns,nLevels,rttov_Ninstruments,cospIN,emis_grey=1.0_wp) + ! call construct_cospIN(Nptsperit,nColumns,nLevels,rttov_Ninstruments,cospIN) + call construct_cospstateIN(Nptsperit,nLevels,cospstateIN) + endif + call cpu_time(driver_time(4)) + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Populate input types with model fields. + ! Here the 3D sample model fields (temperature,pressure,etc...) are ordered from the + ! surface-2-TOA, whereas COSP expects all fields to be ordered from TOA-2-SFC. So the + ! vertical fields are flipped prior to storing to COSP input type. + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + cospIN%emsfc_lw = emsfc_lw + cospIN%rcfg_cloudsat = rcfg_cloudsat + cospIN%cfg_rttov => rttov_configs + cospIN%cospswathsIN = cospswathsIN ! Swathing information for each non-RTTOV simulator. + + cospstateIN%hgt_matrix = zlev(start_idx:end_idx,Nlevels:1:-1) ! km + cospstateIN%sunlit = sunlit(start_idx:end_idx) ! 0-1 + cospstateIN%skt = skt(start_idx:end_idx) ! K + cospstateIN%surfelev = surfelev(start_idx:end_idx) ! m + cospstateIN%land = landmask(start_idx:end_idx) ! 0-1 (*note* model specific) + cospstateIN%qv = sh(start_idx:end_idx,Nlevels:1:-1) ! kg/kg + cospstateIN%at = T(start_idx:end_idx,Nlevels:1:-1) ! K + cospstateIN%pfull = p(start_idx:end_idx,Nlevels:1:-1) ! Pa + ! Pressure at interface (nlevels+1). Set uppermost interface to 0. + cospstateIN%phalf(:,2:Nlevels+1) = ph(start_idx:end_idx,Nlevels:1:-1) ! Pa + cospstateIN%phalf(:,1) = 0._wp + ! Surface pressure + if (any(psfc(start_idx:end_idx) .lt. 0._wp)) then + print*,'Some of values of the surface pressure field are negative. Replacing all psfc values with the lowest boundary pressure.' + psfc(start_idx:end_idx) = cospstateIN%phalf(start_idx:end_idx,Nlevels+1) + end if + cospstateIN%psfc = psfc(start_idx:end_idx) ! Pa + ! Height of bottom interfaces of model layers (nlevels). + ! cospstateIN%hgt_matrix_half(:,1) contains the bottom of the top layer. + ! cospstateIN%hgt_matrix_half(:,Nlevels) contains the bottom of the surface layer. + cospstateIN%hgt_matrix_half(:,1:Nlevels) = zlev_half(start_idx:end_idx,Nlevels:1:-1) ! km + + ! added by DPLRW + cospstateIN%gwvel(:,1:Nlevels) = gwvel(start_idx:end_idx,Nlevels:1:-1) + cospstateIN%gcumf(:,1:Nlevels) = gcumf(start_idx:end_idx,Nlevels:1:-1) + + ! Assign RTTOV values + ! Keeping these structures since refl and emis could come from model input + ! cospstateIN%emis_in(:,:) = 1._wp + ! cospstateIN%refl_in(:,:) = 1._wp + + ! Well-mixed gases are not provided in COSP offline input, so hardcoding them in. + ! Units are kg/kg over moist air. + ! Note: user_tracegas_input should be true in instrument namelists for the COSP offline driver + cospstateIN%co2(:,:) = 5.241e-04 + cospstateIN%ch4(:,:) = 9.139e-07 + cospstateIN%n2o(:,:) = 4.665e-07 + cospstateIN%co(:,:) = 2.098e-07 + cospstateIN%so2(:,:) = 2.0e-11 + + if (any(year(start_idx:end_idx) .lt. 0._wp)) then + print*,'Some of values of the input year field are masked. Replacing with 1 so RTTOV will run.' + where (year(start_idx:end_idx) .lt. 0._wp) + year(start_idx:end_idx) = 1 + end where + end if + if (any(month(start_idx:end_idx) .lt. 0._wp)) then + print*,'Some of values of the input month field are masked. Replacing with 1 so RTTOV will run.' + where (month(start_idx:end_idx) .lt. 0._wp) + month(start_idx:end_idx) = 1 + end where + end if + if (any(day(start_idx:end_idx) .lt. 0._wp)) then + print*,'Some of values of the input day field are masked. Replacing with 1 so RTTOV will run.' + where (day(start_idx:end_idx) .lt. 0._wp) + day(start_idx:end_idx) = 1 + end where + end if + if (any(hour(start_idx:end_idx) .lt. 0._wp)) then + print*,'Some of values of the input hour field are masked. Replacing with 1 so RTTOV will run.' + where (hour(start_idx:end_idx) .lt. 0._wp) + hour(start_idx:end_idx) = 1._wp + end where + end if + if (any(minute(start_idx:end_idx) .lt. 0._wp)) then + print*,'Some of values of the input minute field are masked. Replacing with 1 so RTTOV will run.' + where (minute(start_idx:end_idx) .lt. 0._wp) + minute(start_idx:end_idx) = 1._wp + end where + end if + if (any(seconds(start_idx:end_idx) .lt. 0._wp)) then + print*,'Some of values of the input minute field are masked. Replacing with 1 so RTTOV will run.' + where (seconds(start_idx:end_idx) .lt. 0._wp) + seconds(start_idx:end_idx) = 1._wp + end where + end if + + ! Read in date and time objects for RTTOV + cospstateIN%rttov_date(:,1) = year(start_idx:end_idx) + cospstateIN%rttov_date(:,2) = month(start_idx:end_idx) + cospstateIN%rttov_date(:,3) = day(start_idx:end_idx) + + cospstateIN%rttov_time(:,1) = hour(start_idx:end_idx) + cospstateIN%rttov_time(:,2) = minute(start_idx:end_idx) + cospstateIN%rttov_time(:,3) = seconds(start_idx:end_idx) + + cospstateIN%sza = 0._wp ! Hard code to zero for the offline driver. + + ! From the data input file + cospstateIN%u_sfc = u_wind(start_idx:end_idx) + cospstateIN%v_sfc = v_wind(start_idx:end_idx) + cospstateIN%lat = lat(start_idx:end_idx) + cospstateIN%lon = lon(start_idx:end_idx) + + cospstateIN%o3 = mr_ozone(start_idx:end_idx,Nlevels:1:-1) + cospstateIN%tca = tca(start_idx:end_idx,Nlevels:1:-1) + + ! Combine large-scale and convective cloud mixing ratios for RTTOV [kg/kg] + cospstateIN%cloudIce = mr_lsice(start_idx:end_idx,Nlevels:1:-1) + mr_ccice(start_idx:end_idx,Nlevels:1:-1) + cospstateIN%cloudLiq = mr_lsliq(start_idx:end_idx,Nlevels:1:-1) + mr_ccliq(start_idx:end_idx,Nlevels:1:-1) + + ! Combine large-scale and convective cloud effective radii into effective diameters for RTTOV + ! Reff(Npoints,Nlevels,N_HYDRO) + ! The weighted Reff is given by: Reff_net = (M_1 + M_2) / (M_1/Reff_1 + M_2/Reff_2) + cospstateIN%DeffLiq(:,:) = 0._wp ! Initialize for zero everywhere. + where ((mr_lsliq(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) .and. (mr_ccliq(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp)) + cospstateIN%DeffLiq(:,:) = 2._wp * 1.0e6 * (mr_lsliq(start_idx:end_idx,Nlevels:1:-1) + mr_ccliq(start_idx:end_idx,Nlevels:1:-1)) / & + & (mr_lsliq(start_idx:end_idx,Nlevels:1:-1) / Reff(start_idx:end_idx,Nlevels:1:-1,I_LSCLIQ) + mr_ccliq(start_idx:end_idx,Nlevels:1:-1) / Reff(start_idx:end_idx,Nlevels:1:-1,I_CVCLIQ)) + elsewhere (mr_lsliq(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) + cospstateIN%DeffLiq(:,:) = 2._wp * 1.0e6 * Reff(start_idx:end_idx,Nlevels:1:-1,I_LSCLIQ) + elsewhere (mr_ccliq(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) + cospstateIN%DeffLiq(:,:) = 2._wp * 1.0e6 * Reff(start_idx:end_idx,Nlevels:1:-1,I_CVCLIQ) + end where + + cospstateIN%DeffIce(:,:) = 0._wp ! Initialize for zero everywhere. + where ((mr_lsice(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) .and. (mr_ccice(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp)) + cospstateIN%DeffIce(:,:) = 2._wp * 1.0e6 * (mr_lsice(start_idx:end_idx,Nlevels:1:-1) + mr_ccice(start_idx:end_idx,Nlevels:1:-1)) / & + & (mr_lsice(start_idx:end_idx,Nlevels:1:-1) / Reff(start_idx:end_idx,Nlevels:1:-1,I_LSCICE) + mr_ccice(start_idx:end_idx,Nlevels:1:-1) / Reff(start_idx:end_idx,Nlevels:1:-1,I_CVCICE)) + elsewhere (mr_lsice(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) + cospstateIN%DeffIce(:,:) = 2._wp * 1.0e6 * Reff(start_idx:end_idx,Nlevels:1:-1,I_LSCICE) + elsewhere (mr_ccice(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) + cospstateIN%DeffIce(:,:) = 2._wp * 1.0e6 * Reff(start_idx:end_idx,Nlevels:1:-1,I_CVCICE) + end where + + ! RTTOV doesn't consider precip flux for longwave, but it could be used when simulating MW instruments. + ! Graupel goes in the snow category, arbitrarily + cospstateIN%fl_rain = fl_lsrain(start_idx:end_idx,Nlevels:1:-1) + fl_ccrain(start_idx:end_idx,Nlevels:1:-1) + cospstateIN%fl_snow = fl_lssnow(start_idx:end_idx,Nlevels:1:-1) + fl_ccsnow(start_idx:end_idx,Nlevels:1:-1) + & + fl_lsgrpl(start_idx:end_idx,Nlevels:1:-1) + + ! Inputs not supplied in the UKMO test data + cospstateIN%rttov_sfcmask = landmask(start_idx:end_idx) ! (0=ocn,1=land,2=seaice). No sea ice in UKMO input here. + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Generate subcolumns and compute optical inputs. + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + call subsample_and_optics(nPtsPerIt,nLevels,nColumns,N_HYDRO,overlap, & + use_vgrid,use_precipitation_fluxes,lidar_ice_type,sd, & + tca(start_idx:end_idx,Nlevels:1:-1),cca(start_idx:end_idx,Nlevels:1:-1), & + fl_lsrain(start_idx:end_idx,Nlevels:1:-1),fl_lssnow(start_idx:end_idx,Nlevels:1:-1), & + fl_lsgrpl(start_idx:end_idx,Nlevels:1:-1),fl_ccrain(start_idx:end_idx,Nlevels:1:-1), & + fl_ccsnow(start_idx:end_idx,Nlevels:1:-1),mr_lsliq(start_idx:end_idx,Nlevels:1:-1), & + mr_lsice(start_idx:end_idx,Nlevels:1:-1),mr_ccliq(start_idx:end_idx,Nlevels:1:-1), & + mr_ccice(start_idx:end_idx,Nlevels:1:-1), & + mr_lsrain(start_idx:end_idx,Nlevels:1:-1),mr_lssnow(start_idx:end_idx,Nlevels:1:-1), & + Reff(start_idx:end_idx,Nlevels:1:-1,:), & + dtau_c(start_idx:end_idx,nLevels:1:-1),dtau_s(start_idx:end_idx,nLevels:1:-1), & + dem_c(start_idx:end_idx,nLevels:1:-1),dem_s(start_idx:end_idx,nLevels:1:-1), & + cospstateIN,cospIN) + + call cpu_time(driver_time(6)) + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Call COSP + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + cosp_status = COSP_SIMULATOR(cospIN, cospstateIN, cospOUT,start_idx,end_idx,rttov_verbose) + do ij=1,size(cosp_status,1) + if (cosp_status(ij) .ne. '') print*,trim(cosp_status(ij)) + end do + + call cpu_time(driver_time(7)) + + end do + + print*,'Time to read in data: ',driver_time(2)-driver_time(1) + print*,'Time to initialize: ',driver_time(3)-driver_time(2) + print*,'Time to construct types: ',driver_time(4)-driver_time(3) + print*,'Time to compute optics: ',driver_time(6)-driver_time(4) + print*,'Time to run COSP: ',driver_time(7)-driver_time(6) + print*,'Total time: ',driver_time(7)-driver_time(1) + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Output + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + call write_cosp2_output(Npoints, Ncolumns, Nlevels, rttov_Ninstruments, zlev(1,Nlevels:1:-1), lon, lat, cospOUT, foutput) + + call cpu_time(driver_time(8)) + print*,'Time to write to output: ',driver_time(8)-driver_time(7) + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Free up memory + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (rttov_verbose) print*,'Calling "destroy_cosp_outputs".' + call destroy_cosp_outputs(cospOUT) + if (associated(cospIN%cfg_rttov)) then + if (rttov_verbose) print*,'Calling "rttov_cleanup".' + call rttov_cleanup(cospIN) + endif + if (rttov_verbose) print*,'Calling "destroy_cospIN".' + call destroy_cospIN(cospIN) + if (rttov_verbose) print*,'Calling "destroy_cospstateIN".' + call destroy_cospstateIN(cospstateIN) + if (rttov_verbose) print*,'Calling "cosp_cleanUp".' + call cosp_cleanUp() + if (rttov_verbose) print*,'all done.' + +contains + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE subsample_and_optics + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + subroutine subsample_and_optics(nPoints, nLevels, nColumns, nHydro, overlap, use_vgrid, & + use_precipitation_fluxes, lidar_ice_type, sd, & + tca, cca, fl_lsrainIN, fl_lssnowIN, & + fl_lsgrplIN, fl_ccrainIN, fl_ccsnowIN, mr_lsliq, mr_lsice, mr_ccliq, mr_ccice, & + mr_lsrain, mr_lssnow, & ! adjust to prognostic precipitation + reffIN, dtau_c, dtau_s, dem_c, dem_s, cospstateIN, cospIN) + ! Inputs + integer,intent(in) :: nPoints, nLevels, nColumns, nHydro, overlap, lidar_ice_type + real(wp),intent(in),dimension(nPoints,nLevels) :: tca,cca,mr_lsliq,mr_lsice,mr_ccliq, & + mr_ccice,dtau_c,dtau_s,dem_c,dem_s,fl_lsrainIN,fl_lssnowIN,fl_lsgrplIN,fl_ccrainIN,& + fl_ccsnowIN, mr_lsrain, mr_lssnow + real(wp),intent(in),dimension(nPoints,nLevels,nHydro) :: reffIN + logical,intent(in) :: use_vgrid ! .false.: outputs on model levels + ! .true.: outputs on evenly-spaced vertical levels. + logical,intent(in) :: use_precipitation_fluxes + type(size_distribution),intent(inout) :: sd + + ! Outputs + type(cosp_optical_inputs),intent(inout) :: cospIN + type(cosp_column_inputs),intent(inout) :: cospstateIN + + ! Local variables + type(rng_state),allocatable,dimension(:) :: rngs ! Seeds for random number generator + integer,dimension(:),allocatable :: seed + integer,dimension(:),allocatable :: cloudsat_preclvl_index + integer :: i,j,k + real(wp) :: zstep + real(wp),dimension(:,:), allocatable :: & + ls_p_rate, cv_p_rate, frac_ls, frac_cv, prec_ls, prec_cv,g_vol + real(wp),dimension(:,:,:), allocatable :: & + frac_prec, MODIS_cloudWater, MODIS_cloudIce, fracPrecipIce, fracPrecipIce_statGrid,& + MODIS_watersize,MODIS_iceSize, MODIS_opticalThicknessLiq,MODIS_opticalThicknessIce + real(wp),dimension(:,:,:,:),allocatable :: & + mr_hydro, Reff, Np + real(wp),dimension(nPoints,nLevels) :: & + column_frac_out, column_prec_out, fl_lsrain, fl_lssnow, fl_lsgrpl, fl_ccrain, fl_ccsnow + real(wp),dimension(nPoints,nColumns,Nlvgrid_local) :: tempOut + logical :: cmpGases=.true. + logical :: prog_flag=.true. ! adjust to prognostic precipitation + + if (Ncolumns .gt. 1) then + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Generate subcolumns for clouds (SCOPS) and precipitation type (PREC_SCOPS) + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! RNG used for subcolumn generation + allocate(rngs(nPoints),seed(nPoints)) + seed(:)=0 + seed = int(cospstateIN%phalf(:,Nlevels+1)) ! In case of NPoints=1 + ! *NOTE* Chunking will change the seed + if (NPoints .gt. 1) seed=int((cospstateIN%phalf(:,Nlevels+1)-minval(cospstateIN%phalf(:,Nlevels+1)))/ & + (maxval(cospstateIN%phalf(:,Nlevels+1))-minval(cospstateIN%phalf(:,Nlevels+1)))*100000) + 1 + call init_rng(rngs, seed) + + ! Call scops + call scops(NPoints,Nlevels,Ncolumns,rngs,tca,cca,overlap,cospIN%frac_out,0) + deallocate(seed,rngs) + + ! Sum up precipitation rates + allocate(ls_p_rate(nPoints,nLevels),cv_p_rate(nPoints,Nlevels)) + if(use_precipitation_fluxes) then + ls_p_rate(:,1:nLevels) = fl_lsrainIN + fl_lssnowIN + fl_lsgrplIN + cv_p_rate(:,1:nLevels) = fl_ccrainIN + fl_ccsnowIN + else + ls_p_rate(:,1:nLevels) = 0 ! mixing_ratio(rain) + mixing_ratio(snow) + mixing_ratio (groupel) + cv_p_rate(:,1:nLevels) = 0 ! mixing_ratio(rain) + mixing_ratio(snow) + mixing_ratio (groupel) + end if + + ! Call PREC_SCOPS + allocate(frac_prec(nPoints,nColumns,nLevels)) + call prec_scops(nPoints,nLevels,nColumns,ls_p_rate,cv_p_rate,cospIN%frac_out,frac_prec) + deallocate(ls_p_rate,cv_p_rate) + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Compute fraction in each gridbox for precipitation and cloud type. + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Allocate + allocate(frac_ls(nPoints,nLevels),prec_ls(nPoints,nLevels), & + frac_cv(nPoints,nLevels),prec_cv(nPoints,nLevels)) + + ! Initialize + frac_ls(1:nPoints,1:nLevels) = 0._wp + prec_ls(1:nPoints,1:nLevels) = 0._wp + frac_cv(1:nPoints,1:nLevels) = 0._wp + prec_cv(1:nPoints,1:nLevels) = 0._wp + do j=1,nPoints + do k=1,nLevels + do i=1,nColumns + if (cospIN%frac_out(j,i,k) .eq. 1) frac_ls(j,k) = frac_ls(j,k)+1._wp + if (cospIN%frac_out(j,i,k) .eq. 2) frac_cv(j,k) = frac_cv(j,k)+1._wp + if (frac_prec(j,i,k) .eq. 1) prec_ls(j,k) = prec_ls(j,k)+1._wp + if (frac_prec(j,i,k) .eq. 2) prec_cv(j,k) = prec_cv(j,k)+1._wp + if (frac_prec(j,i,k) .eq. 3) prec_cv(j,k) = prec_cv(j,k)+1._wp + if (frac_prec(j,i,k) .eq. 3) prec_ls(j,k) = prec_ls(j,k)+1._wp + enddo + frac_ls(j,k)=frac_ls(j,k)/nColumns + frac_cv(j,k)=frac_cv(j,k)/nColumns + prec_ls(j,k)=prec_ls(j,k)/nColumns + prec_cv(j,k)=prec_cv(j,k)/nColumns + enddo + enddo + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Assign gridmean mixing-ratios (mr_XXXXX), effective radius (ReffIN) and number + ! concentration (not defined) to appropriate sub-column. Here we are using scops. + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + allocate(mr_hydro(nPoints,nColumns,nLevels,nHydro), & + Reff(nPoints,nColumns,nLevels,nHydro), & + Np(nPoints,nColumns,nLevels,nHydro)) + + ! Initialize + mr_hydro(:,:,:,:) = 0._wp + Reff(:,:,:,:) = 0._wp + Np(:,:,:,:) = 0._wp + + ! check prognostic precipitaion + if ( any(mr_lsrain .lt. 0._wp) .or. any(mr_lssnow .lt. 0._wp) ) prog_flag = .false. + + do k=1,nColumns + ! Subcolumn cloud fraction + column_frac_out = cospIN%frac_out(:,k,:) + + ! LS clouds + where (column_frac_out == I_LSC) + mr_hydro(:,k,:,I_LSCLIQ) = mr_lsliq + mr_hydro(:,k,:,I_LSCICE) = mr_lsice + Reff(:,k,:,I_LSCLIQ) = ReffIN(:,:,I_LSCLIQ) + Reff(:,k,:,I_LSCICE) = ReffIN(:,:,I_LSCICE) + ! CONV clouds + elsewhere (column_frac_out == I_CVC) + mr_hydro(:,k,:,I_CVCLIQ) = mr_ccliq + mr_hydro(:,k,:,I_CVCICE) = mr_ccice + Reff(:,k,:,I_CVCLIQ) = ReffIN(:,:,I_CVCLIQ) + Reff(:,k,:,I_CVCICE) = ReffIN(:,:,I_CVCICE) + end where + + ! Subcolumn precipitation + column_prec_out = frac_prec(:,k,:) + + ! LS Precipitation + where ((column_prec_out == 1) .or. (column_prec_out == 3) ) + Reff(:,k,:,I_LSRAIN) = ReffIN(:,:,I_LSRAIN) + Reff(:,k,:,I_LSSNOW) = ReffIN(:,:,I_LSSNOW) + Reff(:,k,:,I_LSGRPL) = ReffIN(:,:,I_LSGRPL) + ! CONV precipitation + elsewhere ((column_prec_out == 2) .or. (column_prec_out == 3)) + Reff(:,k,:,I_CVRAIN) = ReffIN(:,:,I_CVRAIN) + Reff(:,k,:,I_CVSNOW) = ReffIN(:,:,I_CVSNOW) + end where + enddo + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Convert the subcolumn mixing ratio and precipitation fluxes from gridbox mean + ! values to fraction-based values. + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Initialize + fl_lsrain(:,:) = 0._wp + fl_lssnow(:,:) = 0._wp + fl_lsgrpl(:,:) = 0._wp + fl_ccrain(:,:) = 0._wp + fl_ccsnow(:,:) = 0._wp + + do k=1,nLevels + do j=1,nPoints + ! In-cloud mixing ratios. + if (frac_ls(j,k) .ne. 0.) then + mr_hydro(j,:,k,I_LSCLIQ) = mr_hydro(j,:,k,I_LSCLIQ)/frac_ls(j,k) + mr_hydro(j,:,k,I_LSCICE) = mr_hydro(j,:,k,I_LSCICE)/frac_ls(j,k) + endif + if (frac_cv(j,k) .ne. 0.) then + mr_hydro(j,:,k,I_CVCLIQ) = mr_hydro(j,:,k,I_CVCLIQ)/frac_cv(j,k) + mr_hydro(j,:,k,I_CVCICE) = mr_hydro(j,:,k,I_CVCICE)/frac_cv(j,k) + endif + ! Precipitation + if (use_precipitation_fluxes) then + if (prec_ls(j,k) .ne. 0.) then + if (prog_flag) then + mr_hydro(j,:,k,I_LSRAIN) = mr_lsrain(j,k)/prec_ls(j,k) + mr_hydro(j,:,k,I_LSSNOW) = mr_lssnow(j,k)/prec_ls(j,k) + else + fl_lsrain(j,k) = fl_lsrainIN(j,k)/prec_ls(j,k) + fl_lssnow(j,k) = fl_lssnowIN(j,k)/prec_ls(j,k) + fl_lsgrpl(j,k) = fl_lsgrplIN(j,k)/prec_ls(j,k) + end if + endif + if (prec_cv(j,k) .ne. 0.) then + fl_ccrain(j,k) = fl_ccrainIN(j,k)/prec_cv(j,k) + fl_ccsnow(j,k) = fl_ccsnowIN(j,k)/prec_cv(j,k) + endif + else + if (prec_ls(j,k) .ne. 0.) then + mr_hydro(j,:,k,I_LSRAIN) = mr_hydro(j,:,k,I_LSRAIN)/prec_ls(j,k) + mr_hydro(j,:,k,I_LSSNOW) = mr_hydro(j,:,k,I_LSSNOW)/prec_ls(j,k) + mr_hydro(j,:,k,I_LSGRPL) = mr_hydro(j,:,k,I_LSGRPL)/prec_ls(j,k) + endif + if (prec_cv(j,k) .ne. 0.) then + mr_hydro(j,:,k,I_CVRAIN) = mr_hydro(j,:,k,I_CVRAIN)/prec_cv(j,k) + mr_hydro(j,:,k,I_CVSNOW) = mr_hydro(j,:,k,I_CVSNOW)/prec_cv(j,k) + endif + endif + + ! cumulus mass flux, added by DPLRW + if (cca(j,k) > 0._wp .and. cca(j,k) <= 1._wp) then + cospstateIN%gcumf(j,k) = cospstateIN%gcumf(j,k)/cca(j,k) + else + cospstateIN%gcumf(j,k) = R_UNDEF + end if + enddo + enddo + deallocate(frac_ls,prec_ls,frac_cv,prec_cv) + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Convert precipitation fluxes to mixing ratios + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (use_precipitation_fluxes) then + ! LS rain + if (.not. prog_flag) then + call cosp_precip_mxratio(Npoints, Nlevels, Ncolumns, & + cospstateIN%pfull, cospstateIN%at, frac_prec, 1._wp, I_LSRAIN, sd, & + fl_lsrain, mr_hydro(:,:,:,I_LSRAIN), Reff(:,:,:,I_LSRAIN) ) + end if + ! LS snow + if (.not. prog_flag) then + call cosp_precip_mxratio(Npoints, Nlevels, Ncolumns, & + cospstateIN%pfull, cospstateIN%at, frac_prec, 1._wp, I_LSSNOW, sd, & + fl_lssnow, mr_hydro(:,:,:,I_LSSNOW), Reff(:,:,:,I_LSSNOW) ) + end if + ! CV rain + call cosp_precip_mxratio(Npoints, Nlevels, Ncolumns, & + cospstateIN%pfull, cospstateIN%at, frac_prec, 2._wp, I_CVRAIN, sd, & + fl_lssnow, mr_hydro(:,:,:,I_CVRAIN), Reff(:,:,:,I_CVRAIN) ) + ! CV snow + call cosp_precip_mxratio(Npoints, Nlevels, Ncolumns, & + cospstateIN%pfull, cospstateIN%at, frac_prec, 2._wp, I_CVSNOW, sd, & + fl_lssnow, mr_hydro(:,:,:,I_CVSNOW), Reff(:,:,:,I_CVSNOW) ) + ! LS groupel. + call cosp_precip_mxratio(Npoints, Nlevels, Ncolumns, & + cospstateIN%pfull, cospstateIN%at, frac_prec, 1._wp, I_LSGRPL, sd, & + fl_lssnow, mr_hydro(:,:,:,I_LSGRPL), Reff(:,:,:,I_LSGRPL) ) + + deallocate(frac_prec) + endif + + else + cospIN%frac_out(:,:,:) = 1 + allocate(mr_hydro(nPoints,1,nLevels,nHydro),Reff(nPoints,1,nLevels,nHydro), & + Np(nPoints,1,nLevels,nHydro)) + mr_hydro(:,1,:,I_LSCLIQ) = mr_lsliq + mr_hydro(:,1,:,I_LSCICE) = mr_lsice + mr_hydro(:,1,:,I_CVCLIQ) = mr_ccliq + mr_hydro(:,1,:,I_CVCICE) = mr_ccice + Reff(:,1,:,:) = ReffIN + endif + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! 11 micron emissivity + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (Lisccp) then + call cosp_simulator_optics(nPoints,nColumns,nLevels,cospIN%frac_out,dem_c,dem_s, & + cospIN%emiss_11) + endif + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! 0.67 micron optical depth + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (Lisccp .or. Lmisr .or. Lmodis) then + call cosp_simulator_optics(nPoints,nColumns,nLevels,cospIN%frac_out,dtau_c,dtau_s, & + cospIN%tau_067) + endif + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! LIDAR Polarized optics + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (Lcalipso) then + call lidar_optics(nPoints, nColumns, nLevels, 4, lidar_ice_type, 532, .false., & + mr_hydro(:,:,:,I_LSCLIQ), mr_hydro(:,:,:,I_LSCICE), mr_hydro(:,:,:,I_CVCLIQ), & + mr_hydro(:,:,:,I_CVCICE), ReffIN(:,:,I_LSCLIQ), ReffIN(:,:,I_LSCICE), & + ReffIN(:,:,I_CVCLIQ), ReffIN(:,:,I_CVCICE), cospstateIN%pfull, & + cospstateIN%phalf, cospstateIN%at, cospIN%beta_mol_calipso, & + cospIN%betatot_calipso, cospIN%tau_mol_calipso, cospIN%tautot_calipso, & + cospIN%tautot_S_liq, cospIN%tautot_S_ice, cospIN%betatot_ice_calipso, & + cospIN%betatot_liq_calipso, cospIN%tautot_ice_calipso, cospIN%tautot_liq_calipso) + endif + + if (LgrLidar532) then + call lidar_optics(nPoints, nColumns, nLevels, 4, lidar_ice_type, 532, .true., & + mr_hydro(:,:,:,I_LSCLIQ), mr_hydro(:,:,:,I_LSCICE), mr_hydro(:,:,:,I_CVCLIQ), & + mr_hydro(:,:,:,I_CVCICE), ReffIN(:,:,I_LSCLIQ), ReffIN(:,:,I_LSCICE), & + ReffIN(:,:,I_CVCLIQ), ReffIN(:,:,I_CVCICE), cospstateIN%pfull, & + cospstateIN%phalf, cospstateIN%at, cospIN%beta_mol_grLidar532, & + cospIN%betatot_grLidar532, cospIN%tau_mol_grLidar532, cospIN%tautot_grLidar532) + endif + + if (Latlid) then + call lidar_optics(nPoints, nColumns, nLevels, 4, lidar_ice_type, 355, .false., & + mr_hydro(:,:,:,I_LSCLIQ), mr_hydro(:,:,:,I_LSCICE), mr_hydro(:,:,:,I_CVCLIQ), & + mr_hydro(:,:,:,I_CVCICE), ReffIN(:,:,I_LSCLIQ), ReffIN(:,:,I_LSCICE), & + ReffIN(:,:,I_CVCLIQ), ReffIN(:,:,I_CVCICE), cospstateIN%pfull, & + cospstateIN%phalf, cospstateIN%at, cospIN%beta_mol_atlid, cospIN%betatot_atlid,& + cospIN%tau_mol_atlid, cospIN%tautot_atlid) + endif + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! CLOUDSAT RADAR OPTICS + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (lcloudsat) then + + ! Compute gaseous absorption (assume identical for each subcolun) + allocate(g_vol(nPoints,nLevels)) + g_vol(:,:)=0._wp + do i=1,nPoints + do j=1,nLevels + if (rcfg_cloudsat%use_gas_abs == 1 .or. (rcfg_cloudsat%use_gas_abs == 2 .and. j .eq. 1)) then + g_vol(i,j) = gases(cospstateIN%pfull(i,j), cospstateIN%at(i,j),cospstateIN%qv(i,j),rcfg_cloudsat%freq) + endif + cospIN%g_vol_cloudsat(i,:,j)=g_vol(i,j) + end do + end do + + ! Loop over all subcolumns + allocate(fracPrecipIce(nPoints,nColumns,nLevels)) + fracPrecipIce(:,:,:) = 0._wp + do k=1,nColumns + call quickbeam_optics(sd, rcfg_cloudsat, nPoints, nLevels, R_UNDEF, & + mr_hydro(:,k,:,1:nHydro)*1000._wp, Reff(:,k,:,1:nHydro)*1.e6_wp,& + Np(:,k,:,1:nHydro), cospstateIN%pfull, cospstateIN%at, & + cospstateIN%qv, cospIN%z_vol_cloudsat(1:nPoints,k,:), & + cospIN%kr_vol_cloudsat(1:nPoints,k,:), & + cospIN%vfall(1:nPoints,k,:,1:N_Hydro), & + cospIN%vfsqu(1:nPoints,k,:,1:N_Hydro), & + cospIN%zehyd(1:nPoints,k,:,1:N_Hydro), & + cospIN%krhyd(1:nPoints,k,:,1:N_Hydro), & + cospIN%vtrm3(1:nPoints,k,:,1:N_Hydro), & + cospIN%vtrm0(1:nPoints,k,:,1:N_Hydro), & + cospIN%mmnt3(1:nPoints,k,:,1:N_Hydro), & + cospIN%mmnt0(1:nPoints,k,:,1:N_Hydro) ) + + ! At each model level, what fraction of the precipitation is frozen? + where(mr_hydro(:,k,:,I_LSRAIN) .gt. 0 .or. mr_hydro(:,k,:,I_LSSNOW) .gt. 0 .or. & + mr_hydro(:,k,:,I_CVRAIN) .gt. 0 .or. mr_hydro(:,k,:,I_CVSNOW) .gt. 0 .or. & + mr_hydro(:,k,:,I_LSGRPL) .gt. 0) + fracPrecipIce(:,k,:) = (mr_hydro(:,k,:,I_LSSNOW) + mr_hydro(:,k,:,I_CVSNOW) + & + mr_hydro(:,k,:,I_LSGRPL)) / & + (mr_hydro(:,k,:,I_LSSNOW) + mr_hydro(:,k,:,I_CVSNOW) + mr_hydro(:,k,:,I_LSGRPL) + & + mr_hydro(:,k,:,I_LSRAIN) + mr_hydro(:,k,:,I_CVRAIN)) + elsewhere + fracPrecipIce(:,k,:) = 0._wp + endwhere + enddo + + ! Regrid frozen fraction to Cloudsat/Calipso statistical grid + if (use_vgrid) then + allocate(fracPrecipIce_statGrid(nPoints,nColumns,Nlvgrid_local)) + fracPrecipIce_statGrid(:,:,:) = 0._wp + call cosp_change_vertical_grid(Npoints, Ncolumns, Nlevels, cospstateIN%hgt_matrix(:,Nlevels:1:-1), & + cospstateIN%hgt_matrix_half(:,Nlevels:1:-1), fracPrecipIce(:,:,Nlevels:1:-1), Nlvgrid_local, & + vgrid_zl(Nlvgrid_local:1:-1), vgrid_zu(Nlvgrid_local:1:-1), fracPrecipIce_statGrid(:,:,Nlvgrid_local:1:-1)) + + ! Find proper layer above de surface elevation to compute precip flags in Cloudsat/Calipso statistical grid + allocate(cloudsat_preclvl_index(nPoints)) + cloudsat_preclvl_index(:) = 0._wp + ! Compute the zstep distance between two atmopsheric layers + zstep = vgrid_zl(1)-vgrid_zl(2) + ! Computing altitude index for precip flags calculation (one layer above surfelev layer) + cloudsat_preclvl_index(:) = cloudsat_preclvl - floor( cospstateIN%surfelev(:)/zstep ) + + ! For near-surface diagnostics, we only need the frozen fraction at one layer. + do i=1,nPoints + cospIN%fracPrecipIce(i,:) = fracPrecipIce_statGrid(i,:,cloudsat_preclvl_index(i)) + enddo + deallocate(cloudsat_preclvl_index) + deallocate(fracPrecipIce_statGrid) + endif + + endif + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! MODIS optics + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (Lmodis) then + allocate(MODIS_cloudWater(nPoints,nColumns,nLevels), & + MODIS_cloudIce(nPoints,nColumns,nLevels), & + MODIS_waterSize(nPoints,nColumns,nLevels), & + MODIS_iceSize(nPoints,nColumns,nLevels), & + MODIS_opticalThicknessLiq(nPoints,nColumns,nLevels), & + MODIS_opticalThicknessIce(nPoints,nColumns,nLevels)) + ! Cloud water + call cosp_simulator_optics(nPoints,nColumns,nLevels,cospIN%frac_out, & + mr_hydro(:,:,:,I_CVCLIQ),mr_hydro(:,:,:,I_LSCLIQ),MODIS_cloudWater) + ! Cloud ice + call cosp_simulator_optics(nPoints,nColumns,nLevels,cospIN%frac_out, & + mr_hydro(:,:,:,I_CVCICE),mr_hydro(:,:,:,I_LSCICE),MODIS_cloudIce) + ! Water droplet size + call cosp_simulator_optics(nPoints,nColumns,nLevels,cospIN%frac_out, & + Reff(:,:,:,I_CVCLIQ),Reff(:,:,:,I_LSCLIQ),MODIS_waterSize) + ! Ice crystal size + call cosp_simulator_optics(nPoints,nColumns,nLevels,cospIN%frac_out, & + Reff(:,:,:,I_CVCICE),Reff(:,:,:,I_LSCICE),MODIS_iceSize) + + ! Partition optical thickness into liquid and ice parts + call modis_optics_partition(nPoints, nLevels, nColumns, MODIS_cloudWater, & + MODIS_cloudIce, MODIS_waterSize, MODIS_iceSize, cospIN%tau_067, & + MODIS_opticalThicknessLiq, MODIS_opticalThicknessIce) + + ! Compute assymetry parameter and single scattering albedo + call modis_optics(nPoints, nLevels, nColumns, MODIS_opticalThicknessLiq, & + MODIS_waterSize*1.0e6_wp, MODIS_opticalThicknessIce, & + MODIS_iceSize*1.0e6_wp, cospIN%fracLiq, cospIN%asym, cospIN%ss_alb) + + ! Deallocate memory + deallocate(MODIS_cloudWater,MODIS_cloudIce,MODIS_WaterSize,MODIS_iceSize, & + MODIS_opticalThicknessLiq,MODIS_opticalThicknessIce,mr_hydro, & + Np,Reff) + endif + end subroutine subsample_and_optics + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE construct_cospIN + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + subroutine construct_cospIN(npoints,ncolumns,nlevels,ninst_rttov,y,emis_grey) + ! Inputs + integer,intent(in) :: & + npoints, & ! Number of horizontal gridpoints + ncolumns, & ! Number of subcolumns + nlevels, & ! Number of vertical levels + ninst_rttov ! Number of RTTOV instruments + ! Outputs + type(cosp_optical_inputs),intent(out) :: y + ! Optional input + real(kind=wp),intent(in),target, optional :: & + emis_grey + + ! Dimensions + y%Npoints = Npoints + y%Ncolumns = Ncolumns + y%Nlevels = Nlevels + y%Ninst_rttov = Ninst_rttov + y%Npart = 4 + y%Nrefl = PARASOL_NREFL + allocate(y%frac_out(npoints, ncolumns,nlevels)) + + if (present(emis_grey)) y%emis_grey => emis_grey + + if (Lmodis .or. Lmisr .or. Lisccp) then + allocate(y%tau_067(npoints, ncolumns,nlevels),& + y%emiss_11(npoints, ncolumns,nlevels)) + endif + if (Lcalipso) then + allocate(y%betatot_calipso(npoints, ncolumns,nlevels),& + y%betatot_ice_calipso(npoints, ncolumns,nlevels),& + y%betatot_liq_calipso(npoints, ncolumns,nlevels),& + y%tautot_calipso(npoints, ncolumns,nlevels),& + y%tautot_ice_calipso(npoints, ncolumns,nlevels),& + y%tautot_liq_calipso(npoints, ncolumns,nlevels),& + y%beta_mol_calipso(npoints, nlevels),& + y%tau_mol_calipso(npoints, nlevels),& + y%tautot_S_ice(npoints, ncolumns ),& + y%tautot_S_liq(npoints, ncolumns )) + endif + + if (LgrLidar532) then + allocate(y%beta_mol_grLidar532(npoints, nlevels),& + y%betatot_grLidar532(npoints, ncolumns,nlevels),& + y%tau_mol_grLidar532(npoints, nlevels),& + y%tautot_grLidar532(npoints, ncolumns,nlevels)) + endif + + if (Latlid) then + allocate(y%beta_mol_atlid(npoints, nlevels),& + y%betatot_atlid(npoints, ncolumns,nlevels),& + y%tau_mol_atlid(npoints, nlevels),& + y%tautot_atlid(npoints, ncolumns,nlevels)) + endif + + if (Lcloudsat) then + allocate(y%z_vol_cloudsat(npoints, ncolumns,nlevels),& + y%kr_vol_cloudsat(npoints, ncolumns,nlevels),& + y%g_vol_cloudsat(npoints, ncolumns,nlevels),& + y%fracPrecipIce(npoints, ncolumns)) + + ! added by DPLRW + allocate(y%vfall(npoints, ncolumns, nlevels, N_HYDRO), & + y%vfsqu(npoints, ncolumns, nlevels, N_HYDRO), & + y%zehyd(npoints, ncolumns, nlevels, N_HYDRO), & + y%krhyd(npoints, ncolumns, nlevels, N_HYDRO) ) + allocate(y%vtrm3(npoints, ncolumns, nlevels, N_HYDRO), & + y%vtrm0(npoints, ncolumns, nlevels, N_HYDRO), & + y%mmnt3(npoints, ncolumns, nlevels, N_HYDRO), & + y%mmnt0(npoints, ncolumns, nlevels, N_HYDRO) ) + + endif + if (Lmodis) then + allocate(y%fracLiq(npoints, ncolumns,nlevels),& + y%asym(npoints, ncolumns,nlevels),& + y%ss_alb(npoints, ncolumns,nlevels)) + endif + + end subroutine construct_cospIN + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE construct_cospstateIN + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + subroutine construct_cospstateIN(npoints,nlevels,y) + ! Inputs + integer,intent(in) :: & + npoints, & ! Number of horizontal gridpoints + nlevels ! Number of vertical levels + + ! Outputs + type(cosp_column_inputs),intent(out) :: y + + allocate(y%sunlit(npoints),y%skt(npoints),y%land(npoints),y%at(npoints,nlevels), & + y%psfc(npoints), & + y%pfull(npoints,nlevels),y%phalf(npoints,nlevels+1),y%qv(npoints,nlevels), & + y%o3(npoints,nlevels),y%hgt_matrix(npoints,nlevels),y%u_sfc(npoints), & + y%v_sfc(npoints),y%lat(npoints),y%lon(nPoints),y%rttov_sfcmask(nPoints), & + y%co(npoints,nlevels),y%n2o(npoints,nlevels),y%ch4(npoints,nlevels), & + y%co2(npoints,nlevels), y%so2(npoints,nlevels), & + y%cloudIce(nPoints,nLevels),y%cloudLiq(nPoints,nLevels),y%surfelev(nPoints),& + y%DeffLiq(nPoints,nLevels),y%DeffIce(nPoints,nLevels), & + y%fl_snow(nPoints,nLevels),y%fl_rain(nPoints,nLevels), & + y%tca(nPoints,nLevels),y%hgt_matrix_half(nPoints,nlevels), & + y%rttov_date(nPoints,3),y%rttov_time(nPoints,3),y%sza(nPoints)) + + ! added by DPLRW + allocate(y%gwvel(npoints,nlevels),y%gcumf(npoints,nlevels)) + + end subroutine construct_cospstateIN + + ! ###################################################################################### + ! SUBROUTINE construct_cosp_outputs + ! + ! This subroutine allocates output fields based on input logical flag switches. + ! ###################################################################################### + subroutine construct_cosp_outputs(Lpctisccp,Lclisccp,& + Lboxptopisccp,Lboxtauisccp,Ltauisccp,Lcltisccp, & + Lmeantbisccp,Lmeantbclrisccp,Lalbisccp,LclMISR, & + Lcltmodis,Lclwmodis,Lclimodis,Lclhmodis,Lclmmodis, & + Lcllmodis,Ltautmodis,Ltauwmodis,Ltauimodis, & + Ltautlogmodis,Ltauwlogmodis,Ltauilogmodis, & + Lreffclwmodis,Lreffclimodis,Lpctmodis,Llwpmodis, & + Liwpmodis,Lclmodis,Latb532,Latb532gr,Latb355, & + LlidarBetaMol532,LlidarBetaMol532gr,LlidarBetaMol355,& + LcfadLidarsr532,LcfadLidarsr532gr,LcfadLidarsr355, & + Lclcalipso2,Lclcalipso,LclgrLidar532,Lclatlid, & + Lclhcalipso,Lcllcalipso,Lclmcalipso,Lcltcalipso, & + LclhgrLidar532,LcllgrLidar532,LclmgrLidar532, & + LcltgrLidar532,Lclhatlid,Lcllatlid,Lclmatlid, & + Lcltatlid,Lcltlidarradar,Lcloudsat_tcc, & + Lcloudsat_tcc2,Lclcalipsoliq, & + Lclcalipsoice,Lclcalipsoun,Lclcalipsotmp, & + Lclcalipsotmpliq,Lclcalipsotmpice,Lclcalipsotmpun, & + Lcltcalipsoliq,Lcltcalipsoice,Lcltcalipsoun, & + Lclhcalipsoliq,Lclhcalipsoice,Lclhcalipsoun, & + Lclmcalipsoliq,Lclmcalipsoice,Lclmcalipsoun, & + Lcllcalipsoliq,Lcllcalipsoice,Lcllcalipsoun, & + Lclopaquecalipso,Lclthincalipso,Lclzopaquecalipso, & + Lclcalipsoopaque,Lclcalipsothin,Lclcalipsozopaque, & + Lclcalipsoopacity,Lclopaquetemp,Lclthintemp, & + Lclzopaquetemp,Lclopaquemeanz,Lclthinmeanz, & + Lclthinemis,Lclopaquemeanzse,Lclthinmeanzse, & + Lclzopaquecalipsose,LcfadDbze94,Ldbze94,Lparasolrefl,& + Lptradarflag0,Lptradarflag1,Lptradarflag2, & + Lptradarflag3,Lptradarflag4,Lptradarflag5, & + Lptradarflag6,Lptradarflag7,Lptradarflag8, & + Lptradarflag9,Lradarpia,Lwr_occfreq,Lcfodd, & + Ninst_rttov,rttov_configs, Ldplrw, & + Npoints,Ncolumns,Nlevels,Nlvgrid,use_vgrid,x) + ! Inputs + logical,intent(in) :: & + Lpctisccp, & ! ISCCP mean cloud top pressure + Lclisccp, & ! ISCCP cloud area fraction + Lboxptopisccp, & ! ISCCP CTP in each column + Lboxtauisccp, & ! ISCCP optical epth in each column + Ltauisccp, & ! ISCCP mean optical depth + Lcltisccp, & ! ISCCP total cloud fraction + Lmeantbisccp, & ! ISCCP mean all-sky 10.5micron brightness temperature + Lmeantbclrisccp, & ! ISCCP mean clear-sky 10.5micron brightness temperature + Lalbisccp, & ! ISCCP mean cloud albedo + LclMISR, & ! MISR cloud fraction + Lcltmodis, & ! MODIS total cloud fraction + Lclwmodis, & ! MODIS liquid cloud fraction + Lclimodis, & ! MODIS ice cloud fraction + Lclhmodis, & ! MODIS high-level cloud fraction + Lclmmodis, & ! MODIS mid-level cloud fraction + Lcllmodis, & ! MODIS low-level cloud fraction + Ltautmodis, & ! MODIS total cloud optical thicknes + Ltauwmodis, & ! MODIS liquid optical thickness + Ltauimodis, & ! MODIS ice optical thickness + Ltautlogmodis, & ! MODIS total cloud optical thickness (log10 mean) + Ltauwlogmodis, & ! MODIS liquid optical thickness (log10 mean) + Ltauilogmodis, & ! MODIS ice optical thickness (log10 mean) + Lreffclwmodis, & ! MODIS liquid cloud particle size + Lreffclimodis, & ! MODIS ice particle size + Lpctmodis, & ! MODIS cloud top pressure + Llwpmodis, & ! MODIS cloud liquid water path + Liwpmodis, & ! MODIS cloud ice water path + Lclmodis, & ! MODIS cloud area fraction + Latb532, & ! CALIPSO attenuated total backscatter (532nm) + Latb532gr, & ! GROUND LIDAR @ 532NM attenuated total backscatter (532nm) + Latb355, & ! ATLID attenuated total backscatter (355nm) + LlidarBetaMol532, & ! CALIPSO molecular backscatter (532nm) + LlidarBetaMol532gr,&! GROUND LIDAR @ 532NM molecular backscatter (532nm) + LlidarBetaMol355, & ! ATLID molecular backscatter (355nm) + LcfadLidarsr532, & ! CALIPSO scattering ratio CFAD + LcfadLidarsr532gr,& ! GROUND LIDAR @ 532NM scattering ratio CFAD + LcfadLidarsr355, & ! ATLID scattering ratio CFAD + Lclcalipso2, & ! CALIPSO cloud fraction undetected by cloudsat + Lclcalipso, & ! CALIPSO cloud area fraction + LclgrLidar532, & ! GROUND LIDAR @ 532NM cloud area fraction + Lclatlid, & ! ATLID cloud area fraction + Lclhcalipso, & ! CALIPSO high-level cloud fraction + Lcllcalipso, & ! CALIPSO low-level cloud fraction + Lclmcalipso, & ! CALIPSO mid-level cloud fraction + Lcltcalipso, & ! CALIPSO total cloud fraction + LclhgrLidar532, & ! GROUND LIDAR @ 532NM high-level cloud fraction + LcllgrLidar532, & ! GROUND LIDAR @ 532NM low-level cloud fraction + LclmgrLidar532, & ! GROUND LIDAR @ 532NM mid-level cloud fraction + LcltgrLidar532, & ! GROUND LIDAR @ 532NM total cloud fraction + Lclhatlid, & ! ATLID high-level cloud fraction + Lcllatlid, & ! ATLID low-level cloud fraction + Lclmatlid, & ! ATLID mid-level cloud fraction + Lcltatlid, & ! ATLID total cloud fraction + Lcltlidarradar, & ! CALIPSO-CLOUDSAT total cloud fraction + Lcloudsat_tcc, & ! + Lcloudsat_tcc2, & ! + Lclcalipsoliq, & ! CALIPSO liquid cloud area fraction + Lclcalipsoice, & ! CALIPSO ice cloud area fraction + Lclcalipsoun, & ! CALIPSO undetected cloud area fraction + Lclcalipsotmp, & ! CALIPSO undetected cloud area fraction + Lclcalipsotmpliq, & ! CALIPSO liquid cloud area fraction + Lclcalipsotmpice, & ! CALIPSO ice cloud area fraction + Lclcalipsotmpun, & ! CALIPSO undetected cloud area fraction + Lcltcalipsoliq, & ! CALIPSO liquid total cloud fraction + Lcltcalipsoice, & ! CALIPSO ice total cloud fraction + Lcltcalipsoun, & ! CALIPSO undetected total cloud fraction + Lclhcalipsoliq, & ! CALIPSO high-level liquid cloud fraction + Lclhcalipsoice, & ! CALIPSO high-level ice cloud fraction + Lclhcalipsoun, & ! CALIPSO high-level undetected cloud fraction + Lclmcalipsoliq, & ! CALIPSO mid-level liquid cloud fraction + Lclmcalipsoice, & ! CALIPSO mid-level ice cloud fraction + Lclmcalipsoun, & ! CALIPSO mid-level undetected cloud fraction + Lcllcalipsoliq, & ! CALIPSO low-level liquid cloud fraction + Lcllcalipsoice, & ! CALIPSO low-level ice cloud fraction + Lcllcalipsoun, & ! CALIPSO low-level undetected cloud fraction + Lclopaquecalipso, & ! CALIPSO opaque cloud cover (2D Map) + Lclthincalipso, & ! CALIPSO thin cloud cover (2D Map) + Lclzopaquecalipso,& ! CALIPSO z_opaque altitude (opaque clouds only, 2D Map) + Lclcalipsoopaque, & ! CALIPSO opaque cloud profiles 3D fraction + Lclcalipsothin, & ! CALIPSO thin cloud profiles 3D fraction + Lclcalipsozopaque,& ! CALIPSO z_opaque 3D fraction + Lclcalipsoopacity,& ! CALIPSO opacity 3D fraction + Lclopaquetemp, & ! CALIPSO opaque cloud temperature + Lclthintemp, & ! CALIPSO thin cloud temperature + Lclzopaquetemp, & ! CALIPSO z_opaque temperature + Lclopaquemeanz, & ! CALIPSO opaque cloud altitude + Lclthinmeanz, & ! CALIPSO thin cloud altitude + Lclthinemis, & ! CALIPSO thin cloud emissivity + Lclopaquemeanzse, & ! CALIPSO opaque cloud altitude with respect to SE + Lclthinmeanzse, & ! CALIPSO thin cloud altitude with respect to SE + Lclzopaquecalipsose,& ! CALIPSO z_opaque altitude with respect to SE + LcfadDbze94, & ! CLOUDSAT radar reflectivity CFAD + Ldbze94, & ! CLOUDSAT radar reflectivity + LparasolRefl, & ! PARASOL reflectance + Lptradarflag0, & ! CLOUDSAT + Lptradarflag1, & ! CLOUDSAT + Lptradarflag2, & ! CLOUDSAT + Lptradarflag3, & ! CLOUDSAT + Lptradarflag4, & ! CLOUDSAT + Lptradarflag5, & ! CLOUDSAT + Lptradarflag6, & ! CLOUDSAT + Lptradarflag7, & ! CLOUDSAT + Lptradarflag8, & ! CLOUDSAT + Lptradarflag9, & ! CLOUDSAT + Lradarpia, & ! CLOUDSAT + Lwr_occfreq, & ! CloudSat+MODIS joint diagnostics + Lcfodd, & ! CloudSat+MODIS joint diagnostics + Ldplrw, & ! Doppler capability of radar (CloudSat) + use_vgrid + + integer,intent(in) :: & + Npoints, & ! Number of sampled points + Ncolumns, & ! Number of subgrid columns + Nlevels, & ! Number of model levels + Nlvgrid, & ! Number of levels in L3 stats computation + Ninst_rttov + + type(rttov_cfg), dimension(:),intent(in) :: & + rttov_configs + + ! Outputs + type(cosp_outputs),intent(out) :: & + x ! COSP output structure + + integer :: & + i + + ! ISCCP simulator outputs + if (Lboxtauisccp) allocate(x%isccp_boxtau(Npoints,Ncolumns)) + if (Lboxptopisccp) allocate(x%isccp_boxptop(Npoints,Ncolumns)) + if (Lclisccp) allocate(x%isccp_fq(Npoints,numISCCPTauBins,numISCCPPresBins)) + if (Lcltisccp) allocate(x%isccp_totalcldarea(Npoints)) + if (Lpctisccp) allocate(x%isccp_meanptop(Npoints)) + if (Ltauisccp) allocate(x%isccp_meantaucld(Npoints)) + if (Lmeantbisccp) allocate(x%isccp_meantb(Npoints)) + if (Lmeantbclrisccp) allocate(x%isccp_meantbclr(Npoints)) + if (Lalbisccp) allocate(x%isccp_meanalbedocld(Npoints)) + + ! MISR simulator + if (LclMISR) then + allocate(x%misr_fq(Npoints,numMISRTauBins,numMISRHgtBins)) + ! *NOTE* These 3 fields are not output, but were part of the v1.4.0 cosp_misr, so + ! they are still computed. Should probably have a logical to control these + ! outputs. + allocate(x%misr_dist_model_layertops(Npoints,numMISRHgtBins)) + allocate(x%misr_meanztop(Npoints)) + allocate(x%misr_cldarea(Npoints)) + endif + + ! MODIS simulator + if (Lcltmodis) allocate(x%modis_Cloud_Fraction_Total_Mean(Npoints)) + if (Lclwmodis) allocate(x%modis_Cloud_Fraction_Water_Mean(Npoints)) + if (Lclimodis) allocate(x%modis_Cloud_Fraction_Ice_Mean(Npoints)) + if (Lclhmodis) allocate(x%modis_Cloud_Fraction_High_Mean(Npoints)) + if (Lclmmodis) allocate(x%modis_Cloud_Fraction_Mid_Mean(Npoints)) + if (Lcllmodis) allocate(x%modis_Cloud_Fraction_Low_Mean(Npoints)) + if (Ltautmodis) allocate(x%modis_Optical_Thickness_Total_Mean(Npoints)) + if (Ltauwmodis) allocate(x%modis_Optical_Thickness_Water_Mean(Npoints)) + if (Ltauimodis) allocate(x%modis_Optical_Thickness_Ice_Mean(Npoints)) + if (Ltautlogmodis) allocate(x%modis_Optical_Thickness_Total_LogMean(Npoints)) + if (Ltauwlogmodis) allocate(x%modis_Optical_Thickness_Water_LogMean(Npoints)) + if (Ltauilogmodis) allocate(x%modis_Optical_Thickness_Ice_LogMean(Npoints)) + if (Lreffclwmodis) allocate(x%modis_Cloud_Particle_Size_Water_Mean(Npoints)) + if (Lreffclimodis) allocate(x%modis_Cloud_Particle_Size_Ice_Mean(Npoints)) + if (Lpctmodis) allocate(x%modis_Cloud_Top_Pressure_Total_Mean(Npoints)) + if (Llwpmodis) allocate(x%modis_Liquid_Water_Path_Mean(Npoints)) + if (Liwpmodis) allocate(x%modis_Ice_Water_Path_Mean(Npoints)) + if (Lclmodis) then + allocate(x%modis_Optical_Thickness_vs_Cloud_Top_Pressure(nPoints,numModisTauBins,numMODISPresBins)) + allocate(x%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(nPoints,numModisTauBins,numMODISPresBins)) + allocate(x%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(nPoints,numModisTauBins,numMODISPresBins)) + allocate(x%modis_Optical_thickness_vs_ReffLIQ(nPoints,numMODISTauBins,numMODISReffLiqBins)) + allocate(x%modis_Optical_Thickness_vs_ReffICE(nPoints,numMODISTauBins,numMODISReffIceBins)) + endif + + ! LIDAR simulator + if (LlidarBetaMol532) allocate(x%calipso_beta_mol(Npoints,Nlevels)) + if (Latb532) allocate(x%calipso_beta_tot(Npoints,Ncolumns,Nlevels)) + if (LcfadLidarsr532) then + allocate(x%calipso_srbval(SR_BINS+1)) + allocate(x%calipso_cfad_sr(Npoints,SR_BINS,Nlvgrid)) + allocate(x%calipso_betaperp_tot(Npoints,Ncolumns,Nlevels)) + endif + if (Lclcalipso) allocate(x%calipso_lidarcld(Npoints,Nlvgrid)) + if (Lclhcalipso .or. Lclmcalipso .or. Lcllcalipso .or. Lcltcalipso) then + allocate(x%calipso_cldlayer(Npoints,LIDAR_NCAT)) + endif + if (Lclcalipsoice .or. Lclcalipsoliq .or. Lclcalipsoun) then + allocate(x%calipso_lidarcldphase(Npoints,Nlvgrid,6)) + endif + if (Lclcalipsotmp .or. Lclcalipsotmpliq .or. Lclcalipsoice .or. Lclcalipsotmpun .or. Lclcalipsotmpice) then + allocate(x%calipso_lidarcldtmp(Npoints,LIDAR_NTEMP,5)) + endif + if (Lcllcalipsoice .or. Lclmcalipsoice .or. Lclhcalipsoice .or. & + Lcltcalipsoice .or. Lcllcalipsoliq .or. Lclmcalipsoliq .or. & + Lclhcalipsoliq .or. Lcltcalipsoliq .or. Lcllcalipsoun .or. & + Lclmcalipsoun .or. Lclhcalipsoun .or. Lcltcalipsoun) then + allocate(x%calipso_cldlayerphase(Npoints,LIDAR_NCAT,6)) + endif + if (Lclopaquecalipso .or. Lclthincalipso .or. Lclzopaquecalipso) then + allocate(x%calipso_cldtype(Npoints,LIDAR_NTYPE)) + endif + if (Lclopaquetemp .or. Lclthintemp .or. Lclzopaquetemp) then + allocate(x%calipso_cldtypetemp(Npoints,LIDAR_NTYPE)) + endif + if (Lclopaquemeanz .or. Lclthinmeanz) then + allocate(x%calipso_cldtypemeanz(Npoints,2)) + endif + if (Lclopaquemeanzse .or. Lclthinmeanzse .or. Lclzopaquecalipsose) then + allocate(x%calipso_cldtypemeanzse(Npoints,3)) + endif + if (Lclthinemis) then + allocate(x%calipso_cldthinemis(Npoints)) + endif + if (Lclcalipsoopaque .or. Lclcalipsothin .or. Lclcalipsozopaque .or. Lclcalipsoopacity) then + allocate(x%calipso_lidarcldtype(Npoints,Nlvgrid,LIDAR_NTYPE+1)) + endif + + ! GROUND LIDAR @ 532NM simulator + if (LlidarBetaMol532gr) allocate(x%grLidar532_beta_mol(Npoints,Nlevels)) + if (Latb532gr) allocate(x%grLidar532_beta_tot(Npoints,Ncolumns,Nlevels)) + if (LcfadLidarsr532gr) then + allocate(x%grLidar532_srbval(SR_BINS+1)) + allocate(x%grLidar532_cfad_sr(Npoints,SR_BINS,Nlvgrid)) + endif + if (LclgrLidar532) allocate(x%grLidar532_lidarcld(Npoints,Nlvgrid)) + if (LclhgrLidar532 .or. LclmgrLidar532 .or. LcllgrLidar532 .or. LcltgrLidar532) then + allocate(x%grLidar532_cldlayer(Npoints,LIDAR_NCAT)) + endif + + ! ATLID simulator + if (LlidarBetaMol355) allocate(x%atlid_beta_mol(Npoints,Nlevels)) + if (Latb355) allocate(x%atlid_beta_tot(Npoints,Ncolumns,Nlevels)) + if (LcfadLidarsr355) then + allocate(x%atlid_srbval(SR_BINS+1)) + allocate(x%atlid_cfad_sr(Npoints,SR_BINS,Nlvgrid)) + endif + if (Lclatlid) allocate(x%atlid_lidarcld(Npoints,Nlvgrid)) + if (Lclhatlid .or. Lclmatlid .or. Lcllatlid .or. Lcltatlid) then + allocate(x%atlid_cldlayer(Npoints,LIDAR_NCAT)) + endif + + ! PARASOL + if (Lparasolrefl) then + allocate(x%parasolPix_refl(Npoints,Ncolumns,PARASOL_NREFL)) + allocate(x%parasolGrid_refl(Npoints,PARASOL_NREFL)) + endif + + ! Cloudsat simulator + if (Ldbze94) allocate(x%cloudsat_Ze_tot(Npoints,Ncolumns,Nlevels)) + if (LcfadDbze94) allocate(x%cloudsat_cfad_ze(Npoints,cloudsat_DBZE_BINS,Nlvgrid)) + if (Lptradarflag0 .or. Lptradarflag1 .or. Lptradarflag2 .or. Lptradarflag3 .or. & + Lptradarflag4 .or. Lptradarflag5 .or. Lptradarflag6 .or. Lptradarflag7 .or. & + Lptradarflag8 .or. Lptradarflag9) then + if (use_vgrid) then + allocate(x%cloudsat_precip_cover(Npoints,cloudsat_DBZE_BINS)) + else + print*,'WARNING: CLOUDSAT Precipitation occurrence diagnostics not available when use_vgrid=FALSE.' + print*,'WARNING: Turning CLOUDSAT Precipitation occurrence diagnostcs OFF' + endif + endif + if (Lradarpia) then + if (use_vgrid) then + allocate(x%cloudsat_pia(Npoints)) + else + print*,'WARNING: CLOUDSAT Precipitation occurrence diagnostics not available when use_vgrid=FALSE.' + print*,'WARNING: Turning CLOUDSAT Precipitation occurrence diagnostcs OFF' + endif + endif + + ! Combined CALIPSO/CLOUDSAT fields + if (Lclcalipso2) allocate(x%lidar_only_freq_cloud(Npoints,Nlvgrid)) + if (Lcltlidarradar) allocate(x%radar_lidar_tcc(Npoints)) + if (Lcloudsat_tcc) allocate(x%cloudsat_tcc(Npoints)) + if (Lcloudsat_tcc2) allocate(x%cloudsat_tcc2(Npoints)) + + ! Joint MODIS/CloudSat Statistics + if (Lwr_occfreq) allocate(x%wr_occfreq_ntotal(Npoints,WR_NREGIME)) + if (Lcfodd) allocate(x%cfodd_ntotal(Npoints,CFODD_NDBZE,CFODD_NICOD,CFODD_NCLASS)) + + ! RTTOV - Allocate output for multiple instruments + ! Do I not need to allocate the number of instruments? Because each rttov output DDT will be a pointer? + if (Lrttov) then + x % Ninst_rttov = Ninst_rttov + allocate(x % rttov_outputs(Ninst_rttov)) ! Need to allocate a pointer? + do i=1,Ninst_rttov + x % rttov_outputs(i) % nchan_out = rttov_configs(i) % nchan_out + if (rttov_configs(i) % Lrttov_pc) then ! Treat PC-RTTOV fields as clear-sky only for now + allocate(x % rttov_outputs(i) % channel_indices(rttov_configs(i) % nchan_out)) + if (rttov_configs(i) % Lrttov_bt) then ! Brightness temp + allocate(x % rttov_outputs(i) % bt_total_pc(Npoints,rttov_configs(i) % nchan_out)) + ! if (Lrttov_cld .or. Lrttov_aer) allocate(x%rttov_bt_clear(Npoints,Nchan)) + end if + if (rttov_configs(i) % Lrttov_rad) then ! Radiance + allocate(x % rttov_outputs(i) % rad_total_pc(Npoints,rttov_configs(i) % nchan_out)) + ! if (Lrttov_cld .or. Lrttov_aer) allocate(x%rttov_rad_clear(Npoints,Nchan)) + ! if (Lrttov_cld .or. Lrttov_aer) allocate(x%rttov_rad_cloudy(Npoints,Nchan)) + end if + else + allocate(x % rttov_outputs(i) % channel_indices(rttov_configs(i) % nchan_out)) + if (rttov_configs(i) % Lrttov_bt) then ! Brightness temp + allocate(x % rttov_outputs(i) % bt_total(Npoints,rttov_configs(i) % nchan_out)) + if ((rttov_configs(i) % Lrttov_cld) .or. (rttov_configs(i) % Lrttov_aer)) then + allocate(x % rttov_outputs(i) % bt_clear(Npoints,rttov_configs(i) % nchan_out)) + end if + end if + if (rttov_configs(i) % Lrttov_rad) then ! Radiance + allocate(x % rttov_outputs(i) % rad_total(Npoints,rttov_configs(i) % nchan_out)) + if ((rttov_configs(i) % Lrttov_cld) .or. (rttov_configs(i) % Lrttov_aer)) then + allocate(x % rttov_outputs(i) % rad_clear(Npoints,rttov_configs(i) % nchan_out)) + end if + if ((rttov_configs(i) % Lrttov_cld) .or. (rttov_configs(i) % Lrttov_aer)) then + allocate(x % rttov_outputs(i) % rad_cloudy(Npoints,rttov_configs(i) % nchan_out)) + end if + end if + if (rttov_configs(i) % Lrttov_refl) then ! Reflectance + allocate(x % rttov_outputs(i) % refl_total(Npoints,rttov_configs(i) % nchan_out)) + if ((rttov_configs(i) % Lrttov_cld) .or. (rttov_configs(i) % Lrttov_aer)) then + allocate(x % rttov_outputs(i) % refl_clear(Npoints,rttov_configs(i) % nchan_out)) + end if + end if + end if + end do + else + x % Ninst_rttov = 0 + end if + + ! Doppler capability of radar (CloudSat) + if (Ldplrw) then + allocate(x%dplrw_Z(Npoints, Nlvdplr, Nlvgrid, 0:2)) + allocate(x%spwid_Z(Npoints, Nlvspwd, Nlvgrid, 0:2)) + allocate(x%Zef94_Z(Npoints, NlvdBZe, Nlvgrid, 0:2)) + + allocate(x%dplrw_T(Npoints, Nlvdplr, Nlvtemp, 0:2)) + allocate(x%spwid_T(Npoints, Nlvspwd, Nlvtemp, 0:2)) + allocate(x%Zef94_T(Npoints, NlvdBZe, Nlvtemp, 0:2)) + + allocate(x%ZefVd_2(Npoints, Nlvdplr, NlvdBZe, 0:2)) + + allocate(x%gcumw(Npoints, Nlevels)) + + allocate(x%vfall_Z(Npoints, Nlvdplr, Nlvgrid, 0:2, 3)) + allocate(x%gridw_Z(Npoints, Nlvdplr, Nlvgrid, 0:2)) + allocate(x%vfall_T(Npoints, Nlvdplr, Nlvtemp, 0:2, 3)) + allocate(x%gridw_T(Npoints, Nlvdplr, Nlvtemp, 0:2)) + + allocate(x%ZefVf_2(Npoints, Nlvdplr, NlvdBZe, 0:2, 3)) + + end if + + end subroutine construct_cosp_outputs + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE destroy_cospIN + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + subroutine destroy_cospIN(y) + type(cosp_optical_inputs),intent(inout) :: y + + if (allocated(y%tau_067)) deallocate(y%tau_067) + if (allocated(y%emiss_11)) deallocate(y%emiss_11) + if (allocated(y%frac_out)) deallocate(y%frac_out) + if (allocated(y%beta_mol_calipso)) deallocate(y%beta_mol_calipso) + if (allocated(y%tau_mol_calipso)) deallocate(y%tau_mol_calipso) + if (allocated(y%betatot_calipso)) deallocate(y%betatot_calipso) + if (allocated(y%betatot_ice_calipso)) deallocate(y%betatot_ice_calipso) + if (allocated(y%betatot_liq_calipso)) deallocate(y%betatot_liq_calipso) + if (allocated(y%tautot_calipso)) deallocate(y%tautot_calipso) + if (allocated(y%tautot_ice_calipso)) deallocate(y%tautot_ice_calipso) + if (allocated(y%tautot_liq_calipso)) deallocate(y%tautot_liq_calipso) + if (allocated(y%tautot_S_liq)) deallocate(y%tautot_S_liq) + if (allocated(y%tautot_S_ice)) deallocate(y%tautot_S_ice) + if (allocated(y%z_vol_cloudsat)) deallocate(y%z_vol_cloudsat) + if (allocated(y%kr_vol_cloudsat)) deallocate(y%kr_vol_cloudsat) + if (allocated(y%g_vol_cloudsat)) deallocate(y%g_vol_cloudsat) + if (allocated(y%asym)) deallocate(y%asym) + if (allocated(y%ss_alb)) deallocate(y%ss_alb) + if (allocated(y%fracLiq)) deallocate(y%fracLiq) + if (allocated(y%beta_mol_grLidar532)) deallocate(y%beta_mol_grLidar532) + if (allocated(y%betatot_grLidar532)) deallocate(y%betatot_grLidar532) + if (allocated(y%tau_mol_grLidar532)) deallocate(y%tau_mol_grLidar532) + if (allocated(y%tautot_grLidar532)) deallocate(y%tautot_grLidar532) + if (allocated(y%beta_mol_atlid)) deallocate(y%beta_mol_atlid) + if (allocated(y%betatot_atlid)) deallocate(y%betatot_atlid) + if (allocated(y%tau_mol_atlid)) deallocate(y%tau_mol_atlid) + if (allocated(y%tautot_atlid)) deallocate(y%tautot_atlid) + if (allocated(y%fracPrecipIce)) deallocate(y%fracPrecipIce) + + !if (allocated(y%rcfg_cloudsat%N_scale_flag)) deallocate(y%rcfg_cloudsat%N_scale_flag) + !if (allocated(y%rcfg_cloudsat%Z_scale_flag)) deallocate(y%rcfg_cloudsat%Z_scale_flag) + !if (allocated(y%rcfg_cloudsat%Z_scale_added_flag)) deallocate(y%rcfg_cloudsat%Z_scale_added_flag) + !if (allocated(y%rcfg_cloudsat%Ze_scaled)) deallocate(y%rcfg_cloudsat%Ze_scaled) + !if (allocated(y%rcfg_cloudsat%Zr_scaled)) deallocate(y%rcfg_cloudsat%Zr_scaled) + !if (allocated(y%rcfg_cloudsat%kr_scaled)) deallocate(y%rcfg_cloudsat%kr_scaled) + !if (allocated(y%rcfg_cloudsat%fc)) deallocate(y%rcfg_cloudsat%fc) + !if (allocated(y%rcfg_cloudsat%rho_eff)) deallocate(y%rcfg_cloudsat%rho_eff) + !if (allocated(y%rcfg_cloudsat%base_list)) deallocate(y%rcfg_cloudsat%base_list) + !if (allocated(y%rcfg_cloudsat%step_list)) deallocate(y%rcfg_cloudsat%step_list) + if (allocated(y%vfall)) deallocate(y%vfall) + if (allocated(y%vfsqu)) deallocate(y%vfsqu) + if (allocated(y%zehyd)) deallocate(y%zehyd) + if (allocated(y%krhyd)) deallocate(y%krhyd) + if (allocated(y%vtrm3)) deallocate(y%vtrm3) + if (allocated(y%vtrm0)) deallocate(y%vtrm0) + if (allocated(y%mmnt3)) deallocate(y%mmnt3) + if (allocated(y%mmnt0)) deallocate(y%mmnt0) + + if (associated(y%cfg_rttov)) nullify(y%cfg_rttov) + + end subroutine destroy_cospIN + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE destroy_cospstateIN + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + subroutine destroy_cospstateIN(y) + type(cosp_column_inputs),intent(inout) :: y + + if (allocated(y%sunlit)) deallocate(y%sunlit) + if (allocated(y%skt)) deallocate(y%skt) + if (allocated(y%psfc)) deallocate(y%psfc) + if (allocated(y%land)) deallocate(y%land) + if (allocated(y%rttov_sfcmask)) deallocate(y%rttov_sfcmask) + if (allocated(y%at)) deallocate(y%at) + if (allocated(y%pfull)) deallocate(y%pfull) + if (allocated(y%phalf)) deallocate(y%phalf) + if (allocated(y%qv)) deallocate(y%qv) + if (allocated(y%hgt_matrix)) deallocate(y%hgt_matrix) + if (allocated(y%hgt_matrix_half)) deallocate(y%hgt_matrix_half) + if (allocated(y%surfelev)) deallocate(y%surfelev) + if (allocated(y%rttov_date)) deallocate(y%rttov_date) + if (allocated(y%rttov_time)) deallocate(y%rttov_time) + if (allocated(y%sza)) deallocate(y%sza) + if (allocated(y%co2)) deallocate(y%co2) + if (allocated(y%ch4)) deallocate(y%ch4) + if (allocated(y%n2o)) deallocate(y%n2o) + if (allocated(y%co)) deallocate(y%co) + if (allocated(y%o3)) deallocate(y%o3) + if (allocated(y%u_sfc)) deallocate(y%u_sfc) + if (allocated(y%v_sfc)) deallocate(y%v_sfc) + if (allocated(y%lat)) deallocate(y%lat) + if (allocated(y%lon)) deallocate(y%lon) + ! if (allocated(y%emis_in)) deallocate(y%emis_in) + ! if (allocated(y%refl_in)) deallocate(y%refl_in) + if (allocated(y%cloudIce)) deallocate(y%cloudIce) + if (allocated(y%cloudLiq)) deallocate(y%cloudLiq) + if (allocated(y%DeffLiq)) deallocate(y%DeffLiq) + if (allocated(y%DeffIce)) deallocate(y%DeffIce) + if (allocated(y%fl_rain)) deallocate(y%fl_rain) + if (allocated(y%fl_snow)) deallocate(y%fl_snow) + if (allocated(y%tca)) deallocate(y%tca) + + if (allocated(y%gwvel)) deallocate(y%gwvel) + if (allocated(y%gcumf)) deallocate(y%gcumf) + + end subroutine destroy_cospstateIN + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE destroy_cosp_outputs + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + subroutine destroy_cosp_outputs(y) + type(cosp_outputs),intent(inout) :: y + integer :: i ! Local iterator for RTTOV instruments + + ! Deallocate and nullify + if (associated(y%calipso_beta_mol)) then + deallocate(y%calipso_beta_mol) + nullify(y%calipso_beta_mol) + endif + if (associated(y%calipso_betaperp_tot)) then + deallocate(y%calipso_betaperp_tot) + nullify(y%calipso_betaperp_tot) + endif + if (associated(y%calipso_beta_tot)) then + deallocate(y%calipso_beta_tot) + nullify(y%calipso_beta_tot) + endif + if (associated(y%calipso_lidarcldphase)) then + deallocate(y%calipso_lidarcldphase) + nullify(y%calipso_lidarcldphase) + endif + if (associated(y%calipso_lidarcldtype)) then + deallocate(y%calipso_lidarcldtype) + nullify(y%calipso_lidarcldtype) + endif + if (associated(y%calipso_cldlayerphase)) then + deallocate(y%calipso_cldlayerphase) + nullify(y%calipso_cldlayerphase) + endif + if (associated(y%calipso_lidarcldtmp)) then + deallocate(y%calipso_lidarcldtmp) + nullify(y%calipso_lidarcldtmp) + endif + if (associated(y%calipso_cldlayer)) then + deallocate(y%calipso_cldlayer) + nullify(y%calipso_cldlayer) + endif + if (associated(y%calipso_cldtype)) then + deallocate(y%calipso_cldtype) + nullify(y%calipso_cldtype) + endif + if (associated(y%calipso_cldtypetemp)) then + deallocate(y%calipso_cldtypetemp) + nullify(y%calipso_cldtypetemp) + endif + if (associated(y%calipso_cldtypemeanz)) then + deallocate(y%calipso_cldtypemeanz) + nullify(y%calipso_cldtypemeanz) + endif + if (associated(y%calipso_cldtypemeanzse)) then + deallocate(y%calipso_cldtypemeanzse) + nullify(y%calipso_cldtypemeanzse) + endif + if (associated(y%calipso_cldthinemis)) then + deallocate(y%calipso_cldthinemis) + nullify(y%calipso_cldthinemis) + endif + if (associated(y%calipso_lidarcld)) then + deallocate(y%calipso_lidarcld) + nullify(y%calipso_lidarcld) + endif + if (associated(y%calipso_srbval)) then + deallocate(y%calipso_srbval) + nullify(y%calipso_srbval) + endif + if (associated(y%calipso_cfad_sr)) then + deallocate(y%calipso_cfad_sr) + nullify(y%calipso_cfad_sr) + endif + if (associated(y%grLidar532_beta_mol)) then + deallocate(y%grLidar532_beta_mol) + nullify(y%grLidar532_beta_mol) + endif + if (associated(y%grLidar532_beta_tot)) then + deallocate(y%grLidar532_beta_tot) + nullify(y%grLidar532_beta_tot) + endif + if (associated(y%grLidar532_cldlayer)) then + deallocate(y%grLidar532_cldlayer) + nullify(y%grLidar532_cldlayer) + endif + if (associated(y%grLidar532_lidarcld)) then + deallocate(y%grLidar532_lidarcld) + nullify(y%grLidar532_lidarcld) + endif + if (associated(y%grLidar532_cfad_sr)) then + deallocate(y%grLidar532_cfad_sr) + nullify(y%grLidar532_cfad_sr) + endif + if (associated(y%grLidar532_srbval)) then + deallocate(y%grLidar532_srbval) + nullify(y%grLidar532_srbval) + endif + if (associated(y%atlid_beta_mol)) then + deallocate(y%atlid_beta_mol) + nullify(y%atlid_beta_mol) + endif + if (associated(y%atlid_beta_tot)) then + deallocate(y%atlid_beta_tot) + nullify(y%atlid_beta_tot) + endif + if (associated(y%atlid_cldlayer)) then + deallocate(y%atlid_cldlayer) + nullify(y%atlid_cldlayer) + endif + if (associated(y%atlid_lidarcld)) then + deallocate(y%atlid_lidarcld) + nullify(y%atlid_lidarcld) + endif + if (associated(y%atlid_cfad_sr)) then + deallocate(y%atlid_cfad_sr) + nullify(y%atlid_cfad_sr) + endif + if (associated(y%atlid_srbval)) then + deallocate(y%atlid_srbval) + nullify(y%atlid_srbval) + endif + if (associated(y%parasolPix_refl)) then + deallocate(y%parasolPix_refl) + nullify(y%parasolPix_refl) + endif + if (associated(y%parasolGrid_refl)) then + deallocate(y%parasolGrid_refl) + nullify(y%parasolGrid_refl) + endif + if (associated(y%cloudsat_Ze_tot)) then + deallocate(y%cloudsat_Ze_tot) + nullify(y%cloudsat_Ze_tot) + endif + if (associated(y%cloudsat_cfad_ze)) then + deallocate(y%cloudsat_cfad_ze) + nullify(y%cloudsat_cfad_ze) + endif + if (associated(y%cloudsat_precip_cover)) then + deallocate(y%cloudsat_precip_cover) + nullify(y%cloudsat_precip_cover) + endif + if (associated(y%cloudsat_pia)) then + deallocate(y%cloudsat_pia) + nullify(y%cloudsat_pia) + endif + if (associated(y%cloudsat_tcc)) then + deallocate(y%cloudsat_tcc) + nullify(y%cloudsat_tcc) + endif + if (associated(y%cloudsat_tcc2)) then + deallocate(y%cloudsat_tcc2) + nullify(y%cloudsat_tcc2) + endif + if (associated(y%radar_lidar_tcc)) then + deallocate(y%radar_lidar_tcc) + nullify(y%radar_lidar_tcc) + endif + if (associated(y%cloudsat_tcc)) then + deallocate(y%cloudsat_tcc) + nullify(y%cloudsat_tcc) + endif + if (associated(y%cloudsat_tcc2)) then + deallocate(y%cloudsat_tcc2) + nullify(y%cloudsat_tcc2) + endif + if (associated(y%lidar_only_freq_cloud)) then + deallocate(y%lidar_only_freq_cloud) + nullify(y%lidar_only_freq_cloud) + endif + if (associated(y%isccp_totalcldarea)) then + deallocate(y%isccp_totalcldarea) + nullify(y%isccp_totalcldarea) + endif + if (associated(y%isccp_meantb)) then + deallocate(y%isccp_meantb) + nullify(y%isccp_meantb) + endif + if (associated(y%isccp_meantbclr)) then + deallocate(y%isccp_meantbclr) + nullify(y%isccp_meantbclr) + endif + if (associated(y%isccp_meanptop)) then + deallocate(y%isccp_meanptop) + nullify(y%isccp_meanptop) + endif + if (associated(y%isccp_meantaucld)) then + deallocate(y%isccp_meantaucld) + nullify(y%isccp_meantaucld) + endif + if (associated(y%isccp_meanalbedocld)) then + deallocate(y%isccp_meanalbedocld) + nullify(y%isccp_meanalbedocld) + endif + if (associated(y%isccp_boxtau)) then + deallocate(y%isccp_boxtau) + nullify(y%isccp_boxtau) + endif + if (associated(y%isccp_boxptop)) then + deallocate(y%isccp_boxptop) + nullify(y%isccp_boxptop) + endif + if (associated(y%isccp_fq)) then + deallocate(y%isccp_fq) + nullify(y%isccp_fq) + endif + if (associated(y%misr_fq)) then + deallocate(y%misr_fq) + nullify(y%misr_fq) + endif + if (associated(y%misr_dist_model_layertops)) then + deallocate(y%misr_dist_model_layertops) + nullify(y%misr_dist_model_layertops) + endif + if (associated(y%misr_meanztop)) then + deallocate(y%misr_meanztop) + nullify(y%misr_meanztop) + endif + if (associated(y%misr_cldarea)) then + deallocate(y%misr_cldarea) + nullify(y%misr_cldarea) + endif + if (associated(y%modis_Cloud_Fraction_Total_Mean)) then + deallocate(y%modis_Cloud_Fraction_Total_Mean) + nullify(y%modis_Cloud_Fraction_Total_Mean) + endif + if (associated(y%modis_Cloud_Fraction_Ice_Mean)) then + deallocate(y%modis_Cloud_Fraction_Ice_Mean) + nullify(y%modis_Cloud_Fraction_Ice_Mean) + endif + if (associated(y%modis_Cloud_Fraction_Water_Mean)) then + deallocate(y%modis_Cloud_Fraction_Water_Mean) + nullify(y%modis_Cloud_Fraction_Water_Mean) + endif + if (associated(y%modis_Cloud_Fraction_High_Mean)) then + deallocate(y%modis_Cloud_Fraction_High_Mean) + nullify(y%modis_Cloud_Fraction_High_Mean) + endif + if (associated(y%modis_Cloud_Fraction_Mid_Mean)) then + deallocate(y%modis_Cloud_Fraction_Mid_Mean) + nullify(y%modis_Cloud_Fraction_Mid_Mean) + endif + if (associated(y%modis_Cloud_Fraction_Low_Mean)) then + deallocate(y%modis_Cloud_Fraction_Low_Mean) + nullify(y%modis_Cloud_Fraction_Low_Mean) + endif + if (associated(y%modis_Optical_Thickness_Total_Mean)) then + deallocate(y%modis_Optical_Thickness_Total_Mean) + nullify(y%modis_Optical_Thickness_Total_Mean) + endif + if (associated(y%modis_Optical_Thickness_Water_Mean)) then + deallocate(y%modis_Optical_Thickness_Water_Mean) + nullify(y%modis_Optical_Thickness_Water_Mean) + endif + if (associated(y%modis_Optical_Thickness_Ice_Mean)) then + deallocate(y%modis_Optical_Thickness_Ice_Mean) + nullify(y%modis_Optical_Thickness_Ice_Mean) + endif + if (associated(y%modis_Optical_Thickness_Total_LogMean)) then + deallocate(y%modis_Optical_Thickness_Total_LogMean) + nullify(y%modis_Optical_Thickness_Total_LogMean) + endif + if (associated(y%modis_Optical_Thickness_Water_LogMean)) then + deallocate(y%modis_Optical_Thickness_Water_LogMean) + nullify(y%modis_Optical_Thickness_Water_LogMean) + endif + if (associated(y%modis_Optical_Thickness_Ice_LogMean)) then + deallocate(y%modis_Optical_Thickness_Ice_LogMean) + nullify(y%modis_Optical_Thickness_Ice_LogMean) + endif + if (associated(y%modis_Cloud_Particle_Size_Water_Mean)) then + deallocate(y%modis_Cloud_Particle_Size_Water_Mean) + nullify(y%modis_Cloud_Particle_Size_Water_Mean) + endif + if (associated(y%modis_Cloud_Particle_Size_Ice_Mean)) then + deallocate(y%modis_Cloud_Particle_Size_Ice_Mean) + nullify(y%modis_Cloud_Particle_Size_Ice_Mean) + endif + if (associated(y%modis_Cloud_Top_Pressure_Total_Mean)) then + deallocate(y%modis_Cloud_Top_Pressure_Total_Mean) + nullify(y%modis_Cloud_Top_Pressure_Total_Mean) + endif + if (associated(y%modis_Liquid_Water_Path_Mean)) then + deallocate(y%modis_Liquid_Water_Path_Mean) + nullify(y%modis_Liquid_Water_Path_Mean) + endif + if (associated(y%modis_Ice_Water_Path_Mean)) then + deallocate(y%modis_Ice_Water_Path_Mean) + nullify(y%modis_Ice_Water_Path_Mean) + endif + if (associated(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) then + deallocate(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure) + nullify(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure) + endif + if (associated(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) then + deallocate(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq) + nullify(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq) + endif + if (associated(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) then + deallocate(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice) + nullify(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice) + endif + if (associated(y%modis_Optical_thickness_vs_ReffLIQ)) then + deallocate(y%modis_Optical_thickness_vs_ReffLIQ) + nullify(y%modis_Optical_thickness_vs_ReffLIQ) + endif + if (associated(y%modis_Optical_thickness_vs_ReffICE)) then + deallocate(y%modis_Optical_thickness_vs_ReffICE) + nullify(y%modis_Optical_thickness_vs_ReffICE) + endif + if (associated(y%cfodd_ntotal)) then + deallocate(y%cfodd_ntotal) + nullify(y%cfodd_ntotal) + endif + if (associated(y%wr_occfreq_ntotal)) then + deallocate(y%wr_occfreq_ntotal) + nullify(y%wr_occfreq_ntotal) + endif + + ! added by DPLRW + if (associated(y%dplrw_Z)) then + deallocate(y%dplrw_Z) ; nullify(y%dplrw_Z) + end if + if (associated(y%spwid_Z)) then + deallocate(y%spwid_Z) ; nullify(y%spwid_Z) + end if + if (associated(y%Zef94_Z)) then + deallocate(y%Zef94_Z) ; nullify(y%Zef94_Z) + end if + + if (associated(y%dplrw_T)) then + deallocate(y%dplrw_T) ; nullify(y%dplrw_T) + end if + if (associated(y%spwid_T)) then + deallocate(y%spwid_T) ; nullify(y%spwid_T) + end if + if (associated(y%Zef94_T)) then + deallocate(y%Zef94_T) ; nullify(y%Zef94_T) + end if + + if (associated(y%ZefVd_2)) then + deallocate(y%ZefVd_2) ; nullify(y%ZefVd_2) + end if + + if (associated(y%gcumw)) then + deallocate(y%gcumw) ; nullify(y%gcumw) + end if + + if (associated(y%vfall_Z)) then + deallocate(y%vfall_Z) ; nullify(y%vfall_Z) + end if + if (associated(y%gridw_Z)) then + deallocate(y%gridw_Z) ; nullify(y%gridw_Z) + end if + + if (associated(y%vfall_T)) then + deallocate(y%vfall_T) ; nullify(y%vfall_T) + end if + if (associated(y%gridw_T)) then + deallocate(y%gridw_T) ; nullify(y%gridw_T) + end if + + if (associated(y%ZefVf_2)) then + deallocate(y%ZefVf_2) ; nullify(y%ZefVf_2) + end if + + ! RTTOV multi-instrument + if (allocated(y%rttov_outputs)) then + do i=1,y % Ninst_rttov ! Iterate over each instrument + if (associated(y%rttov_outputs(i)%channel_indices)) then + deallocate(y%rttov_outputs(i)%channel_indices) + nullify(y%rttov_outputs(i)%channel_indices) + endif + if (associated(y%rttov_outputs(i)%bt_total)) then + deallocate(y%rttov_outputs(i)%bt_total) + nullify(y%rttov_outputs(i)%bt_total) + endif + if (associated(y%rttov_outputs(i)%bt_clear)) then + deallocate(y%rttov_outputs(i)%bt_clear) + nullify(y%rttov_outputs(i)%bt_clear) + endif + if (associated(y%rttov_outputs(i)%rad_total)) then + deallocate(y%rttov_outputs(i)%rad_total) + nullify(y%rttov_outputs(i)%rad_total) + endif + if (associated(y%rttov_outputs(i)%rad_clear)) then + deallocate(y%rttov_outputs(i)%rad_clear) + nullify(y%rttov_outputs(i)%rad_clear) + endif + if (associated(y%rttov_outputs(i)%rad_cloudy)) then + deallocate(y%rttov_outputs(i)%rad_cloudy) + nullify(y%rttov_outputs(i)%rad_cloudy) + endif + if (associated(y%rttov_outputs(i)%refl_total)) then + deallocate(y%rttov_outputs(i)%refl_total) + nullify(y%rttov_outputs(i)%refl_total) + endif + if (associated(y%rttov_outputs(i)%refl_clear)) then + deallocate(y%rttov_outputs(i)%refl_clear) + nullify(y%rttov_outputs(i)%refl_clear) + endif + if (associated(y%rttov_outputs(i)%bt_total_pc)) then + deallocate(y%rttov_outputs(i)%bt_total_pc) + nullify(y%rttov_outputs(i)%bt_total_pc) + endif + if (associated(y%rttov_outputs(i)%rad_total_pc)) then + deallocate(y%rttov_outputs(i)%rad_total_pc) + nullify(y%rttov_outputs(i)%rad_total_pc) + endif + end do + deallocate(y%rttov_outputs) + end if + + end subroutine destroy_cosp_outputs + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE rttov_cleanup + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + subroutine rttov_cleanup(y) + use MOD_COSP_RTTOV_INTERFACE, only: DESTROY_RTTOV_CONFIG + + type(cosp_optical_inputs),intent(inout) :: y + integer :: i + + if (size(y%cfg_rttov) .gt. 0) then + do i=1,y%Ninst_rttov + call destroy_rttov_config(y%cfg_rttov(i)) + end do + end if + nullify(y%cfg_rttov) + + end subroutine rttov_cleanup + + end program cosp2_test diff --git a/dplrw_src/cosp_cloudsat_interface.F90 b/dplrw_src/cosp_cloudsat_interface.F90 new file mode 100644 index 0000000000..c4384c4cb0 --- /dev/null +++ b/dplrw_src/cosp_cloudsat_interface.F90 @@ -0,0 +1,234 @@ +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +! Copyright (c) 2015, Regents of the University of Colorado +! All rights reserved. +! +! Redistribution and use in source and binary forms, with or without modification, are +! permitted provided that the following conditions are met: +! +! 1. Redistributions of source code must retain the above copyright notice, this list of +! conditions and the following disclaimer. +! +! 2. Redistributions in binary form must reproduce the above copyright notice, this list +! of conditions and the following disclaimer in the documentation and/or other +! materials provided with the distribution. +! +! 3. Neither the name of the copyright holder nor the names of its contributors may be +! used to endorse or promote products derived from this software without specific prior +! written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +! +! History +! May 2015 - D. Swales - Original version +! Jun 2025 - J.K. Shaw - Added COSP-RTTOV integration and swathing +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +MODULE MOD_COSP_CLOUDSAT_INTERFACE + USE COSP_KINDS, ONLY: wp + USE quickbeam, ONLY: quickbeam_init,Re_MAX_BIN,Re_BIN_LENGTH, & + maxhclass, nRe_types, nd, mt_ntt + use mod_cosp_stats, ONLY: radar_cfg,compute_orbitmasks,cosp_optical_inputs,cosp_column_inputs + IMPLICIT NONE + + ! Directory where LUTs will be stored + character(len=120) :: RADAR_SIM_LUT_DIRECTORY = './' + logical :: RADAR_SIM_LOAD_scale_LUTs_flag = .false. + logical :: RADAR_SIM_UPDATE_scale_LUTs_flag = .false. + + ! Module variables + real(wp),dimension(:,:),target,allocatable :: & + temp_hgt_matrix + real(wp),dimension(:,:,:),target,allocatable :: & + temp_z_vol_cloudsat, & + temp_kr_vol_cloudsat, & + temp_g_vol_cloudsat + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! TYPE cloudsat_IN + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + type cloudsat_IN + integer :: & + Npoints ! Number of horizontal grid-points + integer,pointer :: & + Nlevels, & ! Number of vertical levels + Ncolumns ! Number of subcolumns + real(wp),pointer :: & + hgt_matrix(:,:), & ! Height of hydrometeors (km) + z_vol(:,:,:), & ! Effective reflectivity factor (mm^6/m^3) + kr_vol(:,:,:), & ! Attenuation coefficient hydro (dB/km) + g_vol(:,:,:), & ! Attenuation coefficient gases (dB/km) + g_to_vol_in(:,:) ! Gaseous atteunation, radar to vol (dB) + type(radar_cfg),pointer :: rcfg ! Radar simulator configuration + end type cloudsat_IN + +CONTAINS + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE cosp_cloudsat_in + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + SUBROUTINE COSP_CLOUDSAT_INIT(radar_freq,k2,use_gas_abs,do_ray,undef,nhydro, & + surface_radar,rcfg,cloudsat_micro_scheme,load_LUT) + ! INPUTS + real(wp),intent(in) :: & + radar_freq, & ! Radar frequency (GHz) + k2, & ! |K|^2, the dielectric constant + undef ! Undefined + integer,intent(in) :: & + use_gas_abs, & ! 1 = do gaseous abs calcs, 0=no gasesous absorbtion calculated, + ! 2 = calculate absorption for first profile on all profiles + do_ray, & ! + nhydro, & ! + surface_radar + logical,intent(in),optional :: & + load_LUT + character(len=64),intent(in) :: & + cloudsat_micro_scheme + + ! OUTPUTS + type(radar_cfg) :: & + rcfg ! + + ! LOCAL VARIABLES + character(len=240) :: LUT_file_name + logical :: local_load_LUT + integer :: j + + if (present(load_LUT)) then + local_load_LUT = load_LUT + else + local_load_LUT = RADAR_SIM_LOAD_scale_LUTs_flag + endif + + ! LUT file name + LUT_file_name = trim(RADAR_SIM_LUT_DIRECTORY) // & + trim(cloudsat_micro_scheme) + + ! Initialize for NEW radar-configurarion derived type (radar_cfg) + rcfg%freq = radar_freq + rcfg%k2 = k2 + rcfg%use_gas_abs = use_gas_abs + rcfg%do_ray = do_ray + rcfg%nhclass = nhydro + rcfg%load_scale_LUTs = local_load_LUT + rcfg%update_scale_LUTs = .false. + rcfg%scale_LUT_file_name = LUT_file_name + rcfg%N_scale_flag = .false. + rcfg%fc = undef + rcfg%rho_eff = undef + rcfg%Z_scale_flag = .false. + rcfg%Ze_scaled = 0._wp + rcfg%Zr_scaled = 0._wp + rcfg%kr_scaled = 0._wp + + ! Set up Re bin "structure" for z_scaling + rcfg%base_list(1)=0 + do j=1,Re_MAX_BIN + rcfg%step_list(j)=0.1_wp+0.1_wp*((j-1)**1.5_wp) + if(rcfg%step_list(j)>Re_BIN_LENGTH) then + rcfg%step_list(j)=Re_BIN_LENGTH + endif + if(j>1) then + rcfg%base_list(j)=rcfg%base_list(j-1)+floor(Re_BIN_LENGTH/rcfg%step_list(j-1)) + endif + enddo + + ! Set flag denoting position of radar + if (surface_radar == 1) then + rcfg%radar_at_layer_one = .false. + else + rcfg%radar_at_layer_one = .true. + endif + + END SUBROUTINE COSP_CLOUDSAT_INIT + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE COSP_ASSIGN_cloudsatIN + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + SUBROUTINE COSP_ASSIGN_cloudsatIN(cospIN, cospgridIN, Npoints, cloudsatIN, & + CSCAL_MASK_INDICES, CSCAL_SWATH_MASK) + type(cosp_optical_inputs),intent(in),target :: cospIN ! Optical inputs to COSP simulator + type(cosp_column_inputs), intent(in),target :: cospgridIN ! Host model inputs to COSP + integer,intent(in),target :: & + Npoints + type(cloudsat_IN),intent(inout) :: & + cloudsatIN + integer,dimension(:),allocatable,intent(out) :: & ! Array containing the indices of the swath masks, already allocated? + CSCAL_MASK_INDICES + logical,dimension(:),allocatable,intent(inout) :: & ! Mask of reals over all local times + CSCAL_SWATH_MASK + + ! Local variables + integer, target :: & + N_CLOUDSAT_SWATHED, & + i + + if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then + if (.not.allocated(CSCAL_SWATH_MASK)) allocate(CSCAL_SWATH_MASK(Npoints)) + ! Do swathing to figure out which cells to simulate on + call compute_orbitmasks(Npoints, & + cospIN % cospswathsIN(3) % N_inst_swaths, & + cospIN % cospswathsIN(3) % inst_localtimes, & + cospIN % cospswathsIN(3) % inst_localtime_widths, & + cospgridIN%lat, cospgridIN%lon, & + cospgridIN%rttov_date(:,2), cospgridIN%rttov_date(:,3), & ! Time fields: month, dayofmonth + cospgridIN%rttov_time(:,1), cospgridIN%rttov_time(:,2), & ! Time fields: hour, minute + CSCAL_SWATH_MASK,N_CLOUDSAT_SWATHED) ! Output: logical mask array + cloudsatIN%Npoints = N_CLOUDSAT_SWATHED + cloudsatIN%Ncolumns => cospIN%Ncolumns + if (.not. allocated(CSCAL_MASK_INDICES)) allocate(CSCAL_MASK_INDICES(cloudsatIN%Npoints)) + CSCAL_MASK_INDICES = pack((/ (i, i = 1, Npoints ) /),mask = CSCAL_SWATH_MASK) + if (cloudsatIN%Npoints .gt. 0) then + ! Allocate swathed arrays. + allocate(temp_z_vol_cloudsat(cloudsatIN%Npoints,cospIN%Ncolumns,cospIN%Nlevels), & + temp_kr_vol_cloudsat(cloudsatIN%Npoints,cospIN%Ncolumns,cospIN%Nlevels), & + temp_g_vol_cloudsat(cloudsatIN%Npoints,cospIN%Ncolumns,cospIN%Nlevels), & + temp_hgt_matrix(cloudsatIN%Npoints,cospIN%Nlevels)) + ! Encode step: Read only appropriate values into the new temp arrays. + temp_z_vol_cloudsat = cospIN%z_vol_cloudsat(int(CSCAL_MASK_INDICES),:,:) + temp_kr_vol_cloudsat = cospIN%kr_vol_cloudsat(int(CSCAL_MASK_INDICES),:,:) + temp_g_vol_cloudsat = cospIN%g_vol_cloudsat(int(CSCAL_MASK_INDICES),:,:) + temp_hgt_matrix = cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES),:) + ! Reassign swathed values. + cloudsatIN%Nlevels => cospIN%Nlevels + cloudsatIN%z_vol => temp_z_vol_cloudsat + cloudsatIN%kr_vol => temp_kr_vol_cloudsat + cloudsatIN%g_vol => temp_g_vol_cloudsat + cloudsatIN%rcfg => cospIN%rcfg_cloudsat + cloudsatIN%hgt_matrix => temp_hgt_matrix + end if + else + cloudsatIN%Npoints = Npoints + cloudsatIN%Ncolumns => cospIN%Ncolumns + cloudsatIN%Nlevels => cospIN%Nlevels + cloudsatIN%z_vol => cospIN%z_vol_cloudsat + cloudsatIN%kr_vol => cospIN%kr_vol_cloudsat + cloudsatIN%g_vol => cospIN%g_vol_cloudsat + cloudsatIN%rcfg => cospIN%rcfg_cloudsat + cloudsatIN%hgt_matrix => cospgridIN%hgt_matrix + end if + + END SUBROUTINE COSP_ASSIGN_cloudsatIN + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE COSP_ASSIGN_cloudsatIN_CLEAN + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + SUBROUTINE COSP_ASSIGN_cloudsatIN_CLEAN() + ! Deallocate temporary arrays + if (allocated(temp_z_vol_cloudsat)) deallocate(temp_z_vol_cloudsat) + if (allocated(temp_kr_vol_cloudsat)) deallocate(temp_kr_vol_cloudsat) + if (allocated(temp_g_vol_cloudsat)) deallocate(temp_g_vol_cloudsat) + if (allocated(temp_hgt_matrix)) deallocate(temp_hgt_matrix) + + END SUBROUTINE COSP_ASSIGN_cloudsatIN_CLEAN + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! END MODULE + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +END MODULE MOD_COSP_CLOUDSAT_INTERFACE diff --git a/dplrw_src/cosp_config.F90 b/dplrw_src/cosp_config.F90 new file mode 100755 index 0000000000..79a57f9b5e --- /dev/null +++ b/dplrw_src/cosp_config.F90 @@ -0,0 +1,529 @@ +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +! Copyright (c) 2015, Regents of the University of Colorado +! All rights reserved. +! +! Redistribution and use in source and binary forms, with or without modification, are +! permitted provided that the following conditions are met: +! +! 1. Redistributions of source code must retain the above copyright notice, this list of +! conditions and the following disclaimer. +! +! 2. Redistributions in binary form must reproduce the above copyright notice, this list +! of conditions and the following disclaimer in the documentation and/or other +! materials provided with the distribution. +! +! 3. Neither the name of the copyright holder nor the names of its contributors may be +! used to endorse or promote products derived from this software without specific prior +! written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +! +! History: +! Jul 2007 - A. Bodas-Salcedo - Initial version +! Jul 2008 - A. Bodas-Salcedo - Added definitions of ISCCP axes +! Oct 2008 - H. Chepfer - Added PARASOL_NREFL +! Jun 2010 - R. Marchand - Modified to support quickbeam V3, added ifdef for +! hydrometeor definitions +! May 2015 - D. Swales - Tidied up. Set up appropriate fields during initialization. +! June 2015- D. Swales - Moved hydrometeor class variables to hydro_class_init in +! the module quickbeam_optics. +! Mar 2016 - D. Swales - Added scops_ccfrac. Was previously hardcoded in prec_scops.f90. +! Mar 2018 - R. Guzman - Added LIDAR_NTYPE for the OPAQ diagnostics +! Apr 2018 - R. Guzman - Added parameters for GROUND LIDAR and ATLID simulators +! Nov 2018 - T. Michibata - Added CloudSat+MODIS Warmrain Diagnostics +! Mar 2024 - C. Wall - Added MODIS joint-histogram diagnostics +! +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +MODULE MOD_COSP_CONFIG + USE COSP_KINDS, ONLY: wp,dp + IMPLICIT NONE + + ! ##################################################################################### + ! Common COSP information + ! ##################################################################################### + character(len=32) :: & + COSP_VERSION ! COSP Version ID (set in cosp_interface_init) + real(wp),parameter :: & + R_UNDEF = -1.0E30, & ! Missing value + R_GROUND = -1.0E20, & ! Flag for below ground results + scops_ccfrac = 0.05 ! Fraction of column (or subcolumn) covered with convective + ! precipitation (default is 5%). *NOTE* This quantity may vary + ! between modeling centers. + logical :: & + use_vgrid ! True=Use new grid for L3 CLOUDAT and CALIPSO + integer,parameter :: & + SR_BINS = 15, & ! Number of bins (backscattering coefficient) in CALOPSO LIDAR simulator. + N_HYDRO = 9 ! Number of hydrometeor classes used by quickbeam radar simulator. + + ! #################################################################################### + ! Joint histogram bin-boundaries + ! tau is used by ISCCP and MISR + ! pres is used by ISCCP + ! hgt is used by MISR + ! ReffLiq is used by MODIS + ! ReffIce is used by MODIS + ! *NOTE* ALL JOINT-HISTOGRAM BIN BOUNDARIES ARE DECLARED AND DEFINED HERE IN + ! COSP_CONFIG, WITH THE EXCEPTION OF THE TAU AXIS USED BY THE MODIS SIMULATOR, + ! WHICH IS SET DURING INITIALIZATION IN COSP_INTERFACE_INIT. + ! #################################################################################### + ! Optical depth bin axis + integer,parameter :: & + ntau=7 + real(wp),parameter,dimension(ntau+1) :: & + tau_binBounds = (/0.0, 0.3, 1.3, 3.6, 9.4, 23., 60., 10000./) + real(wp),parameter,dimension(ntau) :: & + tau_binCenters = (/0.15, 0.80, 2.45, 6.5, 16.2, 41.5, 100.0/) + real(wp),parameter,dimension(2,ntau) :: & + tau_binEdges = reshape(source=(/0.0, 0.3, 0.3, 1.3, 1.3, 3.6, 3.6, & + 9.4, 9.4, 23.0, 23.0, 60.0, 60.0, 100000.0/), & + shape=(/2,ntau/)) + + ! Optical depth bin axes (ONLY USED BY MODIS SIMULATOR IN v1.4) + integer :: l,k + integer,parameter :: & + ntauV1p4 = 6 + real(wp),parameter,dimension(ntauV1p4+1) :: & + tau_binBoundsV1p4 = (/0.3, 1.3, 3.6, 9.4, 23., 60., 10000./) + real(wp),parameter,dimension(2,ntauV1p4) :: & + tau_binEdgesV1p4 = reshape(source =(/tau_binBoundsV1p4(1),((tau_binBoundsV1p4(k),l=1,2), & + k=2,ntauV1p4),100000._wp/),shape = (/2,ntauV1p4/)) + real(wp),parameter,dimension(ntauV1p4) :: & + tau_binCentersV1p4 = (tau_binEdgesV1p4(1,:)+tau_binEdgesV1p4(2,:))/2._wp + + ! Cloud-top height pressure bin axis + integer,parameter :: & + npres = 7 + real(wp),parameter,dimension(npres+1) :: & + pres_binBounds = (/0., 180., 310., 440., 560., 680., 800., 10000./) + real(wp),parameter,dimension(npres) :: & + pres_binCenters = (/90000., 74000., 62000., 50000., 37500., 24500., 9000./) + real(wp),parameter,dimension(2,npres) :: & + pres_binEdges = reshape(source=(/100000.0, 80000.0, 80000.0, 68000.0, 68000.0, & + 56000.0, 56000.0, 44000.0, 44000.0, 31000.0, & + 31000.0, 18000.0, 18000.0, 0.0/), & + shape=(/2,npres/)) + + ! Cloud-top height bin axis #1 + integer,parameter :: & + nhgt = 16 + real(wp),parameter,dimension(nhgt+1) :: & + hgt_binBounds = (/-.99,0.,0.5,1.,1.5,2.,2.5,3.,4.,5.,7.,9.,11.,13.,15.,17.,99./) + real(wp),parameter,dimension(nhgt) :: & + hgt_binCenters = 1000*(/0.,0.25,0.75,1.25,1.75,2.25,2.75,3.5,4.5,6.,8.,10.,12., & + 14.5,16.,18./) + real(wp),parameter,dimension(2,nhgt) :: & + hgt_binEdges = 1000.0*reshape(source=(/-99.0, 0.0, 0.0, 0.5, 0.5, 1.0, 1.0, 1.5, & + 1.5, 2.0, 2.0, 2.5, 2.5, 3.0, 3.0, 4.0, & + 4.0, 5.0, 5.0, 7.0, 7.0, 9.0, 9.0,11.0, & + 11.0,13.0,13.0,15.0,15.0,17.0,17.0,99.0/),& + shape=(/2,nhgt/)) + + ! Liquid and Ice particle bins for MODIS joint histogram of optical-depth and particle + ! size + ! Bin edges match Pincus et al. 2023 observational data (doi:10.5194/essd-15-2483-2023) + ! Additional Re bins to capture all simulated clouds + integer :: i,j + integer,parameter :: & + nReffLiq = 8, & ! Number of ReffLiq bins for tau/ReffLiq and LWP/ReffLiq joint-histogram + nReffIce = 8 ! Number of ReffIce bins for tau/ReffICE and IWP/ReffIce joint-histogram + real(wp),parameter,dimension(nReffLiq+1) :: & + reffLIQ_binBounds = (/0.0, 4.0e-6, 8e-6, 1.0e-5, 1.25e-5, 1.5e-5, 2.0e-5, 3.0e-5, 1.0e-2/) + real(wp),parameter,dimension(nReffIce+1) :: & + reffICE_binBounds = (/0.0,5.0e-6, 1.0e-5, 2.0e-5, 3.0e-5, 4.0e-5, 5.0e-5, 6.0e-5, 1.0e-2/) + real(wp),parameter,dimension(2,nReffICE) :: & + reffICE_binEdges = reshape(source=(/reffICE_binBounds(1),((reffICE_binBounds(k), & + l=1,2),k=2,nReffICE),reffICE_binBounds(nReffICE+1)/), & + shape = (/2,nReffICE/)) + real(wp),parameter,dimension(2,nReffLIQ) :: & + reffLIQ_binEdges = reshape(source=(/reffLIQ_binBounds(1),((reffLIQ_binBounds(k), & + l=1,2),k=2,nReffLIQ),reffLIQ_binBounds(nReffLIQ+1)/), & + shape = (/2,nReffLIQ/)) + real(wp),parameter,dimension(nReffICE) :: & + reffICE_binCenters = (reffICE_binEdges(1,:)+reffICE_binEdges(2,:))/2._wp + real(wp),parameter,dimension(nReffLIQ) :: & + reffLIQ_binCenters = (reffLIQ_binEdges(1,:)+reffLIQ_binEdges(2,:))/2._wp + + ! LWP and IWP bins for MODIS joint histogram of (1) LWP and droplet size + ! and (2) IWP and particle size + integer, parameter :: & + nLWP = 7, & ! Number of bins for LWP/ReffLiq joint-histogram + nIWP = 7 ! Number of bins for IWP/ReffIce joint-histogram + real(wp),parameter,dimension(nLWP+1) :: & + LWP_binBounds = (/0., 0.01, 0.03, 0.06, 0.10, 0.15, 0.25, 20.0/) ! kg/m2 + real(wp),parameter,dimension(nIWP+1) :: & + IWP_binBounds = (/0., 0.02, 0.05, 0.10, 0.20, 0.40, 1.00, 20.0/) ! kg/m2 + real(wp),parameter,dimension(2,nLWP) :: & + LWP_binEdges = reshape(source=(/LWP_binBounds(1),((LWP_binBounds(k), & + l=1,2),k=2,nLWP),LWP_binBounds(nLWP+1)/), & + shape = (/2,nLWP/)) + real(wp),parameter,dimension(2,nIWP) :: & + IWP_binEdges = reshape(source=(/IWP_binBounds(1),((IWP_binBounds(k), & + l=1,2),k=2,nIWP),IWP_binBounds(nIWP+1)/), & + shape = (/2,nIWP/)) + real(wp),parameter,dimension(nLWP) :: & + LWP_binCenters = (LWP_binEdges(1,:)+LWP_binEdges(2,:))/2._wp + real(wp),parameter,dimension(nIWP) :: & + IWP_binCenters = (IWP_binEdges(1,:)+IWP_binEdges(2,:))/2._wp + ! #################################################################################### + ! Constants used by RTTOV. + ! #################################################################################### + ! None + ! #################################################################################### + ! Constants used by the PARASOL simulator. + ! #################################################################################### + integer,parameter :: & + PARASOL_NREFL = 5, & ! Number of angles in LUT + PARASOL_NTAU = 7 ! Number of optical depths in LUT + real(wp),parameter,dimension(PARASOL_NREFL) :: & + PARASOL_SZA = (/0.0, 20.0, 40.0, 60.0, 80.0/) + REAL(WP),parameter,dimension(PARASOL_NTAU) :: & + PARASOL_TAU = (/0., 1., 5., 10., 20., 50., 100./) + + ! LUTs + REAL(WP),parameter,dimension(PARASOL_NREFL,PARASOL_NTAU) :: & + ! LUT for liquid particles + rlumA = reshape(source=(/ 0.03, 0.03, 0.03, 0.03, 0.03, & + 0.090886, 0.072185, 0.058410, 0.052498, 0.034730, & + 0.283965, 0.252596, 0.224707, 0.175844, 0.064488, & + 0.480587, 0.436401, 0.367451, 0.252916, 0.081667, & + 0.695235, 0.631352, 0.509180, 0.326551, 0.098215, & + 0.908229, 0.823924, 0.648152, 0.398581, 0.114411, & + 1.0, 0.909013, 0.709554, 0.430405, 0.121567/), & + shape=(/PARASOL_NREFL,PARASOL_NTAU/)), & + ! LUT for ice particles + rlumB = reshape(source=(/ 0.03, 0.03, 0.03, 0.03, 0.03, & + 0.092170, 0.087082, 0.083325, 0.084935, 0.054157, & + 0.311941, 0.304293, 0.285193, 0.233450, 0.089911, & + 0.511298, 0.490879, 0.430266, 0.312280, 0.107854, & + 0.712079, 0.673565, 0.563747, 0.382376, 0.124127, & + 0.898243, 0.842026, 0.685773, 0.446371, 0.139004, & + 0.976646, 0.912966, 0.737154, 0.473317, 0.145269/), & + shape=(/PARASOL_NREFL,PARASOL_NTAU/)) + + ! #################################################################################### + ! ISCCP simulator tau/CTP joint histogram information + ! #################################################################################### + integer,parameter :: & + numISCCPTauBins = ntau, & ! Number of optical depth bins + numISCCPPresBins = npres ! Number of pressure bins + real(wp),parameter,dimension(ntau+1) :: & + isccp_histTau = tau_binBounds ! Joint-histogram boundaries (optical depth) + real(wp),parameter,dimension(npres+1) :: & + isccp_histPres = pres_binBounds ! Joint-histogram boundaries (cloud pressure) + real(wp),parameter,dimension(ntau) :: & + isccp_histTauCenters = tau_binCenters ! Joint histogram bin centers (optical depth) + real(wp),parameter,dimension(npres) :: & + isccp_histPresCenters = pres_binCenters ! Joint histogram bin centers (cloud pressure) + real(wp),parameter,dimension(2,ntau) :: & + isccp_histTauEdges = tau_binEdges ! Joint histogram bin edges (optical depth) + real(wp),parameter,dimension(2,npres) :: & + isccp_histPresEdges = pres_binEdges ! Joint histogram bin edges (cloud pressure) + + ! #################################################################################### + ! MISR simulator tau/CTH joint histogram information + ! #################################################################################### + integer,parameter :: & + numMISRHgtBins = nhgt, & ! Number of cloud-top height bins + numMISRTauBins = ntau ! Number of optical depth bins + ! Joint histogram boundaries + real(wp),parameter,dimension(numMISRHgtBins+1) :: & + misr_histHgt = hgt_binBounds ! Joint-histogram boundaries (cloud height) + real(wp),parameter,dimension(numMISRTauBins+1) :: & + misr_histTau = tau_binBounds ! Joint-histogram boundaries (optical-depth) + real(wp),parameter,dimension(numMISRHgtBins) :: & + misr_histHgtCenters = hgt_binCenters ! Joint-histogram bin centers (cloud height) + real(wp),parameter,dimension(2,numMISRHgtBins) :: & + misr_histHgtEdges = hgt_BinEdges ! Joint-histogram bin edges (cloud height) + + ! #################################################################################### + ! MODIS simulator tau/CTP joint histogram information + ! #################################################################################### + integer,parameter :: & + numMODISPresBins = npres ! Number of pressure bins for joint-histogram + real(wp),parameter,dimension(numMODISPresBins + 1) :: & + modis_histPres = 100*pres_binBounds ! Joint-histogram boundaries (cloud pressure) + real(wp),parameter,dimension(2, numMODISPresBins) :: & + modis_histPresEdges = 100*pres_binEdges ! Joint-histogram bin edges (cloud pressure) + real(wp),parameter,dimension(numMODISPresBins) :: & + modis_histPresCenters = 100*pres_binCenters ! Joint-histogram bin centers (cloud pressure) + + ! For the MODIS simulator we want to preserve the ability for cospV1.4.0 to use the + ! old histogram bin boundaries for optical depth, so these are set up in initialization. + integer :: & + numMODISTauBins ! Number of tau bins for joint-histogram + real(wp),allocatable,dimension(:) :: & + modis_histTau ! Joint-histogram boundaries (optical depth) + real(wp),allocatable,dimension(:,:) :: & + modis_histTauEdges ! Joint-histogram bin edges (optical depth) + real(wp),allocatable,dimension(:) :: & + modis_histTauCenters ! Joint-histogram bin centers (optical depth) + + ! #################################################################################### + ! MODIS simulator tau/ReffICE and tau/ReffLIQ joint-histogram information + ! #################################################################################### + ! Ice + integer,parameter :: & + numMODISReffIceBins = nReffIce ! Number of bins for joint-histogram + real(wp),parameter,dimension(nReffIce+1) :: & + modis_histReffIce = reffICE_binBounds ! Effective radius bin boundaries + real(wp),parameter,dimension(nReffIce) :: & + modis_histReffIceCenters = reffICE_binCenters ! Effective radius bin centers + real(wp),parameter,dimension(2,nReffICE) :: & + modis_histReffIceEdges = reffICE_binEdges ! Effective radius bin edges + + ! Liquid + integer,parameter :: & + numMODISReffLiqBins = nReffLiq ! Number of bins for joint-histogram + real(wp),parameter,dimension(nReffLiq+1) :: & + modis_histReffLiq = reffLIQ_binBounds ! Effective radius bin boundaries + real(wp),parameter,dimension(nReffLiq) :: & + modis_histReffLiqCenters = reffLIQ_binCenters ! Effective radius bin centers + real(wp),parameter,dimension(2,nReffLiq) :: & + modis_histReffLiqEdges = reffLIQ_binEdges ! Effective radius bin edges + ! #################################################################################### + ! MODIS simulator LWP/ReffLIQ and IWP/ReffIce joint-histogram information + ! #################################################################################### + ! Liquid + integer,parameter :: & + numMODISLWPBins = nLWP ! Number of bins for joint-histogram + real(wp),parameter,dimension(nLWP+1) :: & + modis_histLWP = LWP_binBounds ! LWP bin boundaries + real(wp),parameter,dimension(nLWP) :: & + modis_histLWPCenters = LWP_binCenters ! LWP bin centers + real(wp),parameter,dimension(2,nLWP) :: & + modis_histLWPEdges = LWP_binEdges ! LWP bin edges + + ! Ice + integer,parameter :: & + numMODISIWPBins = nIWP ! Number of bins for joint-histogram + real(wp),parameter,dimension(nIWP+1) :: & + modis_histIWP = IWP_binBounds ! IWP bin boundaries + real(wp),parameter,dimension(nIWP) :: & + modis_histIWPCenters = IWP_binCenters ! IWP bin centers + real(wp),parameter,dimension(2,nIWP) :: & + modis_histIWPEdges = IWP_binEdges ! IWP bin edges + + ! #################################################################################### + ! CLOUDSAT reflectivity histogram information + ! #################################################################################### + integer,parameter :: & + CLOUDSAT_DBZE_BINS = 15, & ! Number of dBZe bins in histogram (cfad) + CLOUDSAT_DBZE_MIN = -100, & ! Minimum value for radar reflectivity + CLOUDSAT_DBZE_MAX = 80, & ! Maximum value for radar reflectivity + CLOUDSAT_CFAD_ZE_MIN = -50, & ! Lower value of the first CFAD Ze bin + CLOUDSAT_CFAD_ZE_WIDTH = 5 ! Bin width (dBZe) + + real(wp),parameter,dimension(CLOUDSAT_DBZE_BINS+1) :: & + cloudsat_histRef = (/CLOUDSAT_DBZE_MIN,(/(i, i=int(CLOUDSAT_CFAD_ZE_MIN+CLOUDSAT_CFAD_ZE_WIDTH),& + int(CLOUDSAT_CFAD_ZE_MIN+(CLOUDSAT_DBZE_BINS-1)*CLOUDSAT_CFAD_ZE_WIDTH), & + int(CLOUDSAT_CFAD_ZE_WIDTH))/),CLOUDSAT_DBZE_MAX/) + real(wp),parameter,dimension(2,CLOUDSAT_DBZE_BINS) :: & + cloudsat_binEdges = reshape(source=(/cloudsat_histRef(1),((cloudsat_histRef(k), & + l=1,2),k=2,CLOUDSAT_DBZE_BINS),cloudsat_histRef(CLOUDSAT_DBZE_BINS+1)/),& + shape = (/2,CLOUDSAT_DBZE_BINS/)) + real(wp),parameter,dimension(CLOUDSAT_DBZE_BINS) :: & + cloudsat_binCenters = (cloudsat_binEdges(1,:)+cloudsat_binEdges(2,:))/2._wp + + ! Parameters for Cloudsat near-surface precipitation diagnostics. + ! Precipitation classes. + integer, parameter :: & + nCloudsatPrecipClass = 10 + integer, parameter :: & + pClass_noPrecip = 0, & ! No precipitation + pClass_Rain1 = 1, & ! Rain possible + pClass_Rain2 = 2, & ! Rain probable + pClass_Rain3 = 3, & ! Rain certain + pClass_Snow1 = 4, & ! Snow possible + pClass_Snow2 = 5, & ! Snow certain + pClass_Mixed1 = 6, & ! Mixed-precipitation possible + pClass_Mixed2 = 7, & ! Mixed-precipitation certain + pClass_Rain4 = 8, & ! Heavy rain + pClass_default = 9 ! Default + ! Reflectivity bin boundaries, used by decision tree to classify precipitation type. + real(wp), dimension(4),parameter :: & + Zenonbinval =(/0._wp, -5._wp, -7.5_wp, -15._wp/) + real(wp), dimension(6),parameter :: & + Zbinvallnd = (/10._wp, 5._wp, 2.5_wp, -2.5_wp, -5._wp, -15._wp/) + ! Vertical level index(Nlvgrid) for Cloudsat precipitation occurence/frequency diagnostics. + ! Level 39 of Nlvgrid(40) is 480-960m. + integer, parameter :: & + cloudsat_preclvl = 39 + + ! for DPLRW simulator + real(wp),parameter :: & + trbl_LS = 0.5, & + trbl_CU = 1.0 + real(wp),parameter :: & + lvtemp_MIN = -80., & + lvtemp_MAX = 30., & + lvtemp_WID = 2., & + lvdBZe_MIN = -40., & + lvdBZe_MAX = 30., & + lvdBZe_WID = 2., & + lvdplr_MIN = -6.0, & + lvdplr_MAX = 6.0, & + lvdplr_WID = 0.2, & + lvspwd_MIN = 0.0, & + lvspwd_MAX = 5.0, & + lvspwd_WID = 0.1 + integer,parameter :: & + Nlvtemp = nint( (lvtemp_MAX-lvtemp_MIN)/lvtemp_WID ), & + NlvdBZe = nint( (lvdBZe_MAX-lvdBZe_MIN)/lvdBZe_WID ), & + Nlvdplr = nint( (lvdplr_MAX-lvdplr_MIN)/lvdplr_WID ), & + Nlvspwd = nint( (lvspwd_MAX-lvspwd_MIN)/lvspwd_WID ) + + real(wp),parameter :: & + lvtemp_grid(Nlvtemp) = (/( lvtemp_MIN+lvtemp_WID*(i-0.5), i=1,Nlvtemp )/), & + lvdBZe_grid(NlvdBZe) = (/( lvdBZe_MIN+lvdBZe_WID*(i-0.5), i=1,NlvdBZe )/), & + lvdplr_grid(Nlvdplr) = (/( lvdplr_MIN+lvdplr_WID*(i-0.5), i=1,Nlvdplr )/), & + lvspwd_grid(Nlvspwd) = (/( lvspwd_MIN+lvspwd_WID*(i-0.5), i=1,Nlvspwd )/) + + ! #################################################################################### + ! CLOUDSAT and MODIS joint product information (2018.11.22) + ! #################################################################################### + ! @ COSP_DIAG_WARMRAIN: + integer, parameter :: CFODD_NCLASS = 3 ! # of classes for CFODD (classified by MODIS Reff) + integer, parameter :: WR_NREGIME = 3 ! # of warm-rain regimes (non-precip/drizzling/raining) + integer, parameter :: SGCLD_CLR = 0 ! sub-grid cloud ID (fracout): clear-sky + integer, parameter :: SGCLD_ST = 1 ! sub-grid cloud ID (fracout): stratiform + integer, parameter :: SGCLD_CUM = 2 ! sub-grid cloud ID (fracout): cumulus + real(wp),parameter :: CWP_THRESHOLD = 0.00 ! cloud water path threshold + real(wp),parameter :: COT_THRESHOLD = 0.30 ! cloud optical thickness threshold + real(wp),parameter,dimension(CFODD_NCLASS+1) :: & + CFODD_BNDRE = (/5.0e-6, 12.0e-6, 18.0e-6, 35.0e-6/) ! Reff bnds + real(wp),parameter,dimension(2) :: & + CFODD_BNDZE = (/-15.0, 0.0/) ! dBZe bnds (cloud/drizzle/precip) + real(wp),parameter :: CFODD_DBZE_MIN = -30.0 ! Minimum value of CFODD dBZe bin + real(wp),parameter :: CFODD_DBZE_MAX = 20.0 ! Maximum value of CFODD dBZe bin + real(wp),parameter :: CFODD_ICOD_MIN = 0.0 ! Minimum value of CFODD ICOD bin + real(wp),parameter :: CFODD_ICOD_MAX = 60.0 ! Maximum value of CFODD ICOD bin + real(wp),parameter :: CFODD_DBZE_WIDTH = 2.0 ! Bin width (dBZe) + real(wp),parameter :: CFODD_ICOD_WIDTH = 2.0 ! Bin width (ICOD) + integer,parameter :: & + CFODD_NDBZE = INT( (CFODD_DBZE_MAX-CFODD_DBZE_MIN)/CFODD_DBZE_WIDTH ) ! Number of CFODD dBZe bins + integer,parameter :: & + CFODD_NICOD = INT( (CFODD_ICOD_MAX-CFODD_ICOD_MIN)/CFODD_ICOD_WIDTH ) ! Number of CFODD ICOD bins + real(wp),parameter,dimension(CFODD_NDBZE+1) :: & + CFODD_HISTDBZE = (/int(CFODD_DBZE_MIN),(/(i, i=int(CFODD_DBZE_MIN+CFODD_DBZE_WIDTH), & + int(CFODD_DBZE_MIN+(CFODD_NDBZE-1)*CFODD_DBZE_WIDTH), & + int(CFODD_DBZE_WIDTH))/),int(CFODD_DBZE_MAX)/) + real(wp),parameter,dimension(CFODD_NICOD+1) :: & + CFODD_HISTICOD = (/int(CFODD_ICOD_MIN),(/(i, i=int(CFODD_ICOD_MIN+CFODD_ICOD_WIDTH), & + int(CFODD_ICOD_MIN+(CFODD_NICOD-1)*CFODD_ICOD_WIDTH), & + int(CFODD_ICOD_WIDTH))/),int(CFODD_ICOD_MAX)/) + real(wp),parameter,dimension(2,CFODD_NDBZE) :: & + CFODD_HISTDBZEedges = reshape(source=(/CFODD_HISTDBZE(1),((CFODD_HISTDBZE(k), & + l=1,2),k=2,CFODD_NDBZE),CFODD_HISTDBZE(CFODD_NDBZE+1)/), & + shape = (/2,CFODD_NDBZE/)) + real(wp),parameter,dimension(CFODD_NDBZE) :: & + CFODD_HISTDBZEcenters = (CFODD_HISTDBZEedges(1,:)+CFODD_HISTDBZEedges(2,:))/2._wp + real(wp),parameter,dimension(2,CFODD_NICOD) :: & + CFODD_HISTICODedges = reshape(source=(/CFODD_HISTICOD(1),((CFODD_HISTICOD(k), & + l=1,2),k=2,CFODD_NICOD),CFODD_HISTICOD(CFODD_NICOD+1)/), & + shape = (/2,CFODD_NICOD/)) + real(wp),parameter,dimension(CFODD_NICOD) :: & + CFODD_HISTICODcenters = (CFODD_HISTICODedges(1,:)+CFODD_HISTICODedges(2,:))/2._wp + + ! #################################################################################### + ! Parameters used by the CALIPSO LIDAR simulator + ! #################################################################################### + ! CALISPO backscatter histogram bins + real(wp),parameter :: & + S_cld = 5.0, & ! Threshold for cloud detection + S_att = 0.01, & ! + S_cld_att = 30. ! Threshold for undefined cloud phase detection + real(wp),parameter,dimension(SR_BINS+1) :: & + calipso_histBsct = (/-1.,0.01,1.2,3.0,5.0,7.0,10.0,15.0,20.0,25.0,30.0,40.0,50.0, & + 60.0,80.0,999./) ! Backscatter histogram bins + real(wp),parameter,dimension(2,SR_BINS) :: & + calipso_binEdges = reshape(source=(/calipso_histBsct(1),((calipso_histBsct(k), & + l=1,2),k=2,SR_BINS),calipso_histBsct(SR_BINS+1)/), & + shape = (/2,SR_BINS/)) + real(wp),parameter,dimension(SR_BINS) :: & + calipso_binCenters = (calipso_binEdges(1,:)+calipso_binEdges(2,:))/2._wp + + integer,parameter :: & + LIDAR_NTEMP = 40, & + LIDAR_NCAT = 4, & ! Number of categories for cloudtop heights (high/mid/low/tot) + LIDAR_NTYPE = 3 ! Number of categories for OPAQ (opaque/thin cloud + z_opaque) + real(wp),parameter,dimension(LIDAR_NTEMP) :: & + LIDAR_PHASE_TEMP= & + (/-91.5,-88.5,-85.5,-82.5,-79.5,-76.5,-73.5,-70.5,-67.5,-64.5, & + -61.5,-58.5,-55.5,-52.5,-49.5,-46.5,-43.5,-40.5,-37.5,-34.5, & + -31.5,-28.5,-25.5,-22.5,-19.5,-16.5,-13.5,-10.5, -7.5, -4.5, & + -1.5, 1.5, 4.5, 7.5, 10.5, 13.5, 16.5, 19.5, 22.5, 25.5/) + real(wp),parameter,dimension(2,LIDAR_NTEMP) :: & + LIDAR_PHASE_TEMP_BNDS=reshape(source= & + (/-273.15, -90., -90., -87., -87., -84., -84., -81., -81., -78., & + -78., -75., -75., -72., -72., -69., -69., -66., -66., -63., & + -63., -60., -60., -57., -57., -54., -54., -51., -51., -48., & + -48., -45., -45., -42., -42., -39., -39., -36., -36., -33., & + -33., -30., -30., -27., -27., -24., -24., -21., -21., -18., & + -18., -15., -15., -12., -12., -9., -9., -6., -6., -3., & + -3., 0., 0., 3., 3., 6., 6., 9., 9., 12., & + 12., 15., 15., 18., 18., 21., 21., 24., 24., 100. /), & + shape=(/2,40/)) + + ! #################################################################################### + ! Parameters used by the GROUND LIDAR simulator + ! #################################################################################### + ! GROUND LIDAR backscatter histogram bins +! real(wp),parameter :: & +! S_cld = 5.0, & ! Threshold for cloud detection +! S_att = 0.01, & ! +! S_cld_att = 30. ! Threshold for undefined cloud phase detection + real(wp),parameter,dimension(SR_BINS+1) :: & + grLidar532_histBsct = (/-1.,0.01,1.2,3.0,5.0,7.0,10.0,15.0,20.0,25.0,30.0,40.0,50.0, & + 60.0,80.0,999./) ! Backscatter histogram bins + real(wp),parameter,dimension(2,SR_BINS) :: & + grLidar532_binEdges = reshape(source=(/grLidar532_histBsct(1),((grLidar532_histBsct(k), & + l=1,2),k=2,SR_BINS),grLidar532_histBsct(SR_BINS+1)/), & + shape = (/2,SR_BINS/)) + real(wp),parameter,dimension(SR_BINS) :: & + grLidar532_binCenters = (grLidar532_binEdges(1,:)+grLidar532_binEdges(2,:))/2._wp + +! integer,parameter :: & +! LIDAR_NCAT = 4 ! Number of categories for cloudtop heights (high/mid/low/tot) + + ! #################################################################################### + ! Parameters used by the ATLID LIDAR simulator + ! #################################################################################### + ! ATLID LIDAR backscatter histogram bins + real(wp),parameter :: & + S_cld_atlid = 1.74, & ! Threshold for cloud detection + S_att_atlid = 0.01, & ! + S_cld_att_atlid = 6.67 ! Threshold for undefined cloud phase detection + real(wp),parameter,dimension(SR_BINS+1) :: & + atlid_histBsct = (/-1.,0.01,1.03,1.38,1.74,2.07,2.62,3.65,4.63,5.63,6.67,8.8,11.25, & + 13.2,17.2,999./) ! Backscatter histogram bins + real(wp),parameter,dimension(2,SR_BINS) :: & + atlid_binEdges = reshape(source=(/atlid_histBsct(1),((atlid_histBsct(k), & + l=1,2),k=2,SR_BINS),atlid_histBsct(SR_BINS+1)/), & + shape = (/2,SR_BINS/)) + real(wp),parameter,dimension(SR_BINS) :: & + atlid_binCenters = (atlid_binEdges(1,:)+atlid_binEdges(2,:))/2._wp + +! integer,parameter :: & +! LIDAR_NCAT = 4 ! Number of categories for cloudtop heights (high/mid/low/tot) + + ! #################################################################################### + ! New vertical grid used by CALIPSO and CLOUDSAT L3 (set up during initialization) + ! #################################################################################### + integer :: & + Nlvgrid ! Number of levels in New grid + real(wp),dimension(:),allocatable :: & + vgrid_zl, & ! New grid bottoms + vgrid_zu, & ! New grid tops + vgrid_z, & ! New grid center + dz ! dZ + +END MODULE MOD_COSP_CONFIG diff --git a/dplrw_src/cosp_stats.F90 b/dplrw_src/cosp_stats.F90 new file mode 100755 index 0000000000..fae50d89ab --- /dev/null +++ b/dplrw_src/cosp_stats.F90 @@ -0,0 +1,793 @@ +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +! Copyright (c) 2015, Regents of the University of Colorado +! All rights reserved. +! +! Redistribution and use in source and binary forms, with or without modification, are +! permitted provided that the following conditions are met: +! +! 1. Redistributions of source code must retain the above copyright notice, this list of +! conditions and the following disclaimer. +! +! 2. Redistributions in binary form must reproduce the above copyright notice, this list +! of conditions and the following disclaimer in the documentation and/or other +! materials provided with the distribution. +! +! 3. Neither the name of the copyright holder nor the names of its contributors may be +! used to endorse or promote products derived from this software without specific prior +! written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +! +! History: +! Jul 2007 - A. Bodas-Salcedo - Initial version +! Jul 2008 - A. Bodas-Salcedo - Added capability of producing outputs in standard grid +! Oct 2008 - J.-L. Dufresne - Bug fixed. Assignment of Npoints,Nlevels,Nhydro,Ncolumns +! in COSP_STATS +! Oct 2008 - H. Chepfer - Added PARASOL reflectance arguments +! Jun 2010 - T. Yokohata, T. Nishimura and K. Ogochi - Added NEC SXs optimisations +! Jan 2013 - G. Cesana - Added betaperp and temperature arguments +! - Added phase 3D/3Dtemperature/Map output variables in diag_lidar +! May 2015 - D. Swales - Modified for cosp2.0 +! Nov 2018 - T. Michibata - Added CloudSat+MODIS Warmrain Diagnostics +! Jun 2025 - J.K. Shaw. - Added COSP-RTTOV integration and swathing +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +MODULE MOD_COSP_STATS + USE COSP_KINDS, ONLY: wp + USE MOD_COSP_CONFIG, & + ONLY: R_UNDEF, R_GROUND, & + SGCLD_CLR, SGCLD_ST, & + SGCLD_CUM, & + CWP_THRESHOLD, COT_THRESHOLD, & + CFODD_NDBZE, CFODD_NICOD, & + CFODD_BNDRE, CFODD_BNDZE, & + CFODD_NCLASS, & + CFODD_DBZE_MIN, CFODD_DBZE_MAX, & + CFODD_ICOD_MIN, CFODD_ICOD_MAX, & + CFODD_DBZE_WIDTH, CFODD_ICOD_WIDTH, & + CFODD_HISTDBZE, CFODD_HISTICOD, & + WR_NREGIME, VGRID_ZU, & + VGRID_ZL, VGRID_Z, & + DZ + USE COSP_PHYS_CONSTANTS, ONLY: tmelt, radius_earth + USE COSP_MATH_CONSTANTS, ONLY: pi + USE MOD_COSP_RTTOV_UTIL, ONLY: rttov_cfg + IMPLICIT NONE + + ! ###################################################################################### + ! Quickbeam parameters + integer,parameter :: & + maxhclass = 20, & ! Qucikbeam maximum number of hydrometeor classes. + nRe_types = 550, & ! Quickbeam maximum number or Re size bins allowed in N and Z_scaled look up table. + nd = 85, & ! Qucikbeam number of discrete particles used in construction DSDs. + mt_ntt = 39, & ! Quickbeam number of temperatures in mie LUT. + Re_BIN_LENGTH = 10, & ! Quickbeam minimum Re interval in scale LUTs + Re_MAX_BIN = 250 ! Quickbeam maximum Re interval in scale LUTs + real(wp),parameter :: & + dmin = 0.1, & ! Quickbeam minimum size of discrete particle + dmax = 10000. ! Quickbeam maximum size of discrete particle + + ! ###################################################################################### + ! TYPE cosp_column_inputs + ! ###################################################################################### + type cosp_column_inputs + integer :: & + Npoints, & ! Number of gridpoints. + Ncolumns, & ! Number of columns. + Nlevels ! Number of levels. + + integer,allocatable,dimension(:) :: & + sunlit ! Sunlit flag (0-1) + + real(wp),allocatable,dimension(:,:) :: & + at, & ! Temperature (K) + pfull, & ! Pressure (Pa) + phalf, & ! Pressure at half-levels (Pa) + qv, & ! Specific humidity (kg/kg) + co2, & ! CO2 (kg/kg) + ch4, & ! Methane (kg/kg) + n2o, & ! N2O (kg/kg) + co, & ! CO (kg/kg) + so2, & ! SO2 (kg/kg) + hgt_matrix, & ! Height of atmosphere layer (km) + hgt_matrix_half ! Height of bottom interface of atm layer(km) + ! First level contains the bottom of the top layer. + ! Last level contains the bottom of the surface layer. + + real(wp),allocatable,dimension(:) :: & + land, & ! Land/Sea mask (0 for ocean, 1 for land) + skt, & ! Surface temperature (K) + surfelev ! Surface Elevation (m) + ! Fields used ONLY by RTTOV + real(wp),allocatable,dimension(:) :: & + u_sfc, & ! Surface u-wind (m/s) + v_sfc, & ! Surface v-wind (m/s) + t2m, & ! 2-meter temperature (K) + q2m, & ! 2-meter specific humidity (kg/kg) + lat, & ! Latitude (deg) + lon, & ! Longitude (deg) + sza, & ! Solar Zenith Angle in degrees + psfc, & ! Surface pressure (Pa) + rttov_sfcmask ! Mask for RTTOV surface types (0 for ocean, 1 for land, 2 for sea ice) + + real(wp),allocatable,dimension(:,:) :: & + o3, & ! Ozone (kg/kg) + tca, & ! Total layer cloud fraction (0-1) + cloudIce, & ! Cloud ice water mixing ratio (kg/kg) + cloudLiq, & ! Cloud liquid water mixing ratio (kg/kg) + DeffLiq, & ! Cloud liquid effective diameter (um) + DeffIce, & ! Cloud ice effective diameter (um) + rttov_date, & ! Date of the profile as year (e.g. 2013), month (1-12), and day (1-31) + rttov_time, & ! Time of profile as hour, minute, second. + emis_in, & ! Surface emissivity (point,channel) (1) + refl_in, & ! Surface reflectance (point,channel) (1) + fl_rain, & ! Precipitation (rain) flux (kg/m2/s) + fl_snow ! Precipitation (snow) flux (kg/m2/s) + + ! added by DPLRW + real(wp),allocatable,dimension(:,:) :: & + gwvel, & ! grid verical velocity (m/s) + gcumf ! grid cumulus mass flux (kg/m^2/s) + + end type cosp_column_inputs + + + ! ###################################################################################### + ! TYPE swath_inputs + ! ###################################################################################### + type swath_inputs + + integer :: & + N_inst_swaths = 0 + real(wp),dimension(20) :: & + inst_localtimes, & + inst_localtime_widths + + end type swath_inputs + + type radar_cfg + ! Radar properties + real(wp) :: freq,k2 + integer :: nhclass ! Number of hydrometeor classes in use + integer :: use_gas_abs, do_ray + logical :: radar_at_layer_one ! If true radar is assume to be at the edge + ! of the first layer, if the first layer is the + ! surface than a ground-based radar. If the + ! first layer is the top-of-atmosphere, then + ! a space borne radar. + + ! Variables used to store Z scale factors + character(len=240) :: scale_LUT_file_name + logical :: load_scale_LUTs, update_scale_LUTs + logical, dimension(maxhclass,nRe_types) :: N_scale_flag + logical, dimension(maxhclass,mt_ntt,nRe_types) :: Z_scale_flag,Z_scale_added_flag + real(wp),dimension(maxhclass,mt_ntt,nRe_types) :: Ze_scaled,Zr_scaled,kr_scaled + real(wp),dimension(maxhclass,nd,nRe_types) :: fc, rho_eff + real(wp),dimension(Re_MAX_BIN) :: base_list,step_list + + ! added by DPLRW + real(wp),dimension(maxhclass,mt_ntt,nRe_types) :: vf_scaled,vq_scaled,v3_scaled,v0_scaled,m3_scaled,m0_scaled + + end type radar_cfg + + ! ###################################################################################### + ! TYPE cosp_optical_inputs + ! ###################################################################################### + type cosp_optical_inputs + integer :: & + Npoints, & ! Number of gridpoints. + Ncolumns, & ! Number of columns. + Nlevels, & ! Number of levels. + Npart, & ! Number of cloud meteors for LIDAR simulators. + Nrefl, & ! Number of reflectances for PARASOL simulator + Ninst_rttov ! Number of RTTOV instruments + real(wp),pointer :: & + emis_grey => null() ! Greybody (spectrally flat) emissivity value for RTTOV + real(wp) :: & + emsfc_lw ! Surface emissivity @ 11micron + real(wp),allocatable,dimension(:,:,:) :: & + frac_out, & ! Cloud fraction + tau_067, & ! Optical depth @ 0.67micron + emiss_11, & ! Emissivity @ 11 micron + fracLiq, & ! Fraction of optical-depth due to liquid (MODIS) + asym, & ! Assymetry parameter @ 3.7micron (MODIS) + ss_alb, & ! Single-scattering albedo @ 3.7micron (MODIS) + betatot_calipso, & ! Lidar backscatter coefficient (calipso @ 532nm) + betatot_grLidar532, & ! Lidar backscatter coefficient (ground-lidar @ 532nm) + betatot_atlid, & ! Lidar backscatter coefficient (atlid @ 355nm) + betatot_ice_calipso, & ! Lidar backscatter coefficient ICE (calipso @ 532nm) + betatot_liq_calipso, & ! Lidar backscatter coefficient LIQUID (calipso @ 532nm) + tautot_calipso, & ! Lidar Optical thickness (calipso @ 532nm) + tautot_grLidar532, & ! Lidar Optical thickness (ground-lidar @ 532nm) + tautot_atlid, & ! Lidar Optical thickness (atlid @ 355nm) + tautot_ice_calipso, & ! Lidar Ice Optical thickness (calipso @ 532nm) + tautot_liq_calipso, & ! Lidar Liquid Optical thickness (calipso @ 532nm) + z_vol_cloudsat, & ! Effective reflectivity factor (mm^6/m^3) + kr_vol_cloudsat, & ! Attenuation coefficient hydro (dB/km) + g_vol_cloudsat ! Attenuation coefficient gases (dB/km) + real(wp),allocatable,dimension(:,:,:,:) :: & + vfall, vfsqu, zehyd, krhyd, & ! for DPLRW, each hydrometeor + vtrm3, vtrm0, mmnt3, mmnt0 + real(wp),allocatable,dimension(:,:) :: & + beta_mol_calipso, & ! Lidar molecular backscatter coefficient (calipso @ 532nm) + beta_mol_grLidar532, & ! Lidar molecular backscatter coefficient (ground-lidar @ 532nm) + beta_mol_atlid, & ! Lidar molecular backscatter coefficient (atlid @ 355nm) + tau_mol_calipso, & ! Lidar molecular optical depth (calipso @ 532nm) + tau_mol_grLidar532, & ! Lidar molecular optical depth (ground-lidar @ 532nm) + tau_mol_atlid, & ! Lidar molecular optical depth (atlid @ 355nm) + tautot_S_liq, & ! Parasol Liquid water optical thickness, from TOA to SFC + tautot_S_ice, & ! Parasol Ice water optical thickness, from TOA to SFC + fracPrecipIce ! Fraction of precipitation which is frozen (1). + type(radar_cfg) :: & + rcfg_cloudsat ! Radar configuration information (CLOUDSAT) + type(rttov_cfg),dimension(:),pointer :: & + cfg_rttov ! RTTOV configuration information (multiple instruments) + type(swath_inputs),dimension(6) :: & ! Could be a pointer but fine + cospswathsIN + end type cosp_optical_inputs + + +CONTAINS + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + !---------- SUBROUTINE COSP_CHANGE_VERTICAL_GRID ---------------- + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +SUBROUTINE COSP_CHANGE_VERTICAL_GRID(Npoints,Ncolumns,Nlevels,zfull,zhalf,y,Nglevels,newgrid_bot,newgrid_top,r,log_units) + implicit none + ! Input arguments + integer,intent(in) :: Npoints !# of grid points + integer,intent(in) :: Nlevels !# of levels + integer,intent(in) :: Ncolumns !# of columns + real(wp),dimension(Npoints,Nlevels),intent(in) :: zfull ! Height at model levels [m] (Bottom of model layer) + real(wp),dimension(Npoints,Nlevels),intent(in) :: zhalf ! Height at half model levels [m] (Bottom of model layer) + real(wp),dimension(Npoints,Ncolumns,Nlevels),intent(in) :: y ! Variable to be changed to a different grid + integer,intent(in) :: Nglevels !# levels in the new grid + real(wp),dimension(Nglevels),intent(in) :: newgrid_bot ! Lower boundary of new levels [m] + real(wp),dimension(Nglevels),intent(in) :: newgrid_top ! Upper boundary of new levels [m] + logical,optional,intent(in) :: log_units ! log units, need to convert to linear units + ! Output + real(wp),dimension(Npoints,Ncolumns,Nglevels),intent(out) :: r ! Variable on new grid + + ! Local variables + integer :: i,j,k + logical :: lunits + integer :: l + real(wp) :: w ! Weight + real(wp) :: dbb, dtb, dbt, dtt ! Distances between edges of both grids + integer :: Nw ! Number of weights + real(wp) :: wt ! Sum of weights + real(wp),dimension(Nlevels) :: oldgrid_bot,oldgrid_top ! Lower and upper boundaries of model grid + real(wp) :: yp ! Local copy of y at a particular point. + ! This allows for change of units. + + lunits=.false. + if (present(log_units)) lunits=log_units + + r = 0._wp + + do i=1,Npoints + ! Calculate tops and bottoms of new and old grids + oldgrid_bot = zhalf(i,:) + oldgrid_top(1:Nlevels-1) = oldgrid_bot(2:Nlevels) + oldgrid_top(Nlevels) = zfull(i,Nlevels) + zfull(i,Nlevels) - zhalf(i,Nlevels) ! Top level symmetric + l = 0 ! Index of level in the old grid + ! Loop over levels in the new grid + do k = 1,Nglevels + Nw = 0 ! Number of weigths + wt = 0._wp ! Sum of weights + ! Loop over levels in the old grid and accumulate total for weighted average + do + l = l + 1 + w = 0.0 ! Initialise weight to 0 + if (l > Nlevels) exit + ! Distances between edges of both grids + dbb = oldgrid_bot(l) - newgrid_bot(k) + dtb = oldgrid_top(l) - newgrid_bot(k) + dbt = oldgrid_bot(l) - newgrid_top(k) + dtt = oldgrid_top(l) - newgrid_top(k) + if (dbt >= 0.0) exit ! Do next level in the new grid + if (dtb > 0.0) then + if (dbb <= 0.0) then + if (dtt <= 0) then + w = dtb + else + w = newgrid_top(k) - newgrid_bot(k) + endif + else + if (dtt <= 0) then + w = oldgrid_top(l) - oldgrid_bot(l) + else + w = -dbt + endif + endif + ! If layers overlap (w/=0), then accumulate + if (w /= 0.0) then + Nw = Nw + 1 + wt = wt + w + do j=1,Ncolumns + if (lunits) then + if (y(i,j,l) /= R_UNDEF) then + yp = 10._wp**(y(i,j,l)/10._wp) + else + yp = 0._wp + endif + else + yp = y(i,j,l) + endif + r(i,j,k) = r(i,j,k) + w*yp + enddo + endif + endif + enddo + l = l - 2 + if (l < 1) l = 0 + ! Calculate average in new grid + if (Nw > 0) then + do j=1,Ncolumns + r(i,j,k) = r(i,j,k)/wt + enddo + endif + enddo + enddo + + ! Set points under surface to R_UNDEF, and change to dBZ if necessary + do k=1,Nglevels + do j=1,Ncolumns + do i=1,Npoints + if (newgrid_top(k) > zhalf(i,1)) then ! Level above model bottom level + if (lunits) then + if (r(i,j,k) <= 0.0) then + r(i,j,k) = R_UNDEF + else + r(i,j,k) = 10._wp*log10(r(i,j,k)) + endif + endif + else ! Level below surface + r(i,j,k) = R_GROUND + endif + enddo + enddo + enddo + +END SUBROUTINE COSP_CHANGE_VERTICAL_GRID + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + !------------- SUBROUTINE COSP_LIDAR_ONLY_CLOUD ----------------- + ! (c) 2008, Lawrence Livermore National Security Limited Liability Corporation. + ! All rights reserved. + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + SUBROUTINE COSP_LIDAR_ONLY_CLOUD(Npoints, Ncolumns, Nlevels, beta_tot, beta_mol, & + Ze_tot, lidar_only_freq_cloud, tcc, radar_tcc, radar_tcc2) + ! Inputs + integer,intent(in) :: & + Npoints, & ! Number of horizontal gridpoints + Ncolumns, & ! Number of subcolumns + Nlevels ! Number of vertical layers + real(wp),dimension(Npoints,Nlevels),intent(in) :: & + beta_mol ! Molecular backscatter + real(wp),dimension(Npoints,Ncolumns,Nlevels),intent(in) :: & + beta_tot, & ! Total backscattered signal + Ze_tot ! Radar reflectivity + ! Outputs + real(wp),dimension(Npoints,Nlevels),intent(out) :: & + lidar_only_freq_cloud + real(wp),dimension(Npoints),intent(out) ::& + tcc, & ! + radar_tcc, & ! + radar_tcc2 ! + + ! local variables + real(wp) :: sc_ratio + real(wp),parameter :: & + s_cld=5.0, & + s_att=0.01 + integer :: flag_sat,flag_cld,pr,i,j,flag_radarcld,flag_radarcld_no1km,j_1km + + lidar_only_freq_cloud = 0._wp + tcc = 0._wp + radar_tcc = 0._wp + radar_tcc2 = 0._wp + do pr=1,Npoints + do i=1,Ncolumns + flag_sat = 0 + flag_cld = 0 + flag_radarcld = 0 !+JEK + flag_radarcld_no1km=0 !+JEK + ! look for j_1km from bottom to top + j = 1 + do while (Ze_tot(pr,i,j) .eq. R_GROUND) + j = j+1 + enddo + j_1km = j+1 !this is the vertical index of 1km above surface + + do j=1,Nlevels + sc_ratio = beta_tot(pr,i,j)/beta_mol(pr,j) + if ((sc_ratio .le. s_att) .and. (flag_sat .eq. 0)) flag_sat = j + if (Ze_tot(pr,i,j) .lt. -30.) then !radar can't detect cloud + if ( (sc_ratio .gt. s_cld) .or. (flag_sat .eq. j) ) then !lidar sense cloud + lidar_only_freq_cloud(pr,j)=lidar_only_freq_cloud(pr,j)+1. !top->surf + flag_cld=1 + endif + else !radar sense cloud (z%Ze_tot(pr,i,j) .ge. -30.) + flag_cld=1 + flag_radarcld=1 + if (j .gt. j_1km) flag_radarcld_no1km=1 + endif + enddo !levels + if (flag_cld .eq. 1) tcc(pr)=tcc(pr)+1._wp + if (flag_radarcld .eq. 1) radar_tcc(pr)=radar_tcc(pr)+1. + if (flag_radarcld_no1km .eq. 1) radar_tcc2(pr)=radar_tcc2(pr)+1. + enddo !columns + enddo !points + lidar_only_freq_cloud=lidar_only_freq_cloud/Ncolumns + tcc=tcc/Ncolumns + radar_tcc=radar_tcc/Ncolumns + radar_tcc2=radar_tcc2/Ncolumns + + ! Unit conversion + where(lidar_only_freq_cloud /= R_UNDEF) & + lidar_only_freq_cloud = lidar_only_freq_cloud*100._wp + where(tcc /= R_UNDEF) tcc = tcc*100._wp + where(radar_tcc /= R_UNDEF) radar_tcc = radar_tcc*100._wp + where(radar_tcc2 /= R_UNDEF) radar_tcc2 = radar_tcc2*100._wp + + END SUBROUTINE COSP_LIDAR_ONLY_CLOUD + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + !----------------------- SUBROUTINE COSP_DIAG_WARMRAIN ------------------------ + ! (c) 2018, Research Institute for Applied Mechanics (RIAM), Kyushu Univ. + ! All rights reserved. + ! * Purpose: 1) Diagnose Contoured Frequency by Optical Depth Diagram (CFODD) + ! from CloudSat Radar and MODIS retrievals. + ! 2) Diagnose Warm-Rain Occurrence Frequency (nonprecip/drizzle/rain) + ! from CloudSat Radar. + ! * History: Jan 2018 (T.Michibata): Test run + ! May 2018 (T.Michibata): update for COSP2 + ! Sep 2018 (T.Michibata): modified I/O + ! Nov 2018 (T.Michibata): minor revisions + ! May 2020 (T.Michibata and X.Jing): bug-fix for frac_out dimsize + ! Apr 2022 (T.Michibata): bug-fix for non-sunlit columns + ! * References: Michibata et al. (GMD'19, doi:10.5194/gmd-12-4297-2019) + ! Michibata et al. (GRL'20, doi:10.1029/2020GL088340) + ! Suzuki et al. (JAS'10, doi:10.1175/2010JAS3463.1) + ! Suzuki et al. (JAS'15, doi:10.1175/JAS-D-14-0265.1) + ! Jing et al. (JCLIM'19, doi:10.1175/jcli-d-18-0789.1) + ! * Contact: Takuro Michibata (RIAM, Kyushu University, Japan). + ! E-mail: michibata@riam.kyushu-u.ac.jp + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + SUBROUTINE COSP_DIAG_WARMRAIN( Npoints, Ncolumns, Nlevels, & !! in + temp, zlev, & !! in + lwp, liqcot, liqreff, liqcfrc, & !! in + iwp, icecot, icereff, icecfrc, & !! in + fracout, dbze, & !! in + cfodd_ntotal, & !! inout + wr_occfreq_ntotal ) !! inout + + ! Inputs + integer, intent(in) :: & + Npoints, & ! Number of horizontal gridpoints + Ncolumns, & ! Number of subcolumns + Nlevels ! Number of vertical layers + real(wp), dimension(Npoints), intent(in) :: & + lwp, & ! MODIS LWP [kg m-2] + liqcot, & ! MODIS liq. COT + liqreff, & ! MODIS liq. Reff [m] + liqcfrc ! MODIS liq. cloud fraction + real(wp), dimension(Npoints), intent(in) :: & + iwp, & ! MODIS IWP [kg m-2] + icecot, & ! MODIS ice COT + icereff, & ! MODIS ice Reff [m] + icecfrc ! MODIS ice cloud fraction + real(wp), dimension(Npoints,Nlevels), intent(in) :: & + zlev ! altitude [m] for model level + real(wp), dimension(Npoints,1,Nlevels),intent(in) :: & + temp ! temperature [K] + real(wp), dimension(Npoints,Ncolumns,Nlevels),intent(in) :: & + fracout, & ! SCOPS subcolumn retrieval + dbze ! Radar reflectivity [dBZe] + + ! Outputs + real(wp),dimension(Npoints,CFODD_NDBZE,CFODD_NICOD,CFODD_NCLASS),intent(inout) :: & + cfodd_ntotal ! # of CFODD samples for each ICOD/dBZe bin + real(wp),dimension(Npoints,WR_NREGIME),intent(inout) :: & + wr_occfreq_ntotal ! # of SLWC samples + + ! Local variables + integer :: i, j, k + integer :: kctop, kcbtm + integer :: icls + integer :: iregime + real(wp) :: cmxdbz + real(wp) :: diagcgt !! diagnosed cloud geometric thickness [m] + real(wp) :: diagicod !! diagnosed in-cloud optical depth + real(wp) :: cbtmh !! diagnosed in-cloud optical depth + real(wp), dimension(Npoints,Ncolumns,Nlevels) :: icod !! in-cloud optical depth (ICOD) + logical :: octop, ocbtm, oslwc + integer, dimension(Npoints,Ncolumns,Nlevels) :: fracout_int !! fracout (decimal to integer) + fracout_int(:,:,:) = 0 + where ((fracout(:,:,:) .ge. 0.5_wp) .and. (fracout(:,:,:) .lt. 1.5_wp )) fracout_int(:,:,:) = 1 + where ((fracout(:,:,:) .ge. 1.5_wp) .and. (fracout(:,:,:) .lt. 2.5_wp )) fracout_int(:,:,:) = 2 + !! initialize + do i = 1, Npoints + if ( lwp(i) .eq. R_UNDEF ) then ! for non-sunlit columns + cfodd_ntotal(i,:,:,:) = R_UNDEF + wr_occfreq_ntotal(i,:) = R_UNDEF + icod(i,:,:) = R_UNDEF + else + cfodd_ntotal(i,:,:,:) = 0._wp + wr_occfreq_ntotal(i,:) = 0._wp + icod(i,:,:) = 0._wp + endif + enddo + + do i = 1, Npoints + !! check by MODIS retrieval + if ( ( lwp(i) .le. CWP_THRESHOLD .and. lwp(i) .ne. R_UNDEF ) .or. & + & liqcot(i) .le. COT_THRESHOLD .or. & + & liqreff(i) .lt. CFODD_BNDRE(1) .or. & + & liqreff(i) .gt. CFODD_BNDRE(4) .or. & + & iwp(i) .gt. CWP_THRESHOLD .or. & !! exclude ice cloud + & icecot(i) .gt. COT_THRESHOLD .or. & !! exclude ice cloud + & icereff(i) .gt. CFODD_BNDRE(1) ) then !! exclude ice cloud + cycle + else + !! retrieve the CFODD array based on Reff + icls = 0 + if ( liqreff(i) .ge. CFODD_BNDRE(1) .and. liqreff(i) .lt. CFODD_BNDRE(2) ) then + icls = 1 + elseif( liqreff(i) .ge. CFODD_BNDRE(2) .and. liqreff(i) .lt. CFODD_BNDRE(3) ) then + icls = 2 + elseif( liqreff(i) .ge. CFODD_BNDRE(3) .and. liqreff(i) .le. CFODD_BNDRE(4) ) then + icls = 3 + endif + endif + + !CDIR NOLOOPCHG + do j = 1, Ncolumns, 1 + octop = .true. !! initialize + ocbtm = .true. !! initialize + kcbtm = 0 !! initialize + kctop = 0 !! initialize + !CDIR NOLOOPCHG + do k = Nlevels, 1, -1 !! scan from cloud-bottom to cloud-top + if ( dbze(i,j,k) .eq. R_GROUND .or. & + dbze(i,j,k) .eq. R_UNDEF ) cycle + if ( ocbtm .and. & + & fracout_int(i,j,k) .ne. SGCLD_CLR .and. & + & dbze(i,j,k) .ge. CFODD_DBZE_MIN ) then + ocbtm = .false. !! cloud bottom detected + kcbtm = k + kctop = k + endif + if ( octop .and. & !! scan cloud-top + & .not. ocbtm .and. & !! cloud-bottom already detected + & fracout_int(i,j,k) .ne. SGCLD_CLR .and. & !! exclude clear sky + & dbze(i,j,k) .ge. CFODD_DBZE_MIN ) then + kctop = k !! update + endif + enddo !! k loop + if( ocbtm ) cycle !! cloud wasn't detected in this subcolumn + !! check SLWC? + if( temp(i,1,kctop) .lt. tmelt ) cycle !! return to the j (subcolumn) loop + oslwc = .true. + cmxdbz = CFODD_DBZE_MIN !! initialized + + !CDIR NOLOOPCHG + do k = kcbtm, kctop, -1 + cmxdbz = max( cmxdbz, dbze(i,j,k) ) !! column maximum dBZe update + if ( fracout_int(i,j,k) .eq. SGCLD_CLR .or. & + & fracout_int(i,j,k) .eq. SGCLD_CUM .or. & + & dbze (i,j,k) .lt. CFODD_DBZE_MIN ) then + oslwc = .false. + endif + enddo + if ( .not. oslwc ) cycle !! return to the j (subcolumn) loop + + !! warm-rain occurrence frequency + iregime = 0 + if( cmxdbz .lt. CFODD_BNDZE(1) ) then + iregime = 1 !! non-precipitating + elseif( cmxdbz .ge. CFODD_BNDZE(1) .and. cmxdbz .lt. CFODD_BNDZE(2) ) then + iregime = 2 !! drizzling + elseif( cmxdbz .ge. CFODD_BNDZE(2) ) then + iregime = 3 !! raining + endif + wr_occfreq_ntotal(i,iregime) = wr_occfreq_ntotal(i,iregime) + 1._wp + + !! retrievals of ICOD and dBZe bin for CFODD plane + diagcgt = zlev(i,kctop) - zlev(i,kcbtm) + cbtmh = zlev(i,kcbtm) + !CDIR NOLOOPCHG + do k = kcbtm, kctop, -1 + if( k .eq. kcbtm ) then + diagicod = liqcot(i) + else + diagicod = liqcot(i) * ( 1._wp - ( (zlev(i,k)-cbtmh)/diagcgt)**(5._wp/3._wp) ) + endif + icod(i,j,k) = min( diagicod, CFODD_ICOD_MAX ) + enddo + + enddo ! j (Ncolumns) + + !! # of samples for CFODD (joint 2d-histogram dBZe vs ICOD) + call hist2d( dbze(i,1:Ncolumns,1:Nlevels), icod(i,1:Ncolumns,1:Nlevels), & + & Ncolumns*Nlevels, & + & CFODD_HISTDBZE, CFODD_NDBZE, CFODD_HISTICOD, CFODD_NICOD, & + & cfodd_ntotal( i, 1:CFODD_NDBZE, 1:CFODD_NICOD, icls ) ) + + enddo ! i (Npoints) + + RETURN + END SUBROUTINE COSP_DIAG_WARMRAIN + + ! ###################################################################################### + ! FUNCTION hist1D + ! ###################################################################################### + function hist1d(Npoints,var,nbins,bins) + ! Inputs + integer,intent(in) :: & + Npoints, & ! Number of points in input array + Nbins ! Number of bins for sorting + real(wp),intent(in),dimension(Npoints) :: & + var ! Input variable to be sorted + real(wp),intent(in),dimension(Nbins+1) :: & + bins ! Histogram bins [lowest,binTops] + ! Outputs + real(wp),dimension(Nbins) :: & + hist1d ! Output histogram + ! Local variables + integer :: ij + + do ij=2,Nbins+1 + hist1D(ij-1) = count(var .ge. bins(ij-1) .and. var .lt. bins(ij)) + if (count(var .eq. R_GROUND) .ge. 1) hist1D(ij-1)=R_UNDEF + enddo + + end function hist1D + + ! ###################################################################################### + ! SUBROUTINE hist2D + ! ###################################################################################### + subroutine hist2D(var1,var2,npts,bin1,nbin1,bin2,nbin2,jointHist) + implicit none + + ! INPUTS + integer, intent(in) :: & + npts, & ! Number of data points to be sorted + nbin1, & ! Number of bins in histogram direction 1 + nbin2 ! Number of bins in histogram direction 2 + real(wp),intent(in),dimension(npts) :: & + var1, & ! Variable 1 to be sorted into bins + var2 ! variable 2 to be sorted into bins + real(wp),intent(in),dimension(nbin1+1) :: & + bin1 ! Histogram bin 1 boundaries + real(wp),intent(in),dimension(nbin2+1) :: & + bin2 ! Histogram bin 2 boundaries + ! OUTPUTS + real(wp),intent(out),dimension(nbin1,nbin2) :: & + jointHist + + ! LOCAL VARIABLES + integer :: ij,ik + + do ij=2,nbin1+1 + do ik=2,nbin2+1 + jointHist(ij-1,ik-1)=count(var1 .ge. bin1(ij-1) .and. var1 .lt. bin1(ij) .and. & + var2 .ge. bin2(ik-1) .and. var2 .lt. bin2(ik)) + enddo + enddo + end subroutine hist2D + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE cosp_cleanUp + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + subroutine cosp_cleanUp() + deallocate(vgrid_zl,vgrid_zu,vgrid_z,dz) + end subroutine cosp_cleanUp + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE compute_orbitmasks + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + subroutine compute_orbitmasks(Npoints,Nlocaltimes,localtimes,localtime_widths, & + lat,lon,month,day,hour,minute,swath_mask_out,Nswathed_out) + + ! Inputs + integer,intent(in) :: & + Npoints, & + Nlocaltimes + + real(wp),dimension(Nlocaltimes),intent(in) :: & + localtimes, & + localtime_widths + + real(wp),dimension(Npoints),intent(in) :: & + lat, & + lon, & + month, & + day, & + hour, & + minute + + ! Output + logical,dimension(Npoints),intent(out) :: & + swath_mask_out ! Mask of reals over all gridcells + integer,intent(out) :: & + Nswathed_out + + ! Local variables + integer :: i ! iterator + + real(wp),dimension(Npoints,Nlocaltimes) :: & + sat_lon, & ! Central longitude of the instrument. + dlon, & ! distance to satellite longitude in degrees + dx ! distance to satellite longitude in km? + + logical,dimension(Npoints,Nlocaltimes) :: & + swath_mask_all ! Mask of logicals over all local times, gridcells + + integer, dimension(Npoints) :: & + rttov_DOY ! Array of day of year values + real(wp), dimension(Npoints) :: & + localtime_offsets ! Offset values to avoid striping with hourly RT calls. [hours] + ! Compute the day of the year and determine the localtime offset + do i=1,Npoints + call get_DOY(int(month(i)), int(day(i)), rttov_DOY(i)) + end do + localtime_offsets = (mod(rttov_DOY(:), 5) - 2) / 5.0 ! Need to cast to real + + ! Iterate over local times + swath_mask_all(:,:) = .false. + do i=1,Nlocaltimes + ! Calculate the central longitude for each gridcell and orbit + sat_lon(:,i) = 15.0 * (localtimes(i) + localtime_offsets - (hour + minute / 60)) + ! Calculate distance (in degrees) from each grid cell to the satellite central long + dlon(:,i) = mod((lon - sat_lon(:,i) + 180.0), 360.0) - 180.0 + ! calculate distance to satellite in km. Remember to convert to radians for cos/sine calls + dx(:,i) = dlon(:,i) * (pi/180.0) * COS(lat * pi / 180) * radius_earth + ! Determine if a gridcell falls in the swath width + where (abs(dx(:,i))<(localtime_widths(i)*0.5)) + swath_mask_all(:,i) = .true. + end where + end do + + ! Mask is true where values should be calculated + swath_mask_out = ANY( swath_mask_all(:,:),2) ! Compute mask by collapsing the localtimes dimension + Nswathed_out = count(swath_mask_out) ! Number of gridcells that should be calculated. + + end subroutine compute_orbitmasks + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE get_DOY + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + subroutine get_DOY(month, day, DOY) + + integer,intent(in) :: & + month, & + day + integer,intent(out) :: & + DOY + + ! This subroutine does not handle leap years because it is not relevant to the purpose. + ! Simple look-up table for DOY. + if (month .eq. 1) DOY = day + if (month .eq. 2) DOY = 31 + day + if (month .eq. 3) DOY = 59 + day + if (month .eq. 4) DOY = 90 + day + if (month .eq. 5) DOY = 120 + day + if (month .eq. 6) DOY = 151 + day + if (month .eq. 7) DOY = 181 + day + if (month .eq. 8) DOY = 212 + day + if (month .eq. 9) DOY = 243 + day + if (month .eq. 10) DOY = 273 + day + if (month .eq. 11) DOY = 304 + day + if (month .eq. 12) DOY = 334 + day + + end subroutine get_DOY + +END MODULE MOD_COSP_STATS diff --git a/dplrw_src/cosp_utils.F90 b/dplrw_src/cosp_utils.F90 new file mode 100755 index 0000000000..467b317a0b --- /dev/null +++ b/dplrw_src/cosp_utils.F90 @@ -0,0 +1,190 @@ +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +! Copyright (c) 2015, Regents of the University of Colorado +! All rights reserved. +! +! Redistribution and use in source and binary forms, with or without modification, are +! permitted provided that the following conditions are met: +! +! 1. Redistributions of source code must retain the above copyright notice, this list of +! conditions and the following disclaimer. +! +! 2. Redistributions in binary form must reproduce the above copyright notice, this list +! of conditions and the following disclaimer in the documentation and/or other +! materials provided with the distribution. +! +! 3. Neither the name of the copyright holder nor the names of its contributors may be +! used to endorse or promote products derived from this software without specific prior +! written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +! +! History: +! Jul 2007 - A. Bodas-Salcedo - Initial version +! May 2015 - Dustin Swales - Modified for COSPv2.0 +! +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +MODULE MOD_COSP_UTILS + USE COSP_KINDS, ONLY: wp + USE MOD_COSP_CONFIG + USE mod_quickbeam_optics, only: size_distribution + use mod_cosp_error, only: errorMessage + IMPLICIT NONE + +CONTAINS +!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +!------------------- SUBROUTINE COSP_PRECIP_MXRATIO -------------- +!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +! SUBROUTINE COSP_PRECIP_MXRATIO(Npoints,Nlevels,Ncolumns,p,T,prec_frac,prec_type, & +! n_ax,n_bx,alpha_x,c_x,d_x,g_x,a_x,b_x,gamma1,gamma2,gamma3,gamma4, & +! flux,mxratio,reff) + +! ! Input arguments, (IN) +! integer,intent(in) :: Npoints,Nlevels,Ncolumns +! real(wp),intent(in),dimension(Npoints,Nlevels) :: p,T,flux +! real(wp),intent(in),dimension(Npoints,Ncolumns,Nlevels) :: prec_frac +! real(wp),intent(in) :: n_ax,n_bx,alpha_x,c_x,d_x,g_x,a_x,b_x,gamma1,gamma2,gamma3,gamma4,prec_type +! ! Input arguments, (OUT) +! real(wp),intent(out),dimension(Npoints,Ncolumns,Nlevels) :: mxratio +! real(wp),intent(inout),dimension(Npoints,Ncolumns,Nlevels) :: reff +! ! Local variables +! integer :: i,j,k +! real(wp) :: sigma,one_over_xip1,xi,rho0,rho,lambda_x,gamma_4_3_2,delta + +! mxratio = 0.0 + +! if (n_ax >= 0.0) then ! N_ax is used to control which hydrometeors need to be computed +! xi = d_x/(alpha_x + b_x - n_bx + 1._wp) +! rho0 = 1.29_wp +! sigma = (gamma2/(gamma1*c_x))*(n_ax*a_x*gamma2)**xi +! one_over_xip1 = 1._wp/(xi + 1._wp) +! gamma_4_3_2 = 0.5_wp*gamma4/gamma3 +! delta = (alpha_x + b_x + d_x - n_bx + 1._wp) +! do k=1,Nlevels +! do j=1,Ncolumns +! do i=1,Npoints +! if ((prec_frac(i,j,k)==prec_type).or.(prec_frac(i,j,k)==3.)) then +! rho = p(i,k)/(287.05_wp*T(i,k)) +! mxratio(i,j,k)=(flux(i,k)*((rho/rho0)**g_x)*sigma)**one_over_xip1 +! mxratio(i,j,k)=mxratio(i,j,k)/rho +! ! Compute effective radius +! if ((reff(i,j,k) <= 0._wp).and.(flux(i,k) /= 0._wp)) then +! lambda_x = (a_x*c_x*((rho0/rho)**g_x)*n_ax*gamma1/flux(i,k))**(1._wp/delta) +! reff(i,j,k) = gamma_4_3_2/lambda_x +! endif +! endif +! enddo +! enddo +! enddo +! endif +! END SUBROUTINE COSP_PRECIP_MXRATIO + + SUBROUTINE COSP_PRECIP_MXRATIO(Npoints,Nlevels,Ncolumns, & + p,T,prec_frac,prec_type, index, sd, & + flux, mxratio, reff) + ! Input arguments, (IN) + integer,intent(in) :: Npoints,Nlevels,Ncolumns,index + real(wp),intent(in),dimension(Npoints,Nlevels) :: p,T,flux + real(wp),intent(in),dimension(Npoints,Ncolumns,Nlevels) :: prec_frac + real(wp),intent(in) :: prec_type + type(size_distribution),intent(in) :: sd + ! Input arguments, (OUT) + real(wp),intent(out),dimension(Npoints,Ncolumns,Nlevels) :: mxratio + real(wp),intent(inout),dimension(Npoints,Ncolumns,Nlevels) :: reff + ! Local variables + real(wp) :: pi = 3.14159265358979323846264338327950288419717_wp + integer :: i,j,k + real(wp) :: sigma,one_over_xip1,xi,rho0,rho,lambda_x,gamma_4_3_2,delta + real(wp) :: apm,bpm,mu,D0,Dm ! modified gamma DSD + real(wp) :: lambda,N0 ! exponential DSD + real(wp) :: avf,bvf,vscs_fct ! fall velocity params + + !!! single-moment bulk microphysics is assumed !!! + + if (sd%apm(index) > 0) then + apm = sd%apm(index) + bpm = sd%bpm(index) + else if (sd%rho(index) > 0) then + apm = sd%rho(index)*pi/6._wp + bpm = 3._wp + else + call errorMessage('!!! unexpected sd, at COSP_PRECIP_MXRATIO !!!') + end if + + ! fall velocity params + select case(sd%ftype(index)) + case(1) + ! vf = a * D**b + avf = sd%f1(index) + bvf = sd%f2(index) + case(2) + ! PL08 formulation + call errorMessage('!!! not implemented yet, PL08 formulation, at COSP_PRECIP_MXRATIO') + end select + + ! size distribution params + select case(sd%dtype(index)) + case(1) + Dm = sd%p2(index) + mu = sd%p3(index) + if (Dm < 0 .or. mu < 0) then + call errorMessage('!!! mod.gamma DSD requires mean D and mu, at COSP_PRECIP_MXRATIO') + end if + case(2) + N0 = sd%p1(index) + if (N0 < 0) then + call errorMessage('!!! exp. DSD requires N0, at COSP_PRECIP_MXRATIO') + end if + case default + call errorMessage('!!! not implemented yet, sd%dtype=3,4,5, at COSP_PRECIP_MXRATIO') + end select + + do k=1,Nlevels + do j=1,Ncolumns + do i=1,Npoints + if ((prec_frac(i,j,k)/=prec_type).and.(prec_frac(i,j,k)/=3.)) cycle + rho0 = 1.29_wp + rho = p(i,k)/(287.05_wp*T(i,k)) + vscs_fct = merge(sqrt(rho0/rho),1._wp,sd%fvscs(index)==1) + + select case(sd%dtype(index)) + case(1) ! modified gamma + if (flux(i,k) > 1.D-20) then + D0 = Dm*gamma(mu)/gamma(mu+1._wp) * 1.D-6 ! um -> m + mxratio(i,j,k) = flux(i,k)/vscs_fct/avf/D0**bvf * gamma(mu+bpm)/gamma(mu+bvf+bpm) / rho + if (reff(i,j,k) < 1.D-20) then + reff(i,j,k) = D0/2._wp*gamma(mu+3._wp)/gamma(mu+2._wp) + end if + else + mxratio(i,j,k) = 0._wp ; reff(i,j,k) = 0._wp + end if + + case(2) ! exponential + if (flux(i,k) > 1.D-20) then + lambda = (vscs_fct*apm*avf*N0*gamma(1._wp+bpm+bvf)/flux(i,k))**(1._wp/(1._wp+bpm+bvf)) + mxratio(i,j,k) = flux(i,k)/vscs_fct/avf*lambda**bvf*gamma(1._wp+bpm)/gamma(1._wp+bpm+bvf) + if (reff(i,j,k) < 1.D-20) then + reff(i,j,k) = 0.5_wp/lambda*gamma(4._wp)/gamma(3._wp) + end if + else + mxratio(i,j,k) = 0._wp ; reff(i,j,k) = 0._wp + end if + + case default + call errorMessage('!!! not implemented yet, sd%dtype=3,4,5, at COSP_PRECIP_MXRATIO') + end select + + end do + end do + end do + + END SUBROUTINE COSP_PRECIP_MXRATIO + +END MODULE MOD_COSP_UTILS diff --git a/dplrw_src/quickbeam.F90 b/dplrw_src/quickbeam.F90 new file mode 100644 index 0000000000..50a67e0829 --- /dev/null +++ b/dplrw_src/quickbeam.F90 @@ -0,0 +1,971 @@ +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +! Copyright (c) 2015, Regents of the University of Colorado +! All rights reserved. +! +! Redistribution and use in source and binary forms, with or without modification, are +! permitted provided that the following conditions are met: +! +! 1. Redistributions of source code must retain the above copyright notice, this list of +! conditions and the following disclaimer. +! +! 2. Redistributions in binary form must reproduce the above copyright notice, this list +! of conditions and the following disclaimer in the documentation and/or other +! materials provided with the distribution. +! +! 3. Neither the name of the copyright holder nor the names of its contributors may be +! used to endorse or promote products derived from this software without specific prior +! written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +! +! History +! 11/2005: John Haynes - Created +! 09/2006 placed into subroutine form (Roger Marchand,JMH) +! 08/2007 added equivalent volume spheres, Z and N scalling most distrubtion types (Roger Marchand) +! 01/2008 'Do while' to determine if hydrometeor(s) present in volume +! changed for vectorization purposes (A. Bodas-Salcedo) +! +! 07/2010 V3.0 ... Modified to load or save scale factors to disk as a Look-Up Table (LUT) +! ... All hydrometeor and radar simulator properties now included in hp structure +! ... hp structure should be initialized by call to radar_simulator_init prior +! ... to calling this subroutine. +! Also ... Support of Morrison 2-moment style microphyscis (Np_matrix) added +! ... Changes implement by Roj Marchand following work by Laura Fowler +! +! 10/2011 Modified ngate loop to go in either direction depending on flag +! hp%radar_at_layer_one. This affects the direction in which attenuation is summed. +! +! Also removed called to AVINT for gas and hydrometeor attenuation and replaced with simple +! summation. (Roger Marchand) +! May 2015 - D. Swales - Modified for COSPv2.0 +! Jun 2025 - J.K. Shaw - Parameters and DDT moved to cosp_stats.F90 for interface swathing +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +module quickbeam + USE COSP_KINDS, ONLY: wp + USE MOD_COSP_CONFIG, ONLY: R_UNDEF,cloudsat_histRef,use_vgrid,vgrid_zl,vgrid_zu,& + pClass_noPrecip, pClass_Rain1, pClass_Rain2, pClass_Rain3,& + pClass_Snow1, pClass_Snow2, pClass_Mixed1, pClass_Mixed2, & + pClass_Rain4, pClass_default, Zenonbinval, Zbinvallnd, & + N_HYDRO,nCloudsatPrecipClass,cloudsat_preclvl + + USE MOD_COSP_STATS, ONLY: COSP_LIDAR_ONLY_CLOUD,hist1D,COSP_CHANGE_VERTICAL_GRID, & + maxhclass,nRe_types,nd,mt_ntt,Re_BIN_LENGTH,Re_MAX_BIN, & + dmin,dmax,radar_cfg + implicit none + +contains + ! ###################################################################################### + ! SUBROUTINE quickbeam_subcolumn + ! ###################################################################################### + subroutine quickbeam_subcolumn(rcfg,nprof,ngate,hgt_matrix,z_vol,kr_vol,g_vol,dBZe,Ze_non) + + ! INPUTS + type(radar_cfg),intent(inout) :: & + rcfg ! Derived type for radar simulator setup + integer,intent(in) :: & + nprof, & ! Number of hydrometeor profiles + ngate ! Number of vertical layers + real(wp),intent(in),dimension(nprof,ngate) :: & + hgt_matrix, & ! Height of hydrometeors (km) + z_vol, & ! Effective reflectivity factor (mm^6/m^3) + kr_vol, & ! Attenuation coefficient hydro (dB/km) + g_vol ! Attenuation coefficient gases (dB/km) + + ! OUTPUTS + real(wp), intent(out),dimension(nprof,ngate) :: & + Ze_non, & ! Radar reflectivity without attenuation (dBZ) + dBZe ! Effective radar reflectivity factor (dBZ) + + ! LOCAL VARIABLES + integer :: k,pr,start_gate,end_gate,d_gate + real(wp),dimension(nprof,ngate) :: & + g_to_vol, & ! Gaseous atteunation, radar to vol (dB) + a_to_vol ! Hydromets attenuation, radar to vol (dB) + + ! Load scaling matricies from disk -- but only the first time this subroutine is called + if(rcfg%load_scale_LUTs) then + call load_scale_LUTs(rcfg) + rcfg%load_scale_LUTs=.false. + rcfg%Z_scale_added_flag = .false. ! will be set true if scaling Look Up Tables are modified during run + endif + + ! Initialization + g_to_vol = 0._wp + a_to_vol = 0._wp + + ! Loop over each range gate (ngate) ... starting with layer closest to the radar ! + if(rcfg%radar_at_layer_one) then + start_gate = 1 + end_gate = ngate + d_gate = 1 + else + start_gate = ngate + end_gate = 1 + d_gate = -1 + endif + do k=start_gate,end_gate,d_gate + ! Loop over each profile (nprof) + do pr=1,nprof + ! Attenuation due to hydrometeors between radar and volume + + ! NOTE old scheme integrates attenuation only for the layers ABOVE + ! the current layer ... i.e. 1 to k-1 rather than 1 to k ... + ! which may be a problem. ROJ + ! in the new scheme I assign half the attenuation to the current layer + if(d_gate==1) then + ! dheight calcuations assumes hgt_matrix points are the cell mid-points. + if (k>2) then + ! add to previous value to half of above layer + half of current layer + a_to_vol(pr,k)= a_to_vol(pr,k-1) + & + (kr_vol(pr,k-1)+kr_vol(pr,k))*(hgt_matrix(pr,k-1)-hgt_matrix(pr,k)) + else + a_to_vol(pr,k)= kr_vol(pr,k)*(hgt_matrix(pr,k)-hgt_matrix(pr,k+1)) + endif + else ! d_gate==-1 + if(k1) then + ! Add to previous value to half of above layer + half of current layer + g_to_vol(pr,k) = g_to_vol(pr,k-1) + & + 0.5*(g_vol(pr,k-1)+g_vol(pr,k))*(hgt_matrix(pr,k-1)-hgt_matrix(pr,k)) + else + g_to_vol(pr,k)= 0.5_wp*g_vol(pr,k)*(hgt_matrix(pr,k)-hgt_matrix(pr,k+1)) + endif + else ! d_gate==-1 + if (k 0._wp) + Ze_non(1:nprof,1:ngate) = 10._wp*log10(z_vol(1:nprof,1:ngate)) + dBZe(1:nprof,1:ngate) = Ze_non(1:nprof,1:ngate)-a_to_vol(1:nprof,1:ngate)-g_to_vol(1:nprof,1:ngate) + elsewhere + dBZe(1:nprof,1:ngate) = R_UNDEF + Ze_non(1:nprof,1:ngate) = R_UNDEF + end where + + ! Save any updates made + if (rcfg%update_scale_LUTs) call save_scale_LUTs(rcfg) + + end subroutine quickbeam_subcolumn + ! ###################################################################################### + ! SUBROUTINE quickbeam_column + ! ###################################################################################### + subroutine quickbeam_column(npoints, ncolumns, nlevels, llm, DBZE_BINS, platform, & + Ze_tot, Ze_tot_non, land, surfelev, t2m, fracPrecipIce, zlev, zlev_half, cfad_ze, & + cloudsat_precip_cover, cloudsat_pia) + ! Inputs + integer,intent(in) :: & + npoints, & ! Number of horizontal grid points + ncolumns, & ! Number of subcolumns + nlevels, & ! Number of vertical layers in OLD grid + llm, & ! Number of vertical layers in NEW grid + DBZE_BINS ! Number of bins for cfad. + character(len=*),intent(in) :: & + platform ! Name of platform (e.g. cloudsat) + real(wp),dimension(Npoints),intent(in) :: & + land, & ! Land/Sea mask. (1/0) + surfelev, & ! Surface Elevation (m) + t2m ! Near-surface temperature + real(wp),dimension(Npoints,Ncolumns),intent(in) :: & + fracPrecipIce ! Fraction of precipitation which is frozen. (1) + real(wp),intent(in),dimension(npoints,ncolumns,Nlevels) :: & + Ze_tot, & ! Effective reflectivity factor (dBZ) + Ze_tot_non ! Effective reflectivity factor w/o attenuation (dBZ) + real(wp),intent(in),dimension(npoints,Nlevels) :: & + zlev ! Model full levels + real(wp),intent(in),dimension(npoints,Nlevels) :: & + zlev_half ! Model half levels + + ! Outputs + real(wp),intent(inout),dimension(npoints,DBZE_BINS,llm) :: & + cfad_ze ! + real(wp),dimension(Npoints,nCloudsatPrecipClass),intent(out) :: & + cloudsat_precip_cover ! Model precip rate in by CloudSat precip flag + real(wp),dimension(Npoints),intent(out) :: & + cloudsat_pia ! Cloudsat path integrated attenuation + + ! Local variables + integer :: i,j + real(wp) :: zstep + real(wp),dimension(npoints,ncolumns,llm) :: ze_toti,ze_noni + logical :: lcloudsat = .false. + + ! Which platforms to create diagnostics for? + if (platform .eq. 'cloudsat') lcloudsat=.true. + + ! Create Cloudsat diagnostics. + if (lcloudsat) then + cloudsat_precip_cover = 0._wp + cloudsat_pia = 0._wp + if (use_vgrid) then + ! Regrid in the vertical (*NOTE* This routine requires SFC-2-TOA ordering, so flip + ! inputs and outputs to maintain TOA-2-SFC ordering convention in COSP2.) + call cosp_change_vertical_grid(Npoints,Ncolumns,Nlevels,zlev(:,nlevels:1:-1),& + zlev_half(:,nlevels:1:-1),Ze_tot(:,:,nlevels:1:-1),llm,vgrid_zl(llm:1:-1),& + vgrid_zu(llm:1:-1),Ze_toti(:,:,llm:1:-1),log_units=.true.) + + ! Effective reflectivity histogram + do i=1,Npoints + do j=1,llm + cfad_ze(i,:,j) = hist1D(Ncolumns,Ze_toti(i,:,j),DBZE_BINS,cloudsat_histRef) + enddo + enddo + where(cfad_ze .ne. R_UNDEF) cfad_ze = cfad_ze/Ncolumns + + ! Compute cloudsat near-surface precipitation diagnostics + ! First, regrid in the vertical Ze_tot_non. + call cosp_change_vertical_grid(Npoints,Ncolumns,Nlevels,zlev(:,nlevels:1:-1),& + zlev_half(:,nlevels:1:-1),Ze_tot_non(:,:,nlevels:1:-1),llm,vgrid_zl(llm:1:-1),& + vgrid_zu(llm:1:-1),Ze_noni(:,:,llm:1:-1),log_units=.true.) + ! Compute the zstep distance between two atmopsheric layers + zstep = vgrid_zl(1)-vgrid_zl(2) + ! Now call routine to generate diagnostics. + call cloudsat_precipOccurence(Npoints, Ncolumns, llm, N_HYDRO, Ze_toti, Ze_noni, & + land, surfelev, t2m, fracPrecipIce, cloudsat_precip_cover, cloudsat_pia, zstep) + else + ! Effective reflectivity histogram + do i=1,Npoints + do j=1,llm + cfad_ze(i,:,j) = hist1D(Ncolumns,Ze_tot(i,:,j),DBZE_BINS,cloudsat_histRef) + enddo + enddo + where(cfad_ze .ne. R_UNDEF) cfad_ze = cfad_ze/Ncolumns + endif + endif + + end subroutine quickbeam_column + ! ############################################################################################## + ! ############################################################################################## + ! ###################################################################################### + ! SUBROUTINE cloudsat_precipOccurence + ! + ! Notes from July 2016: Add precip flag also looped over subcolumns + ! Modified by Tristan L'Ecuyer (TSL) to add precipitation flagging + ! based on CloudSat's 2C-PRECIP-COLUMN algorithm (Haynes et al, JGR, 2009). + ! To mimic the satellite algorithm, this code applies thresholds to non-attenuated + ! reflectivities, Ze_non, consistent with those outlined in Haynes et al, JGR (2009). + ! + ! Procedures/Notes: + ! + ! (1) If the 2-way attenuation exceeds 40 dB, the pixel will be flagged as 'heavy rain' + ! consistent with the multiple-scattering analysis of Battaglia et al, JGR (2008). + ! (2) Rain, snow, and mixed precipitation scenes are separated according to the fraction + ! of the total precipitation hydrometeor mixing ratio that exists as ice. + ! (3) The entire analysis is applied to the range gate from 480-960 m to be consistent with + ! CloudSat's 720 m ground-clutter. + ! (4) Only a single flag is assigned to each model grid since there is no variation in + ! hydrometeor contents across a single model level. Unlike CFADs, whose variation enters + ! due to differening attenuation corrections from hydrometeors aloft, the non-attenuated + ! reflectivities used in the computation of this flag cannot vary across sub-columns. + ! + ! radar_prec_flag = 1-Rain possible 2-Rain probable 3-Rain certain + ! 4-Snow possible 5-Snow certain + ! 6-Mixed possible 7-Mixed certain + ! 8-Heavy Rain + ! 9- default value + ! + ! Modified by Dustin Swales (University of Colorado) for use with COSP2. + ! *NOTE* All inputs (Ze_out, Ze_non_out, fracPrecipIce) are at a single level from the + ! statistical output grid used by Cloudsat. This level is controlled by the + ! parameter cloudsat_preclvl, defined in src/cosp_config.F90 + ! ###################################################################################### + subroutine cloudsat_precipOccurence(Npoints, Ncolumns, llm, Nhydro, Ze_out, Ze_non_out, & + land, surfelev, t2m, fracPrecipIce, cloudsat_precip_cover, cloudsat_pia, zstep) + + ! Inputs + integer,intent(in) :: & + Npoints, & ! Number of columns + Ncolumns, & ! Numner of subcolumns + Nhydro, & ! Number of hydrometeor types + llm ! Number of levels + real(wp),dimension(Npoints),intent(in) :: & + land, & ! Land/Sea mask. (1/0) + surfelev, & ! Surface Elevation (m) + t2m ! Near-surface temperature + real(wp),dimension(Npoints,Ncolumns,llm),intent(in) :: & + Ze_out, & ! Effective reflectivity factor (dBZ) + Ze_non_out ! Effective reflectivity factor, w/o attenuation (dBZ) + real(wp),dimension(Npoints,Ncolumns),intent(in) :: & + fracPrecipIce ! Fraction of precipitation which is frozen. (1) + real(wp),intent(in) :: & + zstep ! Distance between two atmopsheric layers (m) + + ! Outputs + real(wp),dimension(Npoints,nCloudsatPrecipClass),intent(out) :: & + cloudsat_precip_cover ! Model precip rate in by CloudSat precip flag + real(wp),dimension(Npoints),intent(out) :: & + cloudsat_pia ! Cloudsat path integrated attenuation + + ! Local variables + integer,dimension(Npoints,Ncolumns) :: & + cloudsat_pflag, & ! Subcolumn precipitation flag + cloudsat_precip_pia ! Subcolumn path integrated attenutation. + integer,dimension(Npoints) :: & + cloudsat_preclvl_index ! Altitude index for precip flags calculation + ! in 40-level grid (one layer above surfelev) + integer :: pr,i,k + real(wp) :: Zmax + + ! Initialize + cloudsat_pflag(:,:) = pClass_default + cloudsat_precip_pia(:,:) = 0._wp + cloudsat_precip_cover(:,:) = 0._wp + cloudsat_pia(:) = 0._wp + cloudsat_preclvl_index(:) = 0._wp + + ! Computing altitude index for precip flags calculation + cloudsat_preclvl_index(:) = cloudsat_preclvl - floor( surfelev(:)/zstep ) + + ! ###################################################################################### + ! SUBCOLUMN processing + ! ###################################################################################### + do i=1, Npoints + do pr=1,Ncolumns + ! Compute precipitation flag + ! ################################################################################ + ! 1) Oceanic points. + ! ################################################################################ + if (land(i) .eq. 0) then + + ! 1a) Compute the PIA in all profiles containing hydrometeors + if ( (Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.-100) .and. (Ze_out(i,pr,cloudsat_preclvl_index(i)).gt.-100) ) then + if ( (Ze_non_out(i,pr,cloudsat_preclvl_index(i)).lt.100) .and. (Ze_out(i,pr,cloudsat_preclvl_index(i)).lt.100) ) then + cloudsat_precip_pia(i,pr) = Ze_non_out(i,pr,cloudsat_preclvl_index(i)) - Ze_out(i,pr,cloudsat_preclvl_index(i)) + endif + endif + + ! Snow + if(fracPrecipIce(i,pr).gt.0.9) then + if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(2)) then + cloudsat_pflag(i,pr) = pClass_Snow2 ! TSL: Snow certain + endif + if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(4).and. & + Ze_non_out(i,pr,cloudsat_preclvl_index(i)).le.Zenonbinval(2)) then + cloudsat_pflag(i,pr) = pClass_Snow1 ! TSL: Snow possible + endif + endif + + ! Mixed + if(fracPrecipIce(i,pr).gt.0.1.and.fracPrecipIce(i,pr).le.0.9) then + if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(2)) then + cloudsat_pflag(i,pr) = pClass_Mixed2 ! TSL: Mixed certain + endif + if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(4).and. & + Ze_non_out(i,pr,cloudsat_preclvl_index(i)).le.Zenonbinval(2)) then + cloudsat_pflag(i,pr) = pClass_Mixed1 ! TSL: Mixed possible + endif + endif + + ! Rain + if(fracPrecipIce(i,pr).le.0.1) then + if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(1)) then + cloudsat_pflag(i,pr) = pClass_Rain3 ! TSL: Rain certain + endif + if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(3).and. & + Ze_non_out(i,pr,cloudsat_preclvl_index(i)).le.Zenonbinval(1)) then + cloudsat_pflag(i,pr) = pClass_Rain2 ! TSL: Rain probable + endif + if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(4).and. & + Ze_non_out(i,pr,cloudsat_preclvl_index(i)).le.Zenonbinval(3)) then + cloudsat_pflag(i,pr) = pClass_Rain1 ! TSL: Rain possible + endif + if(cloudsat_precip_pia(i,pr).gt.40) then + cloudsat_pflag(i,pr) = pClass_Rain4 ! TSL: Heavy Rain + endif + endif + + ! No precipitation + if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).le.-15) then + cloudsat_pflag(i,pr) = pClass_noPrecip ! TSL: Not Raining + endif + endif ! Ocean points + + ! ################################################################################ + ! 2) Land points. + ! *NOTE* For land points we go up a layer higher, so cloudsat_preclvl_index(i)-1 + ! + ! ################################################################################ + if (land(i) .eq. 1) then + ! 2a) Compute the PIA in all profiles containing hydrometeors + if ( (Ze_non_out(i,pr,cloudsat_preclvl_index(i)-1).gt.-100) .and. (Ze_out(i,pr,cloudsat_preclvl_index(i)-1).gt.-100) ) then + if ( (Ze_non_out(i,pr,cloudsat_preclvl_index(i)-1).lt.100) .and. (Ze_out(i,pr,cloudsat_preclvl_index(i)-1).lt.100) ) then + cloudsat_precip_pia(i,pr) = Ze_non_out(i,pr,cloudsat_preclvl_index(i)-1) - Ze_out(i,pr,cloudsat_preclvl_index(i)-1) + endif + endif + + ! Find Zmax, the maximum reflectivity value in the attenuated profile (Ze_out); + Zmax=maxval(Ze_out(i,pr,:)) + + ! Snow (T<273) + if(t2m(i) .lt. 273._wp) then + if(Ze_out(i,pr,cloudsat_preclvl_index(i)-1) .gt. Zbinvallnd(5)) then + cloudsat_pflag(i,pr) = pClass_Snow2 ! JEK: Snow certain + endif + if(Ze_out(i,pr,cloudsat_preclvl_index(i)-1) .gt. Zbinvallnd(6) .and. & + Ze_out(i,pr,cloudsat_preclvl_index(i)-1).le.Zbinvallnd(5)) then + cloudsat_pflag(i,pr) = pClass_Snow1 ! JEK: Snow possible + endif + endif + + ! Mized phase (273275) + if(t2m(i) .gt. 275) then + if ((Zmax .gt. Zbinvallnd(1) .and. cloudsat_precip_pia(i,pr).gt.30) .or. & + (Ze_out(i,pr,cloudsat_preclvl_index(i)-1) .gt. Zbinvallnd(2))) then + cloudsat_pflag(i,pr) = pClass_Rain3 ! JEK: Rain certain + endif + if((Ze_out(i,pr,cloudsat_preclvl_index(i)-1) .gt. Zbinvallnd(6)) .and. & + (Zmax .gt. Zbinvallnd(3))) then + cloudsat_pflag(i,pr) = pClass_Rain2 ! JEK: Rain probable + endif + if((Ze_out(i,pr,cloudsat_preclvl_index(i)-1) .gt. Zbinvallnd(6)) .and. & + (Zmax.lt.Zbinvallnd(3))) then + cloudsat_pflag(i,pr) = pClass_Rain1 ! JEK: Rain possible + endif + if(cloudsat_precip_pia(i,pr).gt.40) then + cloudsat_pflag(i,pr) = pClass_Rain4 ! JEK: Heavy Rain + endif + endif + + ! No precipitation + if(Ze_out(i,pr,cloudsat_preclvl_index(i)-1) .le. -15) then + cloudsat_pflag(i,pr) = pClass_noPrecip ! JEK: Not Precipitating + endif + endif ! Land points + enddo ! Sub-columns + enddo ! Gridpoints + + ! ###################################################################################### + ! COLUMN processing + ! ###################################################################################### + + ! Aggregate subcolumns + do i=1,Npoints + ! Gridmean precipitation fraction for each precipitation type + do k=1,nCloudsatPrecipClass + if (any(cloudsat_pflag(i,:) .eq. k-1)) then + cloudsat_precip_cover(i,k) = count(cloudsat_pflag(i,:) .eq. k-1) + endif + enddo + + ! Gridmean path integrated attenuation (pia) + cloudsat_pia(i)=sum(cloudsat_precip_pia(i,:)) + enddo + + ! Normalize by number of subcolumns + where ((cloudsat_precip_cover /= R_UNDEF).and.(cloudsat_precip_cover /= 0.0)) & + cloudsat_precip_cover = cloudsat_precip_cover / Ncolumns + where ((cloudsat_pia/= R_UNDEF).and.(cloudsat_pia/= 0.0)) & + cloudsat_pia = cloudsat_pia / Ncolumns + + end subroutine cloudsat_precipOccurence + + ! ############################################################################################## + ! ############################################################################################## + subroutine quickbeam_dplrw(Npoints, Ncolumns, Nlevels, rcfg, & + hgt_matrix, hgt_matrix_half, surfelev, & + at, pfull, & + gwvel, gcumf, & + vfall_in, vfsqu_in, zehyd_in, & + g_vol, krhyd_in, & + vtrm3_in, vtrm0_in, mmnt3_in, mmnt0_in, & + gcumw, & + dplrw_Z, spwid_Z, Zef94_Z, & + dplrw_T, spwid_T, Zef94_T, & + ZefVd_2, & + vfall_Z, gridw_Z, & + vfall_T, gridw_T, ZefVf_2 ) + USE MOD_COSP_CONFIG, ONLY: Nlvgrid, N_HYDRO, & + trbl_LS, trbl_CU, & + Nlvtemp, lvtemp_WID, lvtemp_MAX, lvtemp_MIN, & + NlvdBZe, lvdBZe_WID, lvdBZe_MAX, lvdBZe_MIN, & + Nlvdplr, lvdplr_WID, lvdplr_MAX, lvdplr_MIN, & + Nlvspwd, lvspwd_WID, lvspwd_MAX, lvspwd_MIN + + integer,intent(in) :: Npoints, Ncolumns, Nlevels + type(radar_cfg),intent(in) :: rcfg + real(wp),intent(in),dimension(npoints,nlevels) :: hgt_matrix, hgt_matrix_half, at, pfull + real(wp),intent(in),dimension(npoints) :: surfelev + real(wp),intent(in),dimension(npoints,nlevels) :: gwvel,gcumf + logical,dimension(npoints,ncolumns,nlevels,N_HYDRO) :: flags + real(wp),intent(in),dimension(npoints,ncolumns,nlevels,N_HYDRO) :: vfall_in, vfsqu_in, zehyd_in + real(wp),dimension(npoints,ncolumns,nlevels,N_HYDRO) :: vfall, vfsqu, zehyd + real(wp),intent(in),dimension(npoints,ncolumns,nlevels,N_HYDRO) :: vtrm3_in,vtrm0_in,mmnt3_in,mmnt0_in + real(wp),dimension(npoints,ncolumns,nlevels,N_HYDRO) :: vtrm3,vtrm0,mmnt3,mmnt0 + !=== + real(wp),intent(out),dimension(npoints,nlevels) :: gcumw + !=== + real(wp),dimension(npoints,nlevels+1) :: hgt_bnd + real(wp),intent(in),dimension(npoints,nlevels) :: g_vol + real(wp),dimension(npoints,nlevels) :: att_gas + real(wp),intent(in),dimension(npoints,ncolumns,nlevels,N_HYDRO) :: krhyd_in + real(wp),dimension(npoints,ncolumns,nlevels,N_HYDRO) :: krhyd + real(wp),dimension(npoints,ncolumns,nlevels,0:2) :: att_hyd + real(wp) :: krLS, krCU + integer :: sta,end,dif + !=== + real(wp),intent(out),dimension(npoints,Nlvdplr,Nlvgrid,0:2) :: dplrw_Z + real(wp),intent(out),dimension(npoints,Nlvspwd,Nlvgrid,0:2) :: spwid_Z + real(wp),intent(out),dimension(npoints,NlvdBZe,Nlvgrid,0:2) :: Zef94_Z + real(wp),intent(out),dimension(npoints,Nlvdplr,Nlvtemp,0:2) :: dplrw_T + real(wp),intent(out),dimension(npoints,Nlvspwd,Nlvtemp,0:2) :: spwid_T + real(wp),intent(out),dimension(npoints,NlvdBZe,Nlvtemp,0:2) :: Zef94_T + real(wp),intent(out),dimension(npoints,Nlvdplr,NlvdBZe,0:2) :: ZefVd_2 + !=== + real(wp),intent(out),dimension(npoints,Nlvdplr,Nlvgrid,0:2,3) :: vfall_Z + real(wp),intent(out),dimension(npoints,Nlvdplr,Nlvgrid,0:2) :: gridw_Z + real(wp),intent(out),dimension(npoints,Nlvdplr,Nlvtemp,0:2,3) :: vfall_T + real(wp),intent(out),dimension(npoints,Nlvdplr,Nlvtemp,0:2) :: gridw_T + real(wp),intent(out),dimension(npoints,Nlvdplr,NlvdBZe,0:2,3) :: ZefVf_2 + !=== + integer :: dbin, sbin, zbin, tbin, hbin, vbin, wbin + integer :: i,j,k,n,is,js,id,tp + real(wp) :: zesum(0:2),vdmn(0:2),swmn(0:2) + real(wp) :: vfmn(0:2,3),gwmn(0:2),m0sum(0:2),m3sum(0:2) + real(wp) :: intp,es,qs,Tvs + real(wp),dimension(Npoints,Nlvdplr,Nlevels,0:2) :: workD + real(wp),dimension(Npoints,Nlvspwd,Nlevels,0:2) :: workS + real(wp),dimension(Npoints,NlvdBZe,Nlevels,0:2) :: workZ + real(wp),dimension(Npoints,Nlvdplr,Nlevels,0:2,3) :: workV + real(wp),dimension(Npoints,Nlvdplr,Nlevels,0:2) :: workW + + integer,parameter :: & + I_LSCLIQ = 1, & ! Large-scale (stratiform) liquid + I_LSCICE = 2, & ! Large-scale (stratiform) ice + I_LSRAIN = 3, & ! Large-scale (stratiform) rain + I_LSSNOW = 4, & ! Large-scale (stratiform) snow + I_CVCLIQ = 5, & ! Convective liquid + I_CVCICE = 6, & ! Convective ice + I_CVRAIN = 7, & ! Convective rain + I_CVSNOW = 8, & ! Convective snow + I_LSGRPL = 9 ! Large-scale (stratiform) groupel + integer,parameter :: & + I_ALC = 0, & ! all (stratiform + convective) clouds + I_LSC = 1, & ! stratiform clouds + I_CVC = 2 ! convective clouds + + ! @@@@@ convert: convective mass flux -> cumulus vertical velocity + do k=1,nlevels + do i=1,npoints + if (at(i,k) < 0._wp .or. pfull(i,k) < 0._wp) then + gcumw(i,k) = 0._wp + flags(i,:,k,:) = .false. + else + es = 611.*exp( (2.5e+6 + 3.4e+5*(1-sign(1._wp,at(i,k)-273.15))/2._wp)/461. * (1./273.15 - 1./at(i,k)) ) + qs = (es/pfull(i,k)) * (287./461.) + + Tvs = at(i,k)*( (1+qs/(287./461.))/(1+qs) ) + gcumw(i,k) = gcumf(i,k) * (287.*Tvs/pfull(i,k)) + + end if + end do + end do + + ! @@@@@ flag check @@@@@ + flags = .true. + do j=1,ncolumns + where (gwvel < R_UNDEF * 0.1_wp) + flags(:,j,:,I_LSCLIQ) = .false. + flags(:,j,:,I_LSCICE) = .false. + flags(:,j,:,I_LSRAIN) = .false. + flags(:,j,:,I_LSSNOW) = .false. + flags(:,j,:,I_LSGRPL) = .false. + end where + + where (gcumf < R_UNDEF * 0.1_wp) + flags(:,j,:,I_CVCLIQ) = .false. + flags(:,j,:,I_CVCICE) = .false. + flags(:,j,:,I_CVRAIN) = .false. + flags(:,j,:,I_CVSNOW) = .false. + end where + end do + where (flags) + vfall = vfall_in ; vfsqu = vfsqu_in ; zehyd = zehyd_in ; krhyd = krhyd_in + vtrm3 = vtrm3_in ; vtrm0 = vtrm0_in ; mmnt3 = mmnt3_in ; mmnt0 = mmnt0_in + elsewhere + vfall = 0._wp ; vfsqu = 0._wp ; zehyd = 0._wp ; krhyd = 0._wp + vtrm3 = 0._wp ; vtrm0 = 0._wp ; mmnt3 = 0._wp ; mmnt0 = 0._wp + end where + + hgt_bnd(:,1:Nlevels) = hgt_matrix_half + hgt_bnd(:,Nlevels+1) = surfelev + + ! @@@@@ attenuation: gas, LShyd, and CUhyd + if (rcfg%radar_at_layer_one) then + dif = 1 ; sta = 1 ; end = nlevels + else + dif = -1 ; sta = nlevels ; end = 1 + end if + + att_gas = 0._wp + do k=sta,end,dif + do i=1,npoints + att_gas(i,k) = att_gas(i,k) + & + g_vol(i,k) * (hgt_bnd(i,k+1)-hgt_bnd(i,k))/1000._wp + end do + end do + + att_hyd = 0._wp + do k=sta,end,dif + do j=1,ncolumns + do i=1,npoints + krLS = krhyd(i,j,k,I_LSCLIQ)+krhyd(i,j,k,I_LSCICE)+& + krhyd(i,j,k,I_LSRAIN)+krhyd(i,j,k,I_LSSNOW)+krhyd(i,j,k,I_LSGRPL) + att_hyd(i,j,k,I_LSC) = att_hyd(i,j,k,I_LSC) + & + krLS * (hgt_bnd(i,k+1)-hgt_bnd(i,k))/1000._wp + + krCU = krhyd(i,j,k,I_CVCLIQ)+krhyd(i,j,k,I_CVCICE)+& + krhyd(i,j,k,I_CVRAIN)+krhyd(i,j,k,I_CVSNOW) + att_hyd(i,j,k,I_CVC) = att_hyd(i,j,k,I_CVC) + & + krCU * (hgt_bnd(i,k+1)-hgt_bnd(i,k))/1000._wp + + att_hyd(i,j,k,I_ALC) = att_hyd(i,j,k,I_ALC) + & + (krLS+krCU) * (hgt_bnd(i,k+1)-hgt_bnd(i,k))/1000._wp + end do + end do + end do + + ! @@@@@ Initialiation + dplrw_Z = 0._wp ; spwid_Z = 0._wp ; Zef94_Z = 0._wp ; vfall_Z = 0._wp ; gridw_Z = 0._wp + dplrw_T = 0._wp ; spwid_T = 0._wp ; Zef94_T = 0._wp ; vfall_T = 0._wp ; gridw_T = 0._wp + ZefVd_2 = 0._wp ; ZefVd_2 = 0._wp + workD = 0._wp ; workS = 0._wp ; workZ = 0._wp ; workV = 0._wp ; workW = 0._wp + + ! @@@@@ statistics + do i=1,npoints + do j=1,ncolumns + do k=1,nlevels + tbin = floor( ( (at(i,k)-273.15) - lvtemp_MIN)/lvtemp_WID ) + 1 + hbin = k + if (tbin < 1 .or. tbin > Nlvtemp) cycle + + ! radar parameters: for LS and CU + zesum = 0._wp ; vdmn = 0._wp ; swmn = 0._wp + do tp=1,N_HYDRO + if (tp==I_LSCLIQ .or. tp==I_LSCICE .or. tp==I_LSRAIN .or. tp==I_LSSNOW .or. tp==I_LSGRPL) then + zesum(I_LSC) = zesum(I_LSC) + zehyd(i,j,k,tp) + vdmn(I_LSC) = vdmn(I_LSC) + vfall(i,j,k,tp)*zehyd(i,j,k,tp) + swmn(I_LSC) = swmn(I_LSC) + vfsqu(i,j,k,tp)*zehyd(i,j,k,tp) + else if (tp==I_CVCLIQ .or. tp==I_CVCICE .or. tp==I_CVRAIN .or. tp==I_CVSNOW) then + zesum(I_CVC) = zesum(I_CVC) + zehyd(i,j,k,tp) + vdmn(I_CVC) = vdmn(I_CVC) + vfall(i,j,k,tp)*zehyd(i,j,k,tp) + swmn(I_CVC) = swmn(I_CVC) + vfsqu(i,j,k,tp)*zehyd(i,j,k,tp) + end if + end do + + zesum(I_ALC) = zesum(I_LSC) + zesum(I_CVC) + if (zesum(I_LSC) <= 0 .and. zesum(I_CVC) <= 0.) cycle + + vdmn(I_ALC) = ( vdmn(I_LSC)+gwvel(i,k)*zesum(I_LSC) + vdmn(I_CVC)+gcumw(i,k)*zesum(I_CVC) ) / (zesum(I_LSC)+zesum(I_CVC)) + swmn(I_ALC) = ( swmn(I_LSC) + 2*gwvel(i,k)*vdmn(I_LSC) + gwvel(i,k)**2*zesum(I_LSC) + & + swmn(I_CVC) + 2*gcumw(i,k)*vdmn(I_CVC) + gcumw(i,k)**2*zesum(I_CVC) ) / (zesum(I_LSC)+zesum(I_CVC)) + swmn(I_ALC) = swmn(I_ALC) - vdmn(I_ALC)**2 + swmn(I_ALC) = swmn(I_ALC) + & + ( trbl_LS**2*zesum(I_LSC) + trbl_CU**2*zesum(I_CVC) ) / (zesum(I_LSC)+zesum(I_CVC)) + swmn(I_ALC) = sqrt( swmn(I_ALC) ) + + swmn(I_LSC) = sqrt(trbl_LS**2 + swmn(I_LSC)/zesum(I_LSC)-vdmn(I_LSC)**2/zesum(I_LSC)**2) + vdmn(I_LSC) = vdmn(I_LSC)/zesum(I_LSC) + gwvel(i,k) + + swmn(I_CVC) = sqrt(trbl_CU**2 + swmn(I_CVC)/zesum(I_CVC)-vdmn(I_CVC)**2/zesum(I_CVC)**2) + vdmn(I_CVC) = vdmn(I_CVC)/zesum(I_CVC) + gcumw(i,k) + + ! ~~~ + vfmn = 0._wp ; gwmn = 0._wp ; m3sum = 0._wp ; m0sum = 0._wp + do tp=1,N_HYDRO + if (tp==I_LSCLIQ .or. tp==I_LSCICE .or. tp==I_LSRAIN .or. tp==I_LSSNOW .or. tp==I_LSGRPL) then + vfmn(I_LSC,1) = vfmn(I_LSC,1) + vfall(i,j,k,tp)*zehyd(i,j,k,tp) + vfmn(I_LSC,2) = vfmn(I_LSC,2) + vtrm3(i,j,k,tp)*mmnt3(i,j,k,tp) + vfmn(I_LSC,3) = vfmn(I_LSC,3) + vtrm0(i,j,k,tp)*mmnt0(i,j,k,tp) + + m3sum(I_LSC) = m3sum(I_LSC) + mmnt3(i,j,k,tp) + m0sum(I_LSC) = m0sum(I_LSC) + mmnt0(i,j,k,tp) + + gwmn(I_ALC) = gwmn(I_ALC) + gwvel(i,k)*zehyd(i,j,k,tp) + else if (tp==I_CVCLIQ .or. tp==I_CVCICE .or. tp==I_CVRAIN .or. tp==I_CVSNOW) then + vfmn(I_CVC,1) = vfmn(I_CVC,1) + vfall(i,j,k,tp)*zehyd(i,j,k,tp) + vfmn(I_CVC,2) = vfmn(I_CVC,2) + vtrm3(i,j,k,tp)*mmnt3(i,j,k,tp) + vfmn(I_CVC,3) = vfmn(I_CVC,3) + vtrm0(i,j,k,tp)*mmnt0(i,j,k,tp) + + m3sum(I_CVC) = m3sum(I_CVC) + mmnt3(i,j,k,tp) + m0sum(I_CVC) = m0sum(I_CVC) + mmnt0(i,j,k,tp) + + gwmn(I_ALC) = gwmn(I_ALC) + gcumw(i,k)*zehyd(i,j,k,tp) + end if + + vfmn(I_ALC,1) = vfmn(I_ALC,1) + vfall(i,j,k,tp)*zehyd(i,j,k,tp) + vfmn(I_ALC,2) = vfmn(I_ALC,2) + vtrm3(i,j,k,tp)*mmnt3(i,j,k,tp) + vfmn(I_ALC,3) = vfmn(I_ALC,3) + vtrm0(i,j,k,tp)*mmnt0(i,j,k,tp) + + m3sum(I_ALC) = m3sum(I_ALC) + mmnt3(i,j,k,tp) + m0sum(I_ALC) = m0sum(I_ALC) + mmnt0(i,j,k,tp) + end do + do tp=0,2 + vfmn(tp,1) = vfmn(tp,1)/zesum(tp) + vfmn(tp,2) = vfmn(tp,2)/m3sum(tp) + vfmn(tp,3) = vfmn(tp,3)/m0sum(tp) + end do + gwmn(I_ALC) = gwmn(I_ALC)/zesum(I_ALC) + gwmn(I_LSC) = gwvel(i,k) + gwmn(I_CVC) = gcumw(i,k) + + + do tp=0,2 + if (zesum(tp) <= 0._wp) cycle + + !if (tp > 0) write(*,*) 'test 6: ',tp,vfmn(tp,1),zesum(tp) + !if (tp > 0) write(*,*) 'test 3: ',tp,vfmn(tp,2),m3sum(tp) + !if (tp > 0) write(*,*) 'test 0: ',tp,vfmn(tp,3),m0sum(tp) + + !if (tp==1) write(*,'(a,3(x,I5))') 'test grd: ',i,j,k + !if (tp==1) write(*,'(a,8(x,ES10.3))') 'test v6 : ',vfall(i,j,k,1:8) + !if (tp==1) write(*,'(a,8(x,ES10.3))') 'test v3 : ',vtrm3(i,j,k,1:8) + !if (tp==1) write(*,'(a,8(x,ES10.3))') 'test v0 : ',vtrm0(i,j,k,1:8) + + zbin = floor( ((10*log10(zesum(tp))-att_gas(i,k)-att_hyd(i,j,k,I_ALC)) - lvdBZe_MIN)/lvdBZe_WID ) + 1 + if (zbin < 1 ) cycle + if (zbin > NlvdBZe) cycle + + dbin = floor( (vdmn(tp) - lvdplr_MIN)/lvdplr_WID ) + 1 + if (dbin < 1 ) dbin = 1 + if (dbin > Nlvdplr) dbin = Nlvdplr + + sbin = floor( (swmn(tp) - lvspwd_MIN)/lvspwd_WID ) + 1 + if (sbin < 1 ) sbin = 1 + if (sbin > Nlvspwd) sbin = Nlvspwd + + workZ(i,zbin,hbin,tp) = workZ(i,zbin,hbin,tp) + 1._wp + workD(i,dbin,hbin,tp) = workD(i,dbin,hbin,tp) + 1._wp + workS(i,sbin,hbin,tp) = workS(i,sbin,hbin,tp) + 1._wp + + Zef94_T(i,zbin,tbin,tp) = Zef94_T(i,zbin,tbin,tp) + 1._wp + dplrw_T(i,dbin,tbin,tp) = dplrw_T(i,dbin,tbin,tp) + 1._wp + spwid_T(i,sbin,tbin,tp) = spwid_T(i,sbin,tbin,tp) + 1._wp + + ZefVd_2(i,dbin,zbin,tp) = ZefVd_2(i,dbin,zbin,tp) + 1._wp + + ! ~~~ + do id=1,3 + vbin = floor( (vfmn(tp,id) - lvdplr_MIN)/lvdplr_WID ) + 1 + if (vbin < 1 ) vbin = 1 + if (vbin > Nlvdplr) vbin = Nlvdplr + workV(i,vbin,hbin,tp,id) = workV(i,vbin,hbin,tp,id) + 1._wp + vfall_T(i,vbin,tbin,tp,id) = vfall_T(i,vbin,tbin,tp,id) + 1._wp + ZefVf_2(i,vbin,zbin,tp,id) = ZefVf_2(i,vbin,zbin,tp,id) + 1._wp + end do + + wbin = floor( (gwmn(tp) - lvdplr_MIN)/lvdplr_WID ) + 1 + if (wbin < 1 ) wbin = 1 + if (wbin > Nlvdplr) wbin = Nlvdplr + workW(i,wbin,hbin,tp) = workW(i,wbin,hbin,tp) + 1._wp + gridw_T(i,wbin,tbin,tp) = gridw_T(i,wbin,tbin,tp) + 1._wp + + end do + + end do + end do + end do + + ! @@@@@ vertical grid conversion + if (use_vgrid) then + do tp=0,2 + call cosp_change_vertical_grid(npoints,Nlvdplr,Nlevels, & + hgt_matrix(:,nlevels:1:-1),hgt_matrix_half(:,nlevels:1:-1),workD(:,1:Nlvdplr,nlevels:1:-1,tp), & + Nlvgrid,vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1),dplrw_Z(:,1:Nlvdplr,1:Nlvgrid,tp)) + + call cosp_change_vertical_grid(npoints,Nlvspwd,Nlevels, & + hgt_matrix(:,nlevels:1:-1),hgt_matrix_half(:,nlevels:1:-1),workS(:,1:Nlvspwd,nlevels:1:-1,tp), & + Nlvgrid,vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1),spwid_Z(:,1:Nlvspwd,1:Nlvgrid,tp)) + + call cosp_change_vertical_grid(npoints,NlvdBZe,Nlevels, & + hgt_matrix(:,nlevels:1:-1),hgt_matrix_half(:,nlevels:1:-1),workZ(:,1:NlvdBZe,nlevels:1:-1,tp), & + Nlvgrid,vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1),Zef94_Z(:,1:NlvdBZe,1:Nlvgrid,tp)) + + ! ~~~ + do id=1,3 + call cosp_change_vertical_grid(npoints,Nlvdplr,Nlevels, & + hgt_matrix(:,nlevels:1:-1),hgt_matrix_half(:,nlevels:1:-1),workV(:,1:Nlvdplr,nlevels:1:-1,tp,id), & + Nlvgrid,vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1),vfall_Z(:,1:Nlvdplr,1:Nlvgrid,tp,id)) + end do + + call cosp_change_vertical_grid(npoints,Nlvdplr,Nlevels, & + hgt_matrix(:,nlevels:1:-1),hgt_matrix_half(:,nlevels:1:-1),workW(:,1:Nlvdplr,nlevels:1:-1,tp), & + Nlvgrid,vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1),gridw_Z(:,1:Nlvdplr,1:Nlvgrid,tp)) + + end do + where (dplrw_Z < 0._wp) + dplrw_Z = 0._wp + end where + where (spwid_Z < 0._wp) + spwid_Z = 0._wp + end where + where (Zef94_Z < 0._wp) + Zef94_Z = 0._wp + end where + where (vfall_Z < 0._wp) + vfall_Z = 0._wp + end where + where (gridw_Z < 0._wp) + gridw_Z = 0._wp + end where + + else + do tp=0,2 + dplrw_Z(:,1:Nlvdplr,1:Nlvgrid,tp) = workD(:,1:Nlvdplr,Nlevels:1:-1,tp) + spwid_Z(:,1:Nlvspwd,1:Nlvgrid,tp) = workS(:,1:Nlvspwd,Nlevels:1:-1,tp) + Zef94_Z(:,1:NlvdBZe,1:Nlvgrid,tp) = workZ(:,1:NlvdBZe,Nlevels:1:-1,tp) + + do id=1,3 + vfall_Z(:,1:Nlvdplr,1:Nlvgrid,tp,id) = workV(:,1:Nlvdplr,Nlevels:1:-1,tp,id) + end do + gridw_Z(:,1:Nlvdplr,1:Nlvgrid,tp) = workW(:,1:Nlvdplr,Nlevels:1:-1,tp) + + end do + end if + + end subroutine quickbeam_dplrw + + ! ############################################################################################## + ! ############################################################################################## + subroutine load_scale_LUTs(rcfg) + + type(radar_cfg), intent(inout) :: rcfg + logical :: LUT_file_exists + integer :: i,j,k,ind + + ! Load scale LUT from file + inquire(file=trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat', & + exist=LUT_file_exists) + + if(.not.LUT_file_exists) then + write(*,*) '*************************************************' + write(*,*) 'Warning: Could NOT FIND radar LUT file: ', & + trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat' + write(*,*) 'Will calculated LUT values as needed' + write(*,*) '*************************************************' + return + else + OPEN(unit=12,file=trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat',& + form='unformatted', & + err= 89, & + access='DIRECT',& + recl=28) + write(*,*) 'Loading radar LUT file: ', & + trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat' + + do i=1,maxhclass + do j=1,mt_ntt + do k=1,nRe_types + ind = i+(j-1)*maxhclass+(k-1)*(nRe_types*mt_ntt) + read(12,rec=ind) rcfg%Z_scale_flag(i,j,k), & + rcfg%Ze_scaled(i,j,k), & + rcfg%Zr_scaled(i,j,k), & + rcfg%kr_scaled(i,j,k) + enddo + enddo + enddo + close(unit=12) + return + endif + +89 write(*,*) 'Error: Found but could NOT READ radar LUT file: ', & + trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat' + + end subroutine load_scale_LUTs + + ! ############################################################################################## + ! ############################################################################################## + subroutine save_scale_LUTs(rcfg) + type(radar_cfg), intent(inout) :: rcfg + logical :: LUT_file_exists + integer :: i,j,k,ind + + inquire(file=trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat', & + exist=LUT_file_exists) + + OPEN(unit=12,file=trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat',& + form='unformatted',err= 99,access='DIRECT',recl=28) + + write(*,*) 'Creating or Updating radar LUT file: ', & + trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat' + + do i=1,maxhclass + do j=1,mt_ntt + do k=1,nRe_types + ind = i+(j-1)*maxhclass+(k-1)*(nRe_types*mt_ntt) + if(.not.LUT_file_exists .or. rcfg%Z_scale_added_flag(i,j,k)) then + rcfg%Z_scale_added_flag(i,j,k)=.false. + write(12,rec=ind) rcfg%Z_scale_flag(i,j,k), & + rcfg%Ze_scaled(i,j,k), & + rcfg%Zr_scaled(i,j,k), & + rcfg%kr_scaled(i,j,k) + endif + enddo + enddo + enddo + close(unit=12) + return + +99 write(*,*) 'Error: Unable to create/update radar LUT file: ', & + trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat' + return + + end subroutine save_scale_LUTs + ! ############################################################################################## + ! ############################################################################################## + subroutine quickbeam_init() + + + end subroutine quickBeam_init + ! ############################################################################################## + ! ############################################################################################## + + +end module quickbeam + + diff --git a/dplrw_src/quickbeam_optics.F90 b/dplrw_src/quickbeam_optics.F90 new file mode 100644 index 0000000000..7d63754468 --- /dev/null +++ b/dplrw_src/quickbeam_optics.F90 @@ -0,0 +1,1577 @@ +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +! Copyright (c) 2015, Regents of the University of Colorado +! All rights reserved. +! +! Redistribution and use in source and binary forms, with or without modification, are +! permitted provided that the following conditions are met: +! +! 1. Redistributions of source code must retain the above copyright notice, this list of +! conditions and the following disclaimer. +! +! 2. Redistributions in binary form must reproduce the above copyright notice, this list +! of conditions and the following disclaimer in the documentation and/or other +! materials provided with the distribution. +! +! 3. Neither the name of the copyright holder nor the names of its contributors may be +! used to endorse or promote products derived from this software without specific prior +! written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +! +! History: +! May 2015: Dustin Swales - Initial version +! +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +module mod_quickbeam_optics + USE COSP_KINDS, ONLY: wp,dp + USE array_lib, ONLY: infind + USE math_lib, ONLY: path_integral,avint,gamma + USE optics_lib, ONLY: m_wat,m_ice,MieInt + USE cosp_math_constants, ONLY: pi + USE cosp_phys_constants, ONLY: rhoice + use quickbeam, ONLY: dmin,dmax,Re_BIN_LENGTH, & + Re_MAX_BIN,nRe_types,nd,maxhclass + use mod_cosp_config, ONLY: N_HYDRO + use mod_cosp_stats, ONLY: radar_cfg + use mod_cosp_error, ONLY: errorMessage + implicit none + + ! Derived type for particle size distribution + TYPE size_distribution + real(wp),dimension(maxhclass) :: p1,p2,p3,dmin,dmax,apm,bpm,rho + integer, dimension(maxhclass) :: dtype,phase + + ! for DPLRW + integer, dimension(N_HYDRO) :: ftype,fvscs + real(wp),dimension(N_HYDRO) :: f1,f2,f3 + END TYPE size_distribution + + ! Parameters + integer,parameter :: & ! + cnt_liq = 19, & ! Liquid temperature count + cnt_ice = 20 ! Lce temperature count + + ! Initialization variables + real(wp),dimension(cnt_ice) :: mt_tti + real(wp),dimension(cnt_liq) :: mt_ttl + real(wp),dimension(nd) :: D + !logical :: lQuickbeamInit + +contains + ! ###################################################################################### + ! SUBROUTINE quickbeam_optics_init + ! ###################################################################################### + subroutine quickbeam_optics_init() + integer :: j + + mt_tti = (/ ((j-1)*5-90 + 273.15, j = 1, cnt_ice) /) + mt_ttl = (/ ((j-1)*5-60 + 273.15, j = 1, cnt_liq) /) + D(1) = dmin + do j=2,nd + D(j) = D(j-1)*exp((log(dmax)-log(dmin))/(nd-1)) + enddo + !lQuickbeamInit = .true. + end subroutine quickbeam_optics_init + + ! ###################################################################################### + ! SUBROUTINE QUICKBEAM_OPTICS + ! ###################################################################################### + subroutine quickbeam_optics(sd, rcfg, nprof, ngate, undef, hm_matrix, re_matrix, & + Np_matrix, p_matrix, t_matrix, sh_matrix,z_vol,kr_vol, & + vfall, vfsqu, zehyd, krhyd, & + vtrm3, vtrm0, mmnt3, mmnt0 ) + + ! INPUTS + type(size_distribution),intent(inout) :: & + sd ! + type(radar_cfg),intent(inout) :: & + rcfg ! + integer,intent(in) :: & + nprof, & ! Number of hydrometeor profiles + ngate ! Number of vertical layers + real(wp),intent(in) :: & + undef ! Missing data value + real(wp),intent(in),dimension(nprof,ngate) :: & + p_matrix, & ! Pressure profile (hPa) + t_matrix, & ! Temperature profile (K) + sh_matrix ! Specific humidity profile (%) -- only needed if gaseous aborption calculated. + real(wp),intent(in),dimension(nprof,ngate,rcfg%nhclass) :: & + re_matrix, & ! Table of hydrometeor effective radii. 0 ==> use defaults. (units=microns) + hm_matrix ! Table of hydrometeor mixing ratios (g/kg) + real(wp),intent(inout),dimension(nprof,ngate,rcfg%nhclass) :: & + Np_matrix ! Table of hydrometeor number concentration. 0 ==> use defaults. (units = 1/kg) + + ! OUTPUTS + real(wp),intent(out), dimension(nprof, ngate) :: & + z_vol, & ! Effective reflectivity factor (mm^6/m^3) + kr_vol ! Attenuation coefficient hydro (dB/km) + + ! OUTPUTS for DPLRW + real(wp),intent(out), dimension(nprof, ngate, N_HYDRO) :: & + vfall, vfsqu, zehyd, krhyd, & + vtrm3, vtrm0, mmnt3, mmnt0 + + ! INTERNAL VARIABLES + integer :: & + phase, ns,tp,j,k,pr,itt,iRe_type,n + logical :: & + hydro + real(wp) :: & + t_kelvin,Re_internal + real(wp) :: & + rho_a,kr,ze,zr,scale_factor,Re,Np,base,step + + ! INTERNAL VARIABLES for DPLRW + real(wp) :: vf,vq + real(wp) :: vt3,vt0,D3int,D0int + real(wp),dimension(:),allocatable :: fall_speed + + real(wp),dimension(:),allocatable :: & + Deq, & ! Discrete drop sizes (um) + Ni, & ! Discrete concentrations (cm^-3 um^-1) + rhoi, & ! Discrete densities (kg m^-3) + xxa, & ! + Di ! Discrete drop sizes (um) + + real(wp), dimension(nprof, ngate) :: & + z_ray ! Reflectivity factor, Rayleigh only (mm^6/m^3) + + ! PARAMETERS + logical, parameter :: & ! + DO_LUT_TEST = .false., & ! + DO_NP_TEST = .false. ! + real(wp), parameter :: & + one_third = 1._wp/3._wp ! + + ! Initialization + z_vol = 0._wp + z_ray = 0._wp + kr_vol = 0._wp + vfall = 0._wp + vfsqu = 0._wp + zehyd = 0._wp + krhyd = 0._wp + vtrm3 = 0._wp + vtrm0 = 0._wp + mmnt3 = 0._wp + mmnt0 = 0._wp + + do k=1,ngate ! Loop over each profile (nprof) + do pr=1,nprof + ! Determine if hydrometeor(s) present in volume + hydro = .false. + do j=1,rcfg%nhclass + if ((hm_matrix(pr,k,j) > 1E-12) .and. (sd%dtype(j) > 0)) then + hydro = .true. + exit + endif + enddo + + t_kelvin = t_matrix(pr,k) + ! If there is hydrometeor in the volume + if (hydro) then + rho_a = (p_matrix(pr,k))/(287._wp*(t_kelvin)) + + ! Loop over hydrometeor type + do tp=1,rcfg%nhclass + Re_internal = re_matrix(pr,k,tp) + + if (hm_matrix(pr,k,tp) <= 1E-12) cycle + + ! Index into temperature dimension of scaling tables + ! These tables have regular steps -- exploit this and abandon infind + phase = sd%phase(tp) + if (phase==0) then + itt = infind(mt_ttl,t_kelvin) + else + itt = infind(mt_tti,t_kelvin) + endif + + ! Compute effective radius from number concentration and distribution parameters + if (Re_internal .eq. 0) then + call calc_Re(hm_matrix(pr,k,tp),Np_matrix(pr,k,tp),rho_a, & + sd%dtype(tp),sd%apm(tp),sd%bpm(tp),sd%rho(tp),sd%p1(tp),sd%p2(tp),sd%p3(tp),Re) + Re_internal=Re + !re_matrix(pr,k,tp)=Re + else + if (Np_matrix(pr,k,tp) > 0) then + call errorMessage('WARNING(optics/quickbeam_optics.f90): Re and Np set for the same volume & hydrometeor type. Np is being ignored.') + endif + Re = Re_internal + !Re = re_matrix(pr,k,tp) + endif + + ! Index into particle size dimension of scaling tables + iRe_type=1 + if(Re.gt.0) then + ! Determine index in to scale LUT + ! Distance between Re points (defined by "base" and "step") for + ! each interval of size Re_BIN_LENGTH + ! Integer asignment, avoids calling floor intrinsic + n=Re/Re_BIN_LENGTH + if (n>=Re_MAX_BIN) n=Re_MAX_BIN-1 + step = rcfg%step_list(n+1) + base = rcfg%base_list(n+1) + iRe_type=Re/step + if (iRe_type.lt.1) iRe_type=1 + Re=step*(iRe_type+0.5_wp) ! set value of Re to closest value allowed in LUT. + iRe_type=iRe_type+base-int(n*Re_BIN_LENGTH/step) + + ! Make sure iRe_type is within bounds + if (iRe_type.ge.nRe_types) then + !write(*,*) 'Warning: size of Re exceed value permitted ', & + ! 'in Look-Up Table (LUT). Will calculate. ' + ! No scaling allowed + iRe_type=nRe_types + rcfg%Z_scale_flag(tp,itt,iRe_type)=.false. + else + ! Set value in re_matrix to closest values in LUT + if (.not. DO_LUT_TEST) re_internal=Re + !if (.not. DO_LUT_TEST) re_matrix(pr,k,tp)=Re + endif + endif + + ! Use Ze_scaled, Zr_scaled, and kr_scaled ... if know them + ! if not we will calculate Ze, Zr, and Kr from the distribution parameters +! if( rcfg%Z_scale_flag(tp,itt,iRe_type) .and. .not. DO_LUT_TEST) then +! ! can use z scaling +! scale_factor=rho_a*hm_matrix(pr,k,tp) +! zr = rcfg%Zr_scaled(tp,itt,iRe_type) * scale_factor +! ze = rcfg%Ze_scaled(tp,itt,iRe_type) * scale_factor +! kr = rcfg%kr_scaled(tp,itt,iRe_type) * scale_factor +! else + if( (.not. rcfg%Z_scale_flag(tp,itt,iRe_type)) .or. DO_LUT_TEST) then + ! Create a discrete distribution of hydrometeors within volume + select case(sd%dtype(tp)) + case(4) + ns = 1 + allocate(Di(ns),Ni(ns),rhoi(ns),xxa(ns),Deq(ns)) + Di = sd%p1(tp) + Ni = 0._wp + case default + ns = nd ! constant defined in simulator/quickbeam.f90 + allocate(Di(ns),Ni(ns),rhoi(ns),xxa(ns),Deq(ns)) + Di = D + Ni = 0._wp + end select + call dsd(hm_matrix(pr,k,tp),re_internal,Np_matrix(pr,k,tp), & + Di,Ni,ns,sd%dtype(tp),rho_a,t_kelvin, & + sd%dmin(tp),sd%dmax(tp),sd%apm(tp),sd%bpm(tp), & + sd%rho(tp),sd%p1(tp),sd%p2(tp),sd%p3(tp)) + + ! Calculate particle density + if (phase == 1) then + if (sd%rho(tp) < 0) then + ! Use equivalent volume spheres. + rcfg%rho_eff(tp,1:ns,iRe_type) = rhoice ! solid ice == equivalent volume approach + Deq = ( ( 6/pi*sd%apm(tp)/rhoice) ** one_third ) * ( (Di*1E-6) ** (sd%bpm(tp)/3._wp) ) * 1E6 + ! alternative is to comment out above two lines and use the following block + ! MG Mie approach - adjust density of sphere with D = D_characteristic to match particle density + ! + ! rcfg%rho_eff(tp,1:ns,iRe_type) = (6/pi)*sd%apm(tp)*(Di*1E-6)**(sd%bpm(tp)-3) !MG Mie approach + + ! as the particle size gets small it is possible that the mass to size relationship of + ! (given by power law in hclass.data) can produce impossible results + ! where the mass is larger than a solid sphere of ice. + ! This loop ensures that no ice particle can have more mass/density larger than an ice sphere. + ! do i=1,ns + ! if(rcfg%rho_eff(tp,i,iRe_type) > 917 ) then + ! rcfg%rho_eff(tp,i,iRe_type) = 917 + ! endif + ! enddo + else + ! Equivalent volume sphere (solid ice rhoice=917 kg/m^3). + rcfg%rho_eff(tp,1:ns,iRe_type) = rhoice + Deq=Di * ((sd%rho(tp)/rhoice)**one_third) + ! alternative ... coment out above two lines and use the following for MG-Mie + ! rcfg%rho_eff(tp,1:ns,iRe_type) = sd%rho(tp) !MG Mie approach + endif + else + ! I assume here that water phase droplets are spheres. + ! sd%rho should be ~ 1000 or sd%apm=524 .and. sd%bpm=3 + Deq = Di + endif + + ! Calculate effective reflectivity factor of volume + ! xxa are unused (Mie scattering and extinction efficiencies) + xxa(1:ns) = -9.9_wp + rhoi = rcfg%rho_eff(tp,1:ns,iRe_type) + + allocate(fall_speed(ns)) + call fall_velocity(ns,Deq*1e-6,sd,p_matrix(pr,k),t_matrix(pr,k),tp,& + & fall_speed) + call zeff(rcfg%freq,Deq,Ni,ns,rcfg%k2,t_kelvin,phase,rcfg%do_ray, & + ze,zr,kr,xxa,xxa,rhoi, & + fall_speed, vf, vq, & + vt3, vt0, D3int, D0int) + + ! Test compares total number concentration with sum of discrete samples + ! The second test, below, compares ab initio and "scaled" computations + ! of reflectivity + ! These should get broken out as a unit test that gets called on + ! data. That routine could write to std out. + + ! Test code ... compare Np value input to routine with sum of DSD + ! NOTE: if .not. DO_LUT_TEST, then you are checking the LUT approximation + ! not just the DSD representation given by Ni + if(Np_matrix(pr,k,tp)>0 .and. DO_NP_TEST ) then + Np = path_integral(Ni,Di,1,ns-1)/rho_a*1.E6_wp + ! Note: Representation is not great or small Re < 2 + if( (Np_matrix(pr,k,tp)-Np)/Np_matrix(pr,k,tp)>0.1 ) then + call errorMessage('ERROR(optics/quickbeam_optics.f90): Error: Np input does not match sum(N)') + endif + endif + + ! Clean up space + deallocate(Di,Ni,rhoi,xxa,Deq) + deallocate(fall_speed) + + ! LUT test code + ! This segment of code compares full calculation to scaling result + if ( rcfg%Z_scale_flag(tp,itt,iRe_type) .and. DO_LUT_TEST ) then + scale_factor=rho_a*hm_matrix(pr,k,tp) + ! if more than 2 dBZe difference print error message/parameters. + if ( abs(10*log10(ze) - 10*log10(rcfg%Ze_scaled(tp,itt,iRe_type) * & + scale_factor)) > 2 ) then + call errorMessage('ERROR(optics/quickbeam_optics.f90): ERROR: Roj Error?') + endif + endif + else + ! Use z scaling + scale_factor=rho_a*hm_matrix(pr,k,tp) + zr = rcfg%Zr_scaled(tp,itt,iRe_type) * scale_factor + ze = rcfg%Ze_scaled(tp,itt,iRe_type) * scale_factor + kr = rcfg%kr_scaled(tp,itt,iRe_type) * scale_factor + + vf = rcfg%vf_scaled(tp,itt,iRe_type) * scale_factor + vq = rcfg%vq_scaled(tp,itt,iRe_type) * scale_factor + + vt3 = rcfg%v3_scaled(tp,itt,iRe_type) * scale_factor + vt0 = rcfg%v0_scaled(tp,itt,iRe_type) * scale_factor + D3int = rcfg%m3_scaled(tp,itt,iRe_type) * scale_factor + D0int = rcfg%m0_scaled(tp,itt,iRe_type) * scale_factor + endif ! end z_scaling + + kr_vol(pr,k) = kr_vol(pr,k) + kr + z_vol(pr,k) = z_vol(pr,k) + ze + z_ray(pr,k) = z_ray(pr,k) + zr + + vfall(pr,k,tp) = vf/ze + vfsqu(pr,k,tp) = vq/ze + zehyd(pr,k,tp) = ze + krhyd(pr,k,tp) = kr + + vtrm3(pr,k,tp) = vt3/D3int + vtrm0(pr,k,tp) = vt0/D0int + mmnt3(pr,k,tp) = D3int + mmnt0(pr,k,tp) = D0int + + ! Construct Ze_scaled, Zr_scaled, and kr_scaled ... if we can + if ( .not. rcfg%Z_scale_flag(tp,itt,iRe_type) ) then + if (iRe_type>1) then + scale_factor=rho_a*hm_matrix(pr,k,tp) + rcfg%Ze_scaled(tp,itt,iRe_type) = ze/ scale_factor + rcfg%Zr_scaled(tp,itt,iRe_type) = zr/ scale_factor + rcfg%kr_scaled(tp,itt,iRe_type) = kr/ scale_factor + rcfg%Z_scale_flag(tp,itt,iRe_type) = .true. + rcfg%Z_scale_added_flag(tp,itt,iRe_type)=.true. + + rcfg%vf_scaled(tp,itt,iRe_type) = vf/ scale_factor + rcfg%vq_scaled(tp,itt,iRe_type) = vq/ scale_factor + + rcfg%v3_scaled(tp,itt,iRe_type) = vt3/ scale_factor + rcfg%v0_scaled(tp,itt,iRe_type) = vt0/ scale_factor + rcfg%m3_scaled(tp,itt,iRe_type) = D3int/ scale_factor + rcfg%m0_scaled(tp,itt,iRe_type) = D0int/ scale_factor + endif + endif + enddo ! end loop of tp (hydrometeor type) + endif + enddo + enddo + + where(kr_vol(:,:) <= EPSILON(kr_vol)) + ! Volume is hydrometeor-free + !z_vol(:,:) = undef + z_ray(:,:) = undef + end where + + end subroutine quickbeam_optics + ! ############################################################################################## + ! ############################################################################################## + subroutine calc_Re(Q,Np,rho_a,dtype,apm,bpm,rho_c,p1,p2,p3,Re) + ! ############################################################################################## + ! Purpose: + ! Calculates Effective Radius (1/2 distribution 3rd moment / 2nd moment). + ! + ! For some distribution types, the total number concentration (per kg), Np + ! may be optionally specified. Should be set to zero, otherwise. + ! + ! Roj Marchand July 2010 + ! + ! Inputs: + ! + ! [Q] hydrometeor mixing ratio (g/kg) ! not needed for some distribution types + ! [Np] Optional Total number concentration (per kg). 0 = use defaults (p1, p2, p3) + ! [rho_a] ambient air density (kg m^-3) + ! + ! Distribution parameters as per quickbeam documentation. + ! [dtype] distribution type + ! [apm] a parameter for mass (kg m^[-bpm]) + ! [bmp] b params for mass + ! [p1],[p2],[p3] distribution parameters + ! + ! Outputs: + ! [Re] Effective radius, 1/2 the 3rd moment/2nd moment (um) + ! + ! Created: + ! July 2010 Roj Marchand + ! Modified: + ! 12/18/14 Dustin Swales: Define type REALs as double precision (dustin.swales@noaa.gov) + ! + ! ############################################################################################## + ! ############################################################################################## + + ! Inputs + real(wp), intent(in) :: Q,Np,rho_a,rho_c,p1,p2,p3 + integer, intent(in) :: dtype + real(wp), intent(inout) :: apm,bpm + + ! Outputs + real(wp), intent(out) :: Re + + ! Internal + integer :: local_dtype + real(wp) :: local_p3,local_Np,tmp1,tmp2 + real(wp) :: N0,D0,vu,dm,ld,rg,log_sigma_g ! gamma, exponential variables + + + ! If density is constant, set equivalent values for apm and bpm + if ((rho_c > 0) .and. (apm < 0)) then + apm = (pi/6)*rho_c + bpm = 3._wp + endif + + ! Exponential is same as modified gamma with vu =1 + ! if Np is specified then we will just treat as modified gamma + if(dtype .eq. 2 .and. Np .gt. 0) then + local_dtype = 1 + local_p3 = 1 + else + local_dtype = dtype + local_p3 = p3 + endif + select case(local_dtype) + + ! ---------------------------------------------------------! + ! Modified gamma ! + ! Np = total number concentration (1/kg) = Nt / rho_a ! + ! D0 = characteristic diameter (um) ! + ! dm = mean diameter (um) - first moment over zeroth moment! + ! vu = distribution width parameter ! + ! ---------------------------------------------------------! + case(1) + + if( abs(local_p3+2) < 1E-8) then + if(Np>1E-30) then + ! Morrison scheme with Martin 1994 shape parameter (NOTE: vu = pc +1) + ! fixed Roj. Dec. 2010 -- after comment by S. Mcfarlane + vu = (1/(0.2714_wp + 0.00057145_wp*Np*rho_a*1E-6))**2 ! units of Nt = Np*rhoa = #/cm^3 + else + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify a value for Np in each volume with Morrison/Martin Scheme.') + return + endif + elseif (abs(local_p3+1) > 1E-8) then + ! vu is fixed in hp structure + vu = local_p3 + else + ! vu isn't specified + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify a value for vu for Modified Gamma distribution') + return + endif + + if( Np.eq.0 .and. p2+1 > 1E-8) then ! use default value for MEAN diameter as first default + dm = p2 ! by definition, should have units of microns + D0 = gamma(vu)/gamma(vu+1)*dm + else ! use value of Np + if(Np.eq.0) then + if( abs(p1+1) > 1E-8 ) then ! use default number concentration + local_Np = p1 ! total number concentration / pa --- units kg^-1 + else + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify Np or default value (p1=Dm [um] or p2=Np [1/kg]) for Modified Gamma distribution') + return + endif + else + local_Np=Np; + endif + D0 = 1E6 * ( Q*1E-3*gamma(vu)/(apm*local_Np*gamma(vu+bpm)) )**(1/bpm) ! units = microns + endif + Re = 0.5_wp*D0*gamma(vu+3)/gamma(vu+2) + + ! ---------------------------------------------------------! + ! Exponential ! + ! N0 = intercept parameter (m^-4) ! + ! ld = slope parameter (um) ! + ! ---------------------------------------------------------! + case(2) + + ! Np not specified (see if statement above) + if((abs(p1+1) > 1E-8) ) then ! N0 has been specified, determine ld + N0 = p1 + tmp1 = 1._wp/(1._wp+bpm) + ld = ((apm*gamma(1._wp+bpm)*N0)/(rho_a*Q*1E-3))**tmp1 + ld = ld/1E6 ! set units to microns^-1 + elseif (abs(p2+1) > 1E-8) then ! lambda=ld has been specified as default + ld = p2 ! should have units of microns^-1 + else + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify Np or default value (p1=No or p2=lambda) for Exponential distribution') + return + endif + Re = 1.5_wp/ld + + ! ---------------------------------------------------------! + ! Power law ! + ! ahp = Ar parameter (m^-4 mm^-bhp) ! + ! bhp = br parameter ! + ! dmin_mm = lower bound (mm) ! + ! dmax_mm = upper bound (mm) ! + ! ---------------------------------------------------------! + case(3) + + Re=0._wp ! Not supporting LUT approach for power-law ... + if(Np>0) then + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Variable Np not supported for Power Law distribution') + return + endif + + ! ---------------------------------------------------------! + ! Monodisperse ! + ! D0 = particle diameter (um) == Re ! + ! ---------------------------------------------------------! + case(4) + + Re = p1 + if(Np>0) then + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Variable Np not supported for Monodispersed distribution') + return + endif + + ! ---------------------------------------------------------! + ! Lognormal ! + ! N0 = total number concentration (m^-3) ! + ! np = fixed number concentration (kg^-1) ! + ! rg = mean radius (um) ! + ! log_sigma_g = ln(geometric standard deviation) ! + ! ---------------------------------------------------------! + case(5) + + if( abs(local_p3+1) > 1E-8 ) then + !set natural log width + log_sigma_g = local_p3 + else + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify a value for sigma_g when using a Log-Normal distribution') + return + endif + + ! get rg ... + if( Np.eq.0 .and. (abs(p2+1) > 1E-8) ) then ! use default value of rg + rg = p2 + else + if(Np>0) then + local_Np=Np; + elseif(abs(p2+1) < 1E-8) then + local_Np=p1 + else + call errorMessage('ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify Np or default value (p2=Rg or p1=Np) for Log-Normal distribution') + endif + log_sigma_g = p3 + tmp1 = (Q*1E-3)/(2._wp**bpm*apm*local_Np) + tmp2 = exp(0.5_wp*bpm*bpm*(log_sigma_g))*exp(0.5_wp*bpm*bpm*(log_sigma_g)) + rg = ((tmp1/tmp2)**(1._wp/bpm))*1E6 + endif + Re = rg*exp(2.5_wp*(log_sigma_g*log_sigma_g)) + end select + end subroutine calc_Re + ! ############################################################################################## + ! ############################################################################################## + subroutine dsd(Q,Re,Np,D,N,nsizes,dtype,rho_a,tk,dmin,dmax,apm,bpm,rho_c,p1,p2,p3) + ! ############################################################################################## + ! Purpose: + ! Create a discrete drop size distribution + ! + ! Starting with Quickbeam V3, this routine now allows input of + ! both effective radius (Re) and total number concentration (Nt) + ! Roj Marchand July 2010 + ! + ! The version in Quickbeam v.104 was modified to allow Re but not Nt + ! This is a significantly modified form for the version + ! + ! Originally Part of QuickBeam v1.03 by John Haynes + ! http://reef.atmos.colostate.edu/haynes/radarsim + ! + ! Inputs: + ! + ! [Q] hydrometeor mixing ratio (g/kg) + ! [Re] Optional Effective Radius (microns). 0 = use defaults (p1, p2, p3) + ! + ! [D] array of discrete drop sizes (um) where we desire to know the number concentraiton n(D). + ! [nsizes] number of elements of [D] + ! + ! [dtype] distribution type + ! [rho_a] ambient air density (kg m^-3) + ! [tk] temperature (K) + ! [dmin] minimum size cutoff (um) + ! [dmax] maximum size cutoff (um) + ! [rho_c] alternate constant density (kg m^-3) + ! [p1],[p2],[p3] distribution parameters + ! + ! Input/Output: + ! [apm] a parameter for mass (kg m^[-bpm]) + ! [bmp] b params for mass + ! + ! Outputs: + ! [N] discrete concentrations (cm^-3 um^-1) + ! or, for monodisperse, a constant (1/cm^3) + ! + ! Requires: + ! function infind + ! + ! Created: + ! 11/28/05 John Haynes (haynes@atmos.colostate.edu) + ! Modified: + ! 01/31/06 Port from IDL to Fortran 90 + ! 07/07/06 Rewritten for variable DSD's + ! 10/02/06 Rewritten using scaling factors (Roger Marchand and JMH), Re added V1.04 + ! July 2020 "N Scale factors" (variable fc) removed (Roj Marchand). + ! 12/18/14 Define type REALs as double precision (dustin.swales@noaa.gov) + ! ############################################################################################## + + ! Inputs + integer, intent(in) :: & + nsizes,& ! Number of elements of [D] + dtype ! distribution type + real(wp),intent(in),dimension(nsizes) :: & + D ! Array of discrete drop sizes (um) where we desire to know the number concentraiton n(D). + real(wp),intent(in) :: & + Q, & ! Hydrometeor mixing ratio (g/kg) + Np, & ! + rho_a, & ! Ambient air density (kg m^-3) + tk, & ! Temperature (K) + dmin, & ! Minimum size cutoff (um) + dmax, & ! Maximum size cutoff (um) + rho_c, & ! Alternate constant density (kg m^-3) + p1, & ! Distribution parameter 1 + p2, & ! Distribution parameter 2 + p3 ! Distribution parameter 3 + real(wp),intent(inout) :: & + apm, & ! a parameter for mass (kg m^[-bpm]) + bpm, & ! b params for mass + Re ! Optional Effective Radius (microns) + + ! Outputs + real(wp),intent(out),dimension(nsizes) :: & + N ! Discrete concentrations (cm^-3 um^-1) + ! or, for monodisperse, a constant (1/cm^3) + + ! Internal Variables + real(wp),dimension(nsizes) :: & + fc + real(wp) :: & + N0,D0,vu,local_np,dm,ld, & ! gamma, exponential variables + dmin_mm,dmax_mm,ahp,bhp, & ! power law variables + rg,log_sigma_g, & ! lognormal variables + rho_e, & ! particle density (kg m^-3) + tmp1,tmp2,tc + integer :: & + k,lidx,uidx + + ! Convert temperature from Kelvin to Celsius + tc = tk - 273.15_wp + + ! If density is constant, store equivalent values for apm and bpm + if ((rho_c > 0) .and. (apm < 0)) then + apm = (pi/6)*rho_c + bpm = 3._wp + endif + + ! Will preferentially use Re input over Np. + ! if only Np given then calculate Re + ! if neigher than use other defaults (p1,p2,p3) following quickbeam documentation + if(Re==0 .and. Np>0) then + call calc_Re(Q,Np,rho_a,dtype,apm,bpm,rho_c,p1,p2,p3,Re) + endif + select case(dtype) + + ! ---------------------------------------------------------! + ! Modified gamma ! + ! np = total number concentration ! + ! D0 = characteristic diameter (um) ! + ! dm = mean diameter (um) - first moment over zeroth moment! + ! vu = distribution width parameter ! + ! ---------------------------------------------------------! + case(1) + + if( abs(p3+2) < 1E-8) then + if( Np>1E-30) then + ! Morrison scheme with Martin 1994 shape parameter (NOTE: vu = pc +1) + ! fixed Roj. Dec. 2010 -- after comment by S. Mcfarlane + vu = (1/(0.2714_wp + 0.00057145_wp*Np*rho_a*1E-6))**2._wp ! units of Nt = Np*rhoa = #/cm^3 + else + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Must specify a value for Np in each volume with Morrison/Martin Scheme.') + return + endif + elseif (abs(p3+1) > 1E-8) then + ! vu is fixed in hp structure + vu = p3 + else + ! vu isn't specified + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Must specify a value for vu for Modified Gamma distribution') + return + endif + + if(Re>0) then + D0 = 2._wp*Re*gamma(vu+2)/gamma(vu+3) + fc = (((D*1E-6)**(vu-1)*exp(-1*D/D0)) / & + (apm*((D0*1E-6)**(vu+bpm))*gamma(vu+bpm))) * 1E-12 + N = fc*rho_a*(Q*1E-3) + elseif( p2+1 > 1E-8) then ! use default value for MEAN diameter + dm = p2 + D0 = gamma(vu)/gamma(vu+1)*dm + fc = (((D*1E-6)**(vu-1)*exp(-1*D/D0)) / & + (apm*((D0*1E-6)**(vu+bpm))*gamma(vu+bpm))) * 1E-12 + N = fc*rho_a*(Q*1E-3) + elseif(abs(p3+1) > 1E-8) then! use default number concentration + local_np = p1 ! total number concentration / pa check + tmp1 = (Q*1E-3)**(1./bpm) + fc = (D*1E-6 / (gamma(vu)/(apm*local_np*gamma(vu+bpm)))**(1._wp/bpm))**vu + N = ((rho_a*local_np*fc*(D*1E-6)**(-1._wp))/(gamma(vu)*tmp1**vu) * & + exp(-1._wp*fc**(1._wp/vu)/tmp1)) * 1E-12 + else + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): No default value for Dm or Np provided!') + return + endif + + ! ---------------------------------------------------------! + ! Exponential ! + ! N0 = intercept parameter (m^-4) ! + ! ld = slope parameter (um) ! + ! ---------------------------------------------------------! + case(2) + + if(Re>0) then + ld = 1.5_wp/Re ! units 1/um + fc = (ld*1E6)**(1.+bpm)/(apm*gamma(1._wp+bpm))*exp(-1._wp*(ld*1E6)*(D*1E-6))*1E-12 + N = fc*rho_a*(Q*1E-3) + elseif (abs(p1+1) > 1E-8) then + ! Use N0 default value + N0 = p1 + tmp1 = 1._wp/(1._wp+bpm) + fc = ((apm*gamma(1._wp+bpm)*N0)**tmp1)*(D*1E-6) + N = (N0*exp(-1._wp*fc*(1._wp/(rho_a*Q*1E-3))**tmp1)) * 1E-12 + elseif (abs(p2+1) > 1E-8) then + ! Use default value for lambda + ld = p2 + fc = (ld*1E6)**(1._wp+bpm)/(apm*gamma(1._wp+bpm))*exp(-1._wp*(ld*1E6)*(D*1E-6))*1E-12 + N = fc*rho_a*(Q*1E-3) + else + ! ld "parameterized" from temperature (carry over from original Quickbeam). + ld = 1220._wp*10._wp**(-0.0245_wp*tc)*1E-6 + N0 = ((ld*1E6)**(1._wp+bpm)*Q*1E-3*rho_a)/(apm*gamma(1._wp+bpm)) + N = (N0*exp(-ld*D)) * 1E-12 + endif + + ! ---------------------------------------------------------! + ! Power law ! + ! ahp = Ar parameter (m^-4 mm^-bhp) ! + ! bhp = br parameter ! + ! dmin_mm = lower bound (mm) ! + ! dmax_mm = upper bound (mm) ! + ! ---------------------------------------------------------! + case(3) + + if(Re>0) then + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Variable Re not supported for Power-Law distribution') + return + elseif(Np>0) then + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Variable Np not supported for Power-Law distribution') + return + endif + + ! br parameter + if (abs(p1+2) < 1E-8) then + ! if p1=-2, bhp is parameterized according to Ryan (2000), + ! applicatable to cirrus clouds + if (tc < -30) then + bhp = -1.75_wp+0.09_wp*((tc+273._wp)-243.16_wp) + elseif ((tc >= -30) .and. (tc < -9)) then + bhp = -3.25_wp-0.06_wp*((tc+273._wp)-265.66_wp) + else + bhp = -2.15_wp + endif + elseif (abs(p1+3) < 1E-8) then + ! if p1=-3, bhp is parameterized according to Ryan (2000), + ! applicable to frontal clouds + if (tc < -35) then + bhp = -1.75_wp+0.09_wp*((tc+273._wp)-243.16_wp) + elseif ((tc >= -35) .and. (tc < -17.5)) then + bhp = -2.65_wp+0.09_wp*((tc+273._wp)-255.66_wp) + elseif ((tc >= -17.5) .and. (tc < -9)) then + bhp = -3.25_wp-0.06_wp*((tc+273._wp)-265.66_wp) + else + bhp = -2.15_wp + endif + else + ! Otherwise the specified value is used + bhp = p1 + endif + + ! Ar parameter + dmin_mm = dmin*1E-3 + dmax_mm = dmax*1E-3 + + ! Commented lines are original method with constant density + ! rc = 500. ! (kg/m^3) + ! tmp1 = 6*rho_a*(bhp+4) + ! tmp2 = pi*rc*(dmax_mm**(bhp+4))*(1-(dmin_mm/dmax_mm)**(bhp+4)) + ! ahp = (Q*1E-3)*1E12*tmp1/tmp2 + + ! New method is more consistent with the rest of the distributions + ! and allows density to vary with particle size + tmp1 = rho_a*(Q*1E-3)*(bhp+bpm+1) + tmp2 = apm*(dmax_mm**bhp*dmax**(bpm+1)-dmin_mm**bhp*dmin**(bpm+1)) + ahp = tmp1/tmp2 * 1E24 + ! ahp = tmp1/tmp2 + lidx = infind(D,dmin) + uidx = infind(D,dmax) + do k=lidx,uidx + N(k) = (ahp*(D(k)*1E-3)**bhp) * 1E-12 + enddo + + ! ---------------------------------------------------------! + ! Monodisperse ! + ! D0 = particle diameter (um) ! + ! ---------------------------------------------------------! + case(4) + + if (Re>0) then + D0 = Re + else + D0 = p1 + endif + + rho_e = (6._wp/pi)*apm*(D0*1E-6)**(bpm-3) + fc(1) = (6._wp/(pi*D0*D0*D0*rho_e))*1E12 + N(1) = fc(1)*rho_a*(Q*1E-3) + + ! ---------------------------------------------------------! + ! Lognormal ! + ! N0 = total number concentration (m^-3) ! + ! np = fixed number concentration (kg^-1) ! + ! rg = mean radius (um) ! + ! og_sigma_g = ln(geometric standard deviation) ! + ! ---------------------------------------------------------! + case(5) + if (abs(p1+1) < 1E-8 .or. Re>0 ) then + ! rg, log_sigma_g are given + log_sigma_g = p3 + tmp2 = (bpm*log_sigma_g)*(bpm*log_sigma_g) + if(Re.le.0) then + rg = p2 + else + !rg = Re*exp(-2.5*(log_sigma_g*log_sigma_g)) + rg =Re*exp(-2.5_wp*(log_sigma_g**2)) + + endif + + fc = 0.5_wp*((1._wp/((2._wp*rg*1E-6)**(bpm)*apm*(2._wp*pi)**(0.5_wp) * & + log_sigma_g*D*0.5_wp*1E-6))*exp(-0.5_wp*((log(0.5_wp*D/rg)/log_sigma_g)**2._wp+tmp2)))*1E-12 + N = fc*rho_a*(Q*1E-3) + + elseif (abs(p2+1) < 1E-8 .or. Np>0) then + ! Np, log_sigma_g are given + if(Np>0) then + local_Np = Np + else + local_Np = p1 + endif + + log_sigma_g = p3 + N0 = local_np*rho_a + tmp1 = (rho_a*(Q*1E-3))/(2._wp**bpm*apm*N0) + tmp2 = exp(0.5_wp*bpm*bpm*(log_sigma_g))*exp(0.5_wp*bpm*bpm*(log_sigma_g)) + rg = ((tmp1/tmp2)**(1/bpm))*1E6 + + N = 0.5_wp*(N0 / ((2._wp*pi)**(0.5_wp)*log_sigma_g*D*0.5_wp*1E-6) * & + exp((-0.5_wp*(log(0.5_wp*D/rg)/log_sigma_g)**2._wp)))*1E-12 + else + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Must specify a value for sigma_g') + return + endif + end select + end subroutine dsd + ! ############################################################################################## + ! ############################################################################################## + subroutine zeff(freq,D,N,nsizes,k2,tt,ice,xr,z_eff,z_ray,kr,qe,qs,rho_e, & + fall_speed, vf, vq, vt3, vt0, D3int, D0int) + ! ############################################################################################## + ! Purpose: + ! Simulates radar return of a volume given DSD of spheres + ! Part of QuickBeam v1.03 by John Haynes + ! http://reef.atmos.colostate.edu/haynes/radarsim + ! + ! Inputs: + ! [freq] radar frequency (GHz) + ! [D] discrete drop sizes (um) + ! [N] discrete concentrations (cm^-3 um^-1) + ! [nsizes] number of discrete drop sizes + ! [k2] |K|^2, -1=use frequency dependent default + ! [tt] hydrometeor temperature (K) + ! [ice] indicates volume consists of ice + ! [xr] perform Rayleigh calculations? + ! [qe] if using a mie table, these contain ext/sca ... + ! [qs] ... efficiencies; otherwise set to -1 + ! [rho_e] medium effective density (kg m^-3) (-1 = pure) + ! + ! Outputs: + ! [z_eff] unattenuated effective reflectivity factor (mm^6/m^3) + ! [z_ray] reflectivity factor, Rayleigh only (mm^6/m^3) + ! [kr] attenuation coefficient (db km^-1) + ! + ! Created: + ! 11/28/05 John Haynes (haynes@atmos.colostate.edu) + ! Modified: + ! 12/18/14 Dustin Swales: Define type REALs as double precision (dustin.swales@noaa.gov) + ! ############################################################################################## + ! Inputs + integer, intent(in) :: & + ice, & ! Indicates volume consists of ice + xr, & ! Perform Rayleigh calculations? + nsizes ! Number of discrete drop sizes + real(wp), intent(in),dimension(nsizes) :: & + D, & ! Discrete drop sizes (um) + N, & ! Discrete concentrations (cm^-3 um^-1) + rho_e, & ! Medium effective density (kg m^-3) (-1 = pure) + qe, & ! Extinction efficiency, when using Mie tables + qs ! Scatering efficiency, when using Mie tables + real(wp),intent(in) :: & + freq, & ! Radar frequency (GHz) + tt ! Hydrometeor temperature (K) + real(wp), intent(inout) :: & + k2 ! |K|^2, -1=use frequency dependent default + real(wp), intent(in), dimension(nsizes) :: & + fall_speed ! droplet fall speed + + ! Outputs + real(wp), intent(out) :: & + z_eff, & ! Unattenuated effective reflectivity factor (mm^6/m^3) + z_ray, & ! Reflectivity factor, Rayleigh only (mm^6/m^3) + kr ! Attenuation coefficient (db km^-1) + real(wp), intent(out) :: & + vf, vq ! Ze weighted + real(wp), intent(out) :: & + vt0, vt3, D3int, D0int ! for terminal velocity + + ! Internal Variables + integer :: correct_for_rho ! Correct for density flag + real(wp), dimension(nsizes) :: & + D0, & ! D in (m) + N0, & ! N in m^-3 m^-1 + sizep, & ! Size parameter + qext, & ! Extinction efficiency + qbsca, & ! Backscatter efficiency + f, & ! Ice fraction + xtemp ! + real(wp) :: & + wl, cr,eta_sum,eta_mie,const,z0_eff,z0_ray,k_sum,n_r,n_i,dqv(1),dqsc,dg,dph(1) + complex(wp) :: & + m, & ! Complex index of refraction of bulk form + Xs1(1), Xs2(1) ! + integer :: & + i, err ! + integer, parameter :: & + one=1 ! + real(wp),parameter :: & + conv_d = 1e-6, & ! Conversion factor for drop sizes (to m) + conv_n = 1e12, & ! Conversion factor for drop concentrations (to m^-3) + conv_f = 0.299792458 ! Conversion for radar frequency (to m) + complex(wp),dimension(nsizes) ::& + m0 ! Complex index of refraction + real(wp) :: fall_sum ! temporal array for DPLRW + + ! Initialize + z0_ray = 0._wp + + ! Conversions + D0 = d*conv_d + N0 = n*conv_n + wl = conv_f/freq + + ! // dielectric constant |k^2| defaults + if (k2 < 0) then + k2 = 0.933_wp + if (abs(94.-freq) < 3.) k2=0.75_wp + if (abs(35.-freq) < 3.) k2=0.88_wp + if (abs(13.8-freq) < 3.) k2=0.925_wp + endif + + if (qe(1) < -9) then + + ! Get the refractive index of the bulk hydrometeors + if (ice == 0) then + call m_wat(freq,tt,n_r,n_i) + else + call m_ice(freq,tt,n_r,n_i) + endif + m = cmplx(n_r,-n_i) + m0(1:nsizes) = m + + correct_for_rho = 0 + if ((ice == 1) .and. (minval(rho_e) >= 0)) correct_for_rho = 1 + + ! Correct refractive index for ice density if needed + if (correct_for_rho == 1) then + f = rho_e/rhoice + m0 = sqrt((2+(m0*m0)+2*f*((m0*m0)-1))/(2+(m0*m0)+f*(1-(m0*m0)))) + endif + + ! Mie calculations + sizep = (pi*D0)/wl + dqv(1) = 0._wp + do i=1,nsizes + call mieint(sizep(i), m0(i), one, dqv, qext(i), dqsc, qbsca(i), & + dg, xs1, xs2, dph, err) + end do + + else + ! Mie table used + qext = qe + qbsca = qs + endif + + ! eta_mie = 0.25*sum[qbsca*pi*D^2*N(D)*deltaD] + ! <--------- eta_sum ---------> + ! z0_eff = (wl^4/!pi^5)*(1./k2)*eta_mie + eta_sum = 0._wp + if (size(D0) == 1) then + eta_sum = qbsca(1)*(n(1)*1E6)*D0(1)*D0(1) + else + xtemp = qbsca*N0*D0*D0 + call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),eta_sum) + endif + + eta_mie = eta_sum*0.25_wp*pi + const = ((wl*wl*wl*wl)/(pi*pi*pi*pi*pi))*(1._wp/k2) + + z0_eff = const*eta_mie + + ! kr = 0.25*cr*sum[qext*pi*D^2*N(D)*deltaD] + ! <---------- k_sum ---------> + k_sum = 0._wp + if (size(D0) == 1) then + k_sum = qext(1)*(n(1)*1E6)*D0(1)*D0(1) + else + xtemp = qext*N0*D0*D0 + call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),k_sum) + endif + ! DS2014 START: Making this calculation in double precision results in a small + ! amount of very small errors in the COSP output field,dBZE94, + ! so it will be left as is. + !cr = 10._wp/log(10._wp) + cr = 10./log(10.) + ! DS2014 STOP + kr = k_sum*0.25_wp*pi*(1000._wp*cr) + + ! <---------- vf_sum ---------> + fall_sum = 0._wp + if (size(D0) == 1) then + fall_sum = fall_speed(1)*qbsca(1)*(n(1)*1E6)*D0(1)*D0(1) + else + xtemp = fall_speed*qbsca*N0*D0*D0 + call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),fall_sum) + end if + const = ((wl*wl*wl*wl)/(pi*pi*pi*pi*pi))*(1._wp/k2) + vf = fall_sum*const*0.25_wp*pi*1E18 + + fall_sum = 0._wp + if (size(D0) == 1) then + fall_sum = fall_speed(1)*fall_speed(1)*qbsca(1)*(n(1)*1E6)*D0(1)*D0(1) + else + xtemp = fall_speed*fall_speed*qbsca*N0*D0*D0 + call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),fall_sum) + end if + const = ((wl*wl*wl*wl)/(pi*pi*pi*pi*pi))*(1._wp/k2) + vq = fall_sum*const*0.25_wp*pi*1E18 + + ! <---------- vf_sum for terminal velocity ---------> + fall_sum = 0._wp + if (size(D0) == 1) then + fall_sum = fall_speed(1)*(n(1)*1E6)*D0(1)*D0(1)*D0(1) + else + xtemp = fall_speed*N0*D0*D0*D0 + call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),fall_sum) + end if + vt3 = fall_sum + + fall_sum = 0._wp + if (size(D0) == 1) then + fall_sum = (n(1)*1E6)*D0(1)*D0(1)*D0(1) + else + xtemp = N0*D0*D0*D0 + call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),fall_sum) + end if + D3int = fall_sum + + fall_sum = 0._wp + if (size(D0) == 1) then + fall_sum = fall_speed(1)*(n(1)*1E6) + else + xtemp = fall_speed*N0 + call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),fall_sum) + end if + vt0 = fall_sum + + fall_sum = 0._wp + if (size(D0) == 1) then + fall_sum = (n(1)*1E6) + else + xtemp = N0 + call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),fall_sum) + end if + D0int = fall_sum + + ! z_ray = sum[D^6*N(D)*deltaD] + if (xr == 1) then + z0_ray = 0._wp + if (size(D0) == 1) then + z0_ray = (n(1)*1E6)*D0(1)*D0(1)*D0(1)*D0(1)*D0(1)*D0(1) + else + xtemp = N0*D0*D0*D0*D0*D0*D0 + call avint(xtemp,D0,nsizes,D0(1),D0(size(D0)),z0_ray) + endif + endif + + ! Convert to mm^6/m^3 + z_eff = z0_eff*1E18 ! 10.*alog10(z0_eff*1E18) + z_ray = z0_ray*1E18 ! 10.*alog10(z0_ray*1E18) + + end subroutine zeff + ! ############################################################################################## + ! ############################################################################################## + function gases(PRES_mb,T,SH,f) + ! ############################################################################################## + ! Purpose: + ! Compute 2-way gaseous attenuation through a volume in microwave + ! + ! Inputs: + ! [PRES_mb] pressure (mb) (hPa) + ! [T] temperature (K) + ! [RH] relative humidity (%) + ! [f] frequency (GHz), < 300 GHz + ! + ! Returns: + ! 2-way gaseous attenuation (dB/km) + ! + ! Reference: + ! Uses method of Liebe (1985) + ! + ! Created: + ! 12/09/05 John Haynes (haynes@atmos.colostate.edu) + ! Modified: + ! 01/31/06 Port from IDL to Fortran 90 + ! 12/19/14 Dustin Swales: Define type REALs as double precision (dustin.swales@noaa.gov) + ! ############################################################################################## + + ! INPUTS + real(wp), intent(in) :: & ! + PRES_mb, & ! Pressure (mb) (hPa) + T, & ! Temperature (K) + SH, & ! Specific humidity + f ! Frequency (GHz), < 300 GHz + + ! PARAMETERS + integer, parameter :: & ! + nbands_o2 = 48, & ! Number of O2 bands + nbands_h2o = 30 ! Number of h2o bands + ! LOCAL VARIABLES + real(wp) :: & + gases, th, e, p, sumo, gm0, a0, ap, term1, & + term2, term3, bf, be, term4, npp,e_th,one_th, & + pth3,eth35,aux1,aux2,aux3, aux4,gm,delt,x,y, & + gm2,fpp_o2,fpp_h2o,s_o2,s_h2o + integer :: i + + ! Table1 parameters v0, a1, a2, a3, a4, a5, a6 + real(wp),dimension(nbands_o2),parameter :: & + v0 = (/49.4523790,49.9622570,50.4742380,50.9877480,51.5033500, & + 52.0214090,52.5423930,53.0669060,53.5957480,54.1299999,54.6711570, & + 55.2213650,55.7838000,56.2647770,56.3378700,56.9681000,57.6124810, & + 58.3238740,58.4465890,59.1642040,59.5909820,60.3060570,60.4347750, & + 61.1505580,61.8001520,62.4112120,62.4862530,62.9979740,63.5685150, & + 64.1277640,64.6789000,65.2240670,65.7647690,66.3020880,66.8368270, & + 67.3695950,67.9008620,68.4310010,68.9603060,69.4890210,70.0173420, & + 118.7503410,368.4983500,424.7631200,487.2493700,715.3931500, & + 773.8387300, 834.1453300/), & + a1 = (/0.0000001,0.0000003,0.0000009,0.0000025,0.0000061,0.0000141, & + 0.0000310,0.0000641,0.0001247,0.0002280,0.0003918,0.0006316,0.0009535, & + 0.0005489,0.0013440,0.0017630,0.0000213,0.0000239,0.0000146,0.0000240, & + 0.0000211,0.0000212,0.0000246,0.0000250,0.0000230,0.0000193,0.0000152, & + 0.0000150,0.0000109,0.0007335,0.0004635,0.0002748,0.0001530,0.0000801, & + 0.0000395,0.0000183,0.0000080,0.0000033,0.0000013,0.0000005,0.0000002, & + 0.0000094,0.0000679,0.0006380,0.0002350,0.0000996,0.0006710,0.0001800/),& + a2 = (/11.8300000,10.7200000,9.6900000,8.8900000,7.7400000,6.8400000, & + 6.0000000,5.2200000,4.4800000,3.8100000,3.1900000,2.6200000,2.1150000, & + 0.0100000,1.6550000,1.2550000,0.9100000,0.6210000,0.0790000,0.3860000, & + 0.2070000,0.2070000,0.3860000,0.6210000,0.9100000,1.2550000,0.0780000, & + 1.6600000,2.1100000,2.6200000,3.1900000,3.8100000,4.4800000,5.2200000, & + 6.0000000,6.8400000,7.7400000,8.6900000,9.6900000,10.7200000,11.8300000,& + 0.0000000,0.0200000,0.0110000,0.0110000,0.0890000,0.0790000,0.0790000/),& + a3 = (/0.0083000,0.0085000,0.0086000,0.0087000,0.0089000,0.0092000, & + 0.0094000,0.0097000,0.0100000,0.0102000,0.0105000,0.0107900,0.0111000, & + 0.0164600,0.0114400,0.0118100,0.0122100,0.0126600,0.0144900,0.0131900, & + 0.0136000,0.0138200,0.0129700,0.0124800,0.0120700,0.0117100,0.0146800, & + 0.0113900,0.0110800,0.0107800,0.0105000,0.0102000,0.0100000,0.0097000, & + 0.0094000,0.0092000,0.0089000,0.0087000,0.0086000,0.0085000,0.0084000, & + 0.0159200,0.0192000,0.0191600,0.0192000,0.0181000,0.0181000,0.0181000/),& + a4 = (/0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & + 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & + 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & + 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & + 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & + 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & + 0.0000000,0.6000000,0.6000000,0.6000000,0.6000000,0.6000000,0.6000000/),& + a5 = (/0.0056000,0.0056000,0.0056000,0.0055000,0.0056000,0.0055000, & + 0.0057000,0.0053000,0.0054000,0.0048000,0.0048000,0.0041700,0.0037500, & + 0.0077400,0.0029700,0.0021200,0.0009400,-0.0005500,0.0059700,-0.0024400,& + 0.0034400,-0.0041300,0.0013200,-0.0003600,-0.0015900,-0.0026600, & + -0.0047700,-0.0033400,-0.0041700,-0.0044800,-0.0051000,-0.0051000, & + -0.0057000,-0.0055000,-0.0059000,-0.0056000,-0.0058000,-0.0057000, & + -0.0056000,-0.0056000,-0.0056000,-0.0004400,0.0000000,0.0000000, & + 0.0000000,0.0000000,0.0000000,0.0000000/), & + a6 = (/1.7000000,1.7000000,1.7000000,1.7000000,1.8000000,1.8000000, & + 1.8000000,1.9000000,1.8000000,2.0000000,1.9000000,2.1000000,2.1000000, & + 0.9000000,2.3000000,2.5000000,3.7000000,-3.1000000,0.8000000,0.1000000, & + 0.5000000,0.7000000,-1.0000000,5.8000000,2.9000000,2.3000000,0.9000000, & + 2.2000000,2.0000000,2.0000000,1.8000000,1.9000000,1.8000000,1.8000000, & + 1.7000000,1.8000000,1.7000000,1.7000000,1.7000000,1.7000000,1.7000000, & + 0.9000000,1.0000000,1.0000000,1.0000000,1.0000000,1.0000000,1.0000000/) + + ! Table2 parameters v1, b1, b2, b3 + real(wp),dimension(nbands_h2o),parameter :: & + v1 = (/22.2350800,67.8139600,119.9959400,183.3101170,321.2256440, & + 325.1529190,336.1870000,380.1973720,390.1345080,437.3466670,439.1508120, & + 443.0182950,448.0010750,470.8889740,474.6891270,488.4911330,503.5685320, & + 504.4826920,556.9360020,620.7008070,658.0065000,752.0332270,841.0735950, & + 859.8650000,899.4070000,902.5550000,906.2055240,916.1715820,970.3150220, & + 987.9267640/), & + b1 = (/0.1090000,0.0011000,0.0007000,2.3000000,0.0464000,1.5400000, & + 0.0010000,11.9000000,0.0044000,0.0637000,0.9210000,0.1940000,10.6000000, & + 0.3300000,1.2800000,0.2530000,0.0374000,0.0125000,510.0000000,5.0900000, & + 0.2740000,250.0000000,0.0130000,0.1330000,0.0550000,0.0380000,0.1830000, & + 8.5600000,9.1600000,138.0000000/), & + b2 = (/2.1430000,8.7300000,8.3470000,0.6530000,6.1560000,1.5150000, & + 9.8020000,1.0180000,7.3180000,5.0150000,3.5610000,5.0150000,1.3700000, & + 3.5610000,2.3420000,2.8140000,6.6930000,6.6930000,0.1140000,2.1500000, & + 7.7670000,0.3360000,8.1130000,7.9890000,7.8450000,8.3600000,5.0390000, & + 1.3690000,1.8420000,0.1780000/), & + b3 = (/0.0278400,0.0276000,0.0270000,0.0283500,0.0214000,0.0270000, & + 0.0265000,0.0276000,0.0190000,0.0137000,0.0164000,0.0144000,0.0238000, & + 0.0182000,0.0198000,0.0249000,0.0115000,0.0119000,0.0300000,0.0223000, & + 0.0300000,0.0286000,0.0141000,0.0286000,0.0286000,0.0264000,0.0234000, & + 0.0253000,0.0240000,0.0286000/) + + ! Conversions + th = 300._wp/T ! unitless + + ! DS2014 START: Using _wp for the exponential in the denominator results in slight errors + ! for dBze94. 0.01 % of values differ, relative range: 1.03e-05 to 1.78e-04 + !e = (RH*th*th*th*th*th)/(41.45_wp*10**(9.834_wp*th-10)) ! kPa + !e = (RH*th*th*th*th*th)/(41.45_wp*10**(9.834_wp*th-10)) ! kPa + e = SH*PRES_mb/(SH+0.622_wp)/1000._wp !kPa + ! DS2014 END + + p = PRES_mb/1000._wp-e ! kPa + e_th = e*th + one_th = 1 - th + pth3 = p*th*th*th + eth35 = e*th**(3.5) + + ! Term1 + sumo = 0._wp + aux1 = 1.1_wp*e_th + do i=1,nbands_o2 + aux2 = f/v0(i) + aux3 = v0(i)-f + aux4 = v0(i)+f + gm = a3(i)*(p*th**(0.8_wp-a4(i))+aux1) + gm2 = gm*gm + delt = a5(i)*p*th**a6(i) + x = aux3*aux3+gm2 + y = aux4*aux4+gm2 + fpp_o2 = (((1._wp/x)+(1._wp/y))*(gm*aux2) - (delt*aux2)*((aux3/(x))-(aux4/(x)))) + s_o2 = a1(i)*pth3*exp(a2(i)*one_th) + sumo = sumo + fpp_o2 * s_o2 + enddo + term1 = sumo + + ! Term2 + gm0 = 5.6E-3_wp*(p+1.1_wp*e)*th**(0.8_wp) + a0 = 3.07E-4_wp + ap = 1.4_wp*(1-1.2_wp*f**(1.5_wp)*1E-5)*1E-10 + term2 = (2*a0*(gm0*(1+(f/gm0)*(f/gm0))*(1+(f/60._wp)**2))**(-1) + ap*p*th**(2.5_wp))*f*p*th*th + + ! Term3 + sumo = 0._wp + aux1 = 4.8_wp*e_th + do i=1,nbands_h2o + aux2 = f/v1(i) + aux3 = v1(i)-f + aux4 = v1(i)+f + gm = b3(i)*(p*th**(0.8)+aux1) + gm2 = gm*gm + x = aux3*aux3+gm2 + y = aux4*aux4+gm2 + fpp_h2o = ((1._wp/x)+(1._wp/y))*(gm*aux2) ! - (delt*aux2)*((aux3/(x))-(aux4/(x))) + s_h2o = b1(i)*eth35*exp(b2(i)*one_th) + sumo = sumo + fpp_h2o * s_h2o + enddo + term3 = sumo + + ! Term4 + bf = 1.4E-6_wp + be = 5.41E-5_wp + term4 = (bf*p+be*e*th*th*th)*f*e*th**(2.5_wp) + + ! Summation and result + npp = term1 + term2 + term3 + term4 + gases = 0.182_wp*f*npp + + end function gases + subroutine hydro_class_init(lsingle,ldouble,sd) + ! ############################################################################################## + ! Purpose: + ! + ! Initialize variables used by the radar simulator. + ! Part of QuickBeam v3.0 by John Haynes and Roj Marchand + ! + ! Inputs: + ! NAME SIZE DESCRIPTION + ! [lsingle] (1) Logical flag to use single moment + ! [ldouble] (1) Logical flag to use two moment + ! Outputs: + ! [sd] Structure that define hydrometeor types + ! + ! Local variables: + ! [n_hydro] (1) Number of hydrometeor types + ! [hclass_type] (nhclass) Type of distribution (see quickbeam documentation) + ! [hclass_phase] (nhclass) 1==ice, 0=liquid + ! [hclass_dmin] (nhclass) Minimum diameter allowed is drop size distribution N(DDmax)=0 + ! [hclass_apm] (nhclass) Density of partical apm*D^bpm or constant = rho + ! [hclass_bpm] (nhclass) Density of partical apm*D^bpm or constant = rho + ! [hclass_rho] (nhclass) Density of partical apm*D^bpm or constant = rho + ! [hclass_p1] (nhclass) Default values of DSD parameters (see quickbeam documentation) + ! [hclass_p2] (nhclass) Default values of DSD parameters (see quickbeam documentation) + ! [hclass_p3] (nhclass) Default values of DSD parameters (see quickbeam documentation) + ! Modified: + ! 08/23/2006 placed into subroutine form (Roger Marchand) + ! June 2010 New interface to support "radar_simulator_params" structure + ! 12/22/2014 Moved radar simulator (CLOUDSAT) configuration initialization to cloudsat_init + ! ############################################################################################## + + ! #################################################################################### + ! NOTES on HCLASS variables + ! + ! TYPE - Set to + ! 1 for modified gamma distribution, + ! 2 for exponential distribution, + ! 3 for power law distribution, + ! 4 for monodisperse distribution, + ! 5 for lognormal distribution. + ! + ! PHASE - Set to 0 for liquid, 1 for ice. + ! DMIN - The minimum drop size for this class (micron), ignored for monodisperse. + ! DMAX - The maximum drop size for this class (micron), ignored for monodisperse. + ! Important note: The settings for DMIN and DMAX are + ! ignored in the current version for all distributions except for power + ! law. Except when the power law distribution is used, particle size + ! is fixed to vary from zero to infinity, a restriction that is expected + ! to be lifted in future versions. A placeholder must still be specified + ! for each. + ! Density of particles is given by apm*D^bpm or a fixed value rho. ONLY specify ONE of these two!! + ! APM - The alpha_m coefficient in equation (1) (kg m**-beta_m ) + ! BPM - The beta_m coefficient in equation (1), see section 4.1. + ! RHO - Hydrometeor density (kg m-3 ). + ! + ! P1, P2, P3 - are default distribution parameters that depend on the type + ! of distribution (see quickmbeam documentation for more information) + ! + ! Modified Gamma (must set P3 and one of P1 or P2) + ! P1 - Set to the total particle number concentration Nt /rho_a (kg-1 ), where + ! rho_a is the density of air in the radar volume. + ! P2 - Set to the particle mean diameter D (micron). + ! P3 - Set to the distribution width nu. + ! + ! Exponetial (set one of) + ! P1 - Set to a constant intercept parameter N0 (m-4). + ! P2 - Set to a constant lambda (micron-1). + ! + ! Power Law + ! P1 - Set this to the value of a constant power law parameter br + ! + ! Monodisperse + ! P1 - Set to a constant diameter D0 (micron) = Re. + ! + ! Log-normal (must set P3 and one of P1 or P2) + ! P1 - Set to the total particle number concentration Nt /rho_a (kg-1 ) + ! P2 - Set to the geometric mean particle radius rg (micron). + ! P3 - Set to the natural logarithm of the geometric standard deviation. + ! #################################################################################### + ! INPUTS + logical,intent(in) :: & + lsingle, & ! True -> use single moment + ldouble ! True -> use two moment + + ! OUTPUTS + type(size_distribution),intent(out) ::& + sd ! + + ! SINGLE MOMENT PARAMETERS + integer,parameter,dimension(N_HYDRO) :: & + ! LSL LSI LSR LSS CVL CVI CVR CVS LSG +! HCLASS1_TYPE = (/5, 1, 2, 2, 5, 1, 2, 2, 2/), & ! + HCLASS1_TYPE = (/1, 1, 1, 1, 1, 1, 2, 2, 1/), & ! + HCLASS1_PHASE = (/0, 1, 0, 1, 0, 1, 0, 1, 1/) ! + real(wp),parameter,dimension(N_HYDRO) ::& + ! LSL LSI LSR LSS CVL CVI CVR CVS LSG + HCLASS1_DMIN = (/ -1., -1., -1., -1., -1., -1., -1., -1., -1. /), & + HCLASS1_DMAX = (/ -1., -1., -1., -1., -1., -1., -1., -1., -1. /), & +! HCLASS1_APM = (/524., 110.8, 524., -1., 524., 110.8, 524., -1., -1. /), & +! HCLASS1_BPM = (/ 3., 2.91, 3., -1., 3., 2.91, 3., -1., -1. /), & +! HCLASS1_RHO = (/ -1., -1., -1., 100., -1., -1., -1., 100., 400. /), & + HCLASS1_APM = (/524., -1., 524., -1., 524., -1., 524., -1., -1. /), & + HCLASS1_BPM = (/ 3., -1., 3., -1., 3., -1., 3., -1., -1. /), & + HCLASS1_RHO = (/ -1., 500., -1., 250., -1., 500., -1., 250., 500. /), & +! HCLASS1_P1 = (/ -1., -1., 8.e6, 3.e6, -1., -1., 8.e6, 3.e6, 4.e6/), & +! HCLASS1_P2 = (/ 6., 40., -1., -1., 6., 40., -1., -1., -1. /), & +! HCLASS1_P3 = (/ 0.3, 2., -1., -1., 0.3, 2., -1., -1., -1. /) + HCLASS1_P1 = (/ -1., -1., -1., -1., -1., -1., 8.e6, 3.e6, -1. /), & + HCLASS1_P2 = (/ 6., 40., 20., 40., 6., 40., -1., -1., 60. /), & + HCLASS1_P3 = (/ 1., 1., 5., 1., 1., 5., -1., -1., 1. /) + + ! TWO MOMENT PARAMETERS + integer,parameter,dimension(N_HYDRO) :: & + ! LSL LSI LSR LSS CVL CVI CVR CVS LSG + HCLASS2_TYPE = (/ 1, 1, 1, 1, 1, 1, 1, 1, 1/), & + HCLASS2_PHASE = (/ 0, 1, 0, 1, 0, 1, 0, 1, 1/) + + real(wp),parameter,dimension(N_HYDRO) :: & + ! LSL LSI LSR LSS CVL CVI CVR CVS LSG + HCLASS2_DMIN = (/ -1, -1, -1, -1, -1, -1, -1, -1, -1/), & + HCLASS2_DMAX = (/ -1, -1, -1, -1, -1, -1, -1, -1, -1/), & + HCLASS2_APM = (/524, -1, 524, -1, 524, -1, 524, -1, -1/), & + HCLASS2_BPM = (/ 3, -1, 3, -1, 3, -1, 3, -1, -1/), & + HCLASS2_RHO = (/ -1, 500, -1, 100, -1, 500, -1, 100, 900/), & + HCLASS2_P1 = (/ -1, -1, -1, -1, -1, -1, -1, -1, -1/), & + HCLASS2_P2 = (/ -1, -1, -1, -1, -1, -1, -1, -1, -1/), & + HCLASS2_P3 = (/ -2, 1, 1, 1, -2, 1, 1, 1, 1/) + + integer,parameter,dimension(N_HYDRO) :: & + ! type1 -> p1*D^p2 ; type2 -> Posselt and Lohmann (2008) Eq.11 + ! LSL LSI LSR LSS CVL CVI CVR CVS LSG + ftype = (/ 2, 1, 2, 1, 2, 1, 1, 1, 1 /),& + fvscs = (/ 0, 0, 0, 0, 0, 0, 1, 1, 0 /) + + real(wp),parameter,dimension(N_HYDRO) :: & + ! LSL LSI LSR LSS CVL CVI CVR CVS LSG + f1 = (/ 9.65 , 1.107 , 9.65 , 3.321 , 9.65 , 1.107 , 8.42E+2, 4.84 , 19.3 /),& + f2 = (/ 10.43 , 0.22 , 10.43 , 0.22 , 10.43 , 0.22 , 0.8 , 0.25 , 0.37 /),& + f3 = (/ 6.00E+2, 0.00 , 6.00E+2, 0.00 , 6.00E+2, 0.00 , 0.00 , 0.00 , 0.00 /) + + if (lsingle) then + sd%dtype(1:N_HYDRO) = HCLASS1_TYPE(1:N_HYDRO) + sd%phase(1:N_HYDRO) = HCLASS1_PHASE(1:N_HYDRO) + sd%dmin(1:N_HYDRO) = HCLASS1_DMIN(1:N_HYDRO) + sd%dmax(1:N_HYDRO) = HCLASS1_DMAX(1:N_HYDRO) + sd%apm(1:N_HYDRO) = HCLASS1_APM(1:N_HYDRO) + sd%bpm(1:N_HYDRO) = HCLASS1_BPM(1:N_HYDRO) + sd%rho(1:N_HYDRO) = HCLASS1_RHO(1:N_HYDRO) + sd%p1(1:N_HYDRO) = HCLASS1_P1(1:N_HYDRO) + sd%p2(1:N_HYDRO) = HCLASS1_P2(1:N_HYDRO) + sd%p3(1:N_HYDRO) = HCLASS1_P3(1:N_HYDRO) + endif + if (ldouble) then + sd%dtype(1:N_HYDRO) = HCLASS2_TYPE(1:N_HYDRO) + sd%phase(1:N_HYDRO) = HCLASS2_PHASE(1:N_HYDRO) + sd%dmin(1:N_HYDRO) = HCLASS2_DMIN(1:N_HYDRO) + sd%dmax(1:N_HYDRO) = HCLASS2_DMAX(1:N_HYDRO) + sd%apm(1:N_HYDRO) = HCLASS2_APM(1:N_HYDRO) + sd%bpm(1:N_HYDRO) = HCLASS2_BPM(1:N_HYDRO) + sd%rho(1:N_HYDRO) = HCLASS2_RHO(1:N_HYDRO) + sd%p1(1:N_HYDRO) = HCLASS2_P1(1:N_HYDRO) + sd%p2(1:N_HYDRO) = HCLASS2_P2(1:N_HYDRO) + sd%p3(1:N_HYDRO) = HCLASS2_P3(1:N_HYDRO) + endif + + sd%ftype = ftype + sd%fvscs = fvscs + sd%f1 = f1 + sd%f2 = f2 + sd%f3 = f3 + + end subroutine hydro_class_init + + subroutine fall_velocity(nsizes,D0,sd,p_matrix,t_matrix,tp,fall) + implicit none + integer,intent(in) :: & + nsizes,tp + real(wp),intent(in), dimension(nsizes) :: & + D0 ! [m], equivalent volume spheres + type(size_distribution),intent(in) :: & + sd + real(wp),intent(in) :: & + p_matrix,t_matrix + real(wp),intent(out),dimension(nsizes) :: & + fall ! positive = ascending, [m/s] + + ! internal work + real(wp) :: rho,rho0 + integer,parameter :: & ! same index as in subsample_and_optics + LSCLIQ = 1, & + LSCICE = 2, & + LSRAIN = 3, & + LSSNOW = 4, & + CVCLIQ = 5, & + CVCICE = 6, & + CVRAIN = 7, & + CVSNOW = 8, & + LSGRPL = 9 + real(wp),dimension(N_HYDRO) :: vscs_fct + + rho0 = 101300/273.15/287 + rho = p_matrix/t_matrix/287 + vscs_fct = merge(sqrt(rho0/rho),1._wp,sd%fvscs==1) + + if (sd%ftype(tp) == 1) then + ! p1 * D^p2 + fall = -1 * vscs_fct(tp) * & + ( sd%f1(tp) * D0**sd%f2(tp) + sd%f3(tp) ) + else if (sd%ftype(tp) == 2) then + ! Posselt and Lohmann (2008), Eq.11 + fall = -1 * vscs_fct(tp) * & + ( sd%f1(tp) - sd%f2(tp)*exp(-1*sd%f3(tp)*D0) + (sd%f2(tp)-sd%f1(tp))*exp(-5*sd%f3(tp)*D0) ) + else + write(*,*) 'WARNING: size_distribution, undefined ftype; STOP' + stop + end if + + end subroutine fall_velocity + +end module mod_quickbeam_optics diff --git a/driver/check/.ipynb_checkpoints/COSP2_global-map-checkpoint.ipynb b/driver/check/.ipynb_checkpoints/COSP2_global-map-checkpoint.ipynb new file mode 100644 index 0000000000..172fc48830 --- /dev/null +++ b/driver/check/.ipynb_checkpoints/COSP2_global-map-checkpoint.ipynb @@ -0,0 +1,260 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "cf1bab3d-ca36-498f-983d-9ac15198597a", + "metadata": { + "jupyter": { + "source_hidden": true + } + }, + "outputs": [], + "source": [ + "import xarray\n", + "import pygmt\n", + "import pandas\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "id": "5292ce3c-d43f-4ffd-8151-ba2d81658dc3", + "metadata": {}, + "source": [ + "## This is global map figure" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "1050bc03-232b-4b98-a74b-e0018328d31d", + "metadata": {}, + "outputs": [], + "source": [ + "# valid only for variables with following shape: (loc).\n", + "\n", + "vname='cltatlid'\n", + "vmin=0.\n", + "vmax=100." + ] + }, + { + "cell_type": "markdown", + "id": "2317395a-d769-479a-806a-eee0285f3d1e", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "### internal work" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b0efb38e-f221-4943-a019-581e93556deb", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xarray.open_dataset(\"../data/MIROC_outputs/ctrl_MIROC-COSP2.nc\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "65ec4419-02fe-4e9a-9f3d-50513d55cb91", + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "\n", + "var=ds[vname].values\n", + "\n", + "lat=ds[\"latitude\"].values\n", + "lon=ds[\"longitude\"].values" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "5df1e741-aa79-4bde-b5fa-e0bf3e5dcbbd", + "metadata": {}, + "outputs": [], + "source": [ + "mask = (var >= vmin) & (var <= vmax)\n", + "data = np.column_stack([lon[mask], lat[mask], var[mask]])" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "e77e1cd0-4ccf-4a6c-b700-5c1eb56a2fa9", + "metadata": {}, + "outputs": [], + "source": [ + "check_rows = np.isfinite(data).all(axis=1)\n", + "Nerror = np.where(~check_rows)[0]\n", + "\n", + "if Nerror.size > 0:\n", + " raise ValueError(\"invalid data\")\n", + "\n", + "if data.size == 0:\n", + " raise RuntimeError(\"no valid points\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "4c550b99-7ca3-464f-a6f1-38b3f124d014", + "metadata": {}, + "outputs": [], + "source": [ + "fig = pygmt.Figure()\n", + "region = [-180, 180, -75, 75]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "4965afac-3f2c-448c-ace7-2886ffb00fdd", + "metadata": {}, + "outputs": [], + "source": [ + "tbl_block = pygmt.blockmean(\n", + " data=data,\n", + " region=region,\n", + " spacing=\"1.5d\"\n", + ")\n", + "\n", + "grid = pygmt.surface(\n", + " data=tbl_block,\n", + " region=region,\n", + " spacing=\"1.5d\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "bddcfba4-0c3d-4060-ae86-64738174caa3", + "metadata": {}, + "outputs": [], + "source": [ + "gxyz = pygmt.xyz2grd(\n", + " data=data,\n", + " region=region,\n", + " spacing=\"1.5d\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "34824734-03a7-4643-98b7-b98c8f41b400", + "metadata": {}, + "outputs": [], + "source": [ + "fig.coast(\n", + " region=region,\n", + " projection=\"W15c\",\n", + " frame=\"afg\",\n", + " land=\"lightgray\",\n", + " water=\"white\"\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "4e557933-95ff-482e-a729-aa6b5996ab3e", + "metadata": {}, + "outputs": [], + "source": [ + "fig.grdimage(\n", + " grid=gxyz,\n", + " cmap=\"turbo\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "de1908e4-92e5-4591-9181-0c41b65aa48f", + "metadata": {}, + "outputs": [], + "source": [ + "fig.colorbar(frame='af+l\"Total Cloud Cover (%)\"')" + ] + }, + { + "cell_type": "markdown", + "id": "1dd9302c-8fcd-4870-a667-d21bd295da05", + "metadata": {}, + "source": [ + "### result" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "5b18919b-7518-469c-8b1b-c6d21c99d612", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "metadata": { + "image/png": { + "width": "80%" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "fig.show(width=\"80%\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fe996e44-9a38-4f18-bd8d-50735fb5b8b6", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ee5ac3d9-4e0d-48f0-9b2e-481bda326725", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/driver/check/.ipynb_checkpoints/COSP2_zonal-mean-checkpoint.ipynb b/driver/check/.ipynb_checkpoints/COSP2_zonal-mean-checkpoint.ipynb new file mode 100644 index 0000000000..bc07f697df --- /dev/null +++ b/driver/check/.ipynb_checkpoints/COSP2_zonal-mean-checkpoint.ipynb @@ -0,0 +1,208 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "54f959e2-ee4f-4720-ad04-e37b8dcd8bde", + "metadata": { + "jupyter": { + "source_hidden": true + } + }, + "outputs": [], + "source": [ + "import xarray\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib.colors import ListedColormap,LinearSegmentedColormap\n", + "from matplotlib.ticker import MultipleLocator\n", + "import matplotlib.ticker as mticker" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "2f901612-cbe6-4dfe-acd8-12d0097973f7", + "metadata": {}, + "outputs": [], + "source": [ + "# valid only for variables with following shape: (levStat, loc).\n", + "\n", + "vname=\"clatlid\"\n", + "\n", + "vmin=0.\n", + "vmax=100." + ] + }, + { + "cell_type": "markdown", + "id": "8e71e2f0-fc47-4140-98b4-e0d7492d835b", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "### internal work" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "9a2a0996-b59b-4f5f-a74c-06ac6e3f075c", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xarray.open_dataset(\"../data/MIROC_outputs/ctrl_MIROC-COSP2.nc\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "3e978297-3afd-426e-bb95-6512458516f9", + "metadata": {}, + "outputs": [], + "source": [ + "lat = ds[\"latitude\"]\n", + "lon = ds[\"longitude\"]\n", + "lev = ds[\"levStat\"]\n", + "\n", + "var = ds[vname]\n", + "var = var.where((var >= vmin) & (var <= vmax))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "2d26d842-eed2-4663-bab1-aef67eb24d3b", + "metadata": {}, + "outputs": [], + "source": [ + "var = var.assign_coords(latitude=(\"loc\", lat.data))\n", + "var_zonal = var.groupby(\"latitude\").mean(\"loc\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "96bbc0ad-da9c-4386-b9b5-426387b422a3", + "metadata": {}, + "outputs": [], + "source": [ + "colors=np.array(\n", + " [\n", + " [248,248,248,1],#white\n", + " [160,210,255,1],\n", + " [ 33,140,255,1],\n", + " [ 0, 65,255,1],\n", + " [ 0,185, 0,1],\n", + " [250,245, 0,1],\n", + " [255,153, 0,1],\n", + " [255, 40, 0,1],\n", + " [180, 0,104,1],\n", + " [ 45, 45, 45,1],\n", + " ],dtype=np.float64\n", + ")\n", + "colors[:,:3] /=256\n", + "color_listed=ListedColormap(colors)\n", + "color_linear=LinearSegmentedColormap.from_list('color_linear',colors=colors)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "7158e1b2-3ad4-407a-9dff-4d0311afa2c2", + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "\n", + "fig, ax = plt.subplots(figsize=(12,7))\n", + "\n", + "pcm = ax.pcolormesh(\n", + " var_zonal.latitude,\n", + " var_zonal.levStat,\n", + " var_zonal,\n", + " shading=\"auto\",\n", + " vmin=vmin,\n", + " vmax=vmax,\n", + " cmap=color_linear\n", + ")\n", + "\n", + "ax.set_title(\"zonal mean: \"+vname, fontsize=32, pad=16)\n", + "\n", + "ax.xaxis.set_major_locator(MultipleLocator(30.))\n", + "ax.set_xlabel(\"latitude\",fontsize=22)\n", + "\n", + "ax.yaxis.set_major_locator(MultipleLocator(3000.))\n", + "ax.yaxis.set_major_formatter(\n", + " mticker.FuncFormatter(lambda y, pos: f\"{y/1000:g}\")\n", + ")\n", + "ax.set_ylabel(\"level (km)\",fontsize=22)\n", + "ax.tick_params(axis='both', which='major', labelsize=18)\n", + "\n", + "cbar = fig.colorbar(pcm, ax=ax, pad=0.02)\n", + "cbar.set_label(\"\", fontsize=13)\n", + "cbar.ax.tick_params(labelsize=16)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "97208430-407f-44b8-8f52-16c38e312aaa", + "metadata": {}, + "source": [ + "### Figure" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "be27ca04-76ab-46e4-90fb-711aae66ad44", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA8UAAAKrCAYAAADYuy/yAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAm1VJREFUeJzt3QeYFOX9wPHf7t7tFe44uihSbIgtKPauEVEUu8YuoEax/aOiRqIRjAqxm0SNMYKIkaCIJWoExdiwIfYCVkA6AnJwXNnb8n/e1+zlyvu7u7nbvdu7+X6eZ7jl3Zl33pl5Z3bffVsgkUgkBAAAAAAAHwq2dgIAAAAAAGgtFIoBAAAAAL5FoRgAAAAA4FsUigEAAAAAvkWhGAAAAADgWxSKAQAAAAC+RaEYAAAAAOBbFIoBAAAAAL5FoRgAAAAA4FsUigGgHQgEAjUWAA3r169fjftm0aJF7e60HXLIITWO8bXXXqt3/cmTJ9dYf8SIEWlPI88vAK2NQjEAAAAAwLeyWjsBAAAAqOnjjz+WZ555pur/u+66qxx//PGcJgBIAwrFAAAAGVgovvHGG6v+P3z4cArFAJAmNJ8GAAAAAPgWNcUAAACwzMBaLTG4FgBkEmqKAQAAAAC+RaEYAAAAAOBbFIoBAAAAAL5Fn2IAGaekpETefvttWbZsmfz4448SCoWkR48e0rdvX9lnn30kHA6nZb8rV660+124cKFUVFRIly5dpF+/fnLggQdKhw4dmh2/OZ758+fL999/L8XFxVJZWSmdOnWSrl27ym677Sb9+/eXti6RSNhRc82yevVq+/8ttthC9t13X9luu+0a3N6ck/fee08+//xzWbdunT3vvXr1kkMPPdSep1T56aef5J133pFVq1bZPJaVlSXdu3e3adxzzz1tnmuu9evXy5dffinffPONPZbS0lIpLCyUzp07y/bbby+DBg2y+02HWCwm77//vnz66aeyZs0ayc3Ntce311572X23deb+effdd+09a47P3K8dO3aUPn36yE477STbbLNNi6TD5Nevv/5aFixYICtWrJANGzZIdna2fXaYfG+eV+Z6+5G5t5LPcXO9zHkYMGCA7LfffjY/AkBGSQCAw/DhwxPmEZGK5eGHH27UOZ49e3Zi8ODBiXA4rMZVUFCQOPnkkxOffvqpp+s2duzYGvGY/yfNnTs3ccQRRyQCgYBznyY9I0eOTCxdutTTPisqKhLPPvtsYsSIEYm+ffs2eJ569OiRuOaaaxIrVqxIeFU7rnQ5+OCDa+zn1VdfteGxWCxx//3313ucBx10UOLDDz90xltcXJz43e9+l+jSpYtz21AolDj99NMTy5Yta3Lao9GozYv77LOPjU9Lp0nDqFGjEsuXL/e8j3feeSdx5ZVXJgYOHKjmp+TSoUMHe0wfffRRyq53eXl54uabb7Z5Sdtv//79E//85z8TbU0kEkk88MADib322qve62eWLbfcMnHBBRck3n333XrjrJ1fFy5c2GA6TL6455577DPDXMP60mHywO6775549NFHE5WVlQ3GbfJnU5+z5li83LONTYP5LPBi3rx59jmuXSNzzi699NLEmjVrWvz5BQAanjwAWr1QvH79+sSwYcM8xRkMBhOXXHJJo75o1lco/uMf/9jgF+zk0q1bt8T777/f6Byz2WabNel8mS+N06dP95QzW+pLpesLtrl+hx12WKOOLScnJzFjxowacX722WeJrbfeulHb9+zZMzF//nzP6TbXbccdd/R0HfLz8xOTJk1q9D5OPfXUJt8jY8aMsT8sNOd6f//994mdd9650fs8//zz7Q8FzXkmtJSZM2cm+vTp06Rzu2jRopQVip9//nn77GlKOvbYY4/EkiVL2nWh2DxXG/s8Nfdy8nnaWvkKAJLoUwygVZkmh6Z58vPPP+98v6CgQPLy8uqEx+Nxue++++S4446TsrKyJu37D3/4g1x77bW2qWmSac5qmj66ms+aZppHHnmkbRbY2OazLsl9mOaegUCgzvubNm2SU045RaZMmSKZzjRbHTZsmLzyyis1wk0z4fz8fOf6Z555pm1ebZimp6ZptGlSnmTOiWlW7momb5rLDh061DZFbqxnnnlGDj74YNuUuTazr6KiImfzeLOPc889V/74xz8263qbfZhrbZqPas2yJ0yYIL/+9a+lqZYuXWqP0TQ7r30dtKb/Dz30kIwdO1Yy3V133SVHH320/PDDD873c3Jy1HvW+LnMlRobN260zx4X0yTYNPHXmgbPmzdP9t57b5uH26Pf/va3cuONN9Z4nla/RuYeqM6chyFDhtjuBQDQ2uhTDMBp+PDhtj+cV2+99Zb84x//qBGmfVk1X55+9atfyWeffVYj3PQ7+93vfmcLW8n+eMuXL5ennnpKbrnllhpfKv/973/Lb37zG3nwwQc9pXPWrFm276ph9jF69Gg58cQT7b5NIcakzfSHu/nmm+Wll16q2m7t2rVy1VVXyaOPPtqo/ZhjN+fRHIv5QrzLLrtIt27dahQSTb/Pp59+Wu6//37b9y7poosusttkch/QG264QebOnWtfm7645ovx4YcfXvUFePHixfL3v/9dbrvtNtv/0igvL5dLL73UFqRPOOEE+2ODOeennnqqXHjhhbbPYbJA/NFHH9lrPmPGjKp9Llq0yIaZpSHmGpofGKLRaFWYud5mP2bfpi+36QOavLbmWt96663yySefVK1v8uLAgQNtYbwxdthhB1uIM4XUnXfe2faFT/74YQpU5ocAs5977723RoFg0qRJ9geCs846S7wy99GSJUvs68GDB8v//d//ySGHHGILxYa5Z/75z3/aQkv1PGaO1ezP5PtMNHnyZHtv1maunUm3OUZTIE4yBWdT+DQ/spkfQ0zf8XQwP9qYH8iOOOII2XXXXe35q14YNv3UTZ91c02fffbZqnDzHDPpnj17tjNe0/f+r3/9q31ttq/+w5h5jpjnsiZ5rVvD448/bu/x6swzwPzoeNppp8lWW21lw0yf6xdffNH+CGTuMXN9zj777FZKNQBUU1VnDADN9Pnnnyc6depUpx+p6efoMmHChDrN5s444wx1fWPdunWJ/fbbr852//rXvzw1n04ue+65Z2LlypXqdvF43PYJrt3HePXq1Q2eD9MktjF9FJNMOkx/yaY0XWyp5oe1m2Iml6uuusqeK83UqVPrbHPsscfav7m5uYmnnnqq3v2apr7Vt+3evbvtY1qftWvXJnr37l1jO9PMu77rbZgm+RdffHGN7Uwf3U2bNtW73Z///Gfbp7ixTD43/V6r78c0I29MM2rXNcjKyko8+OCD9W73ySefJAoLC2tsd/nll2dk82kzboDJG7W7MLz++uuN2t5crz/96U+JVatWpaz59Jw5cxITJ05MlJWVNfo4TJNr0xTfSxPmVPTtbanm0+Y+M/dj9W222WabxOLFi+u9x84991y1aTUAtDSePABSwvSVM4PbVP9iY/o3/vTTT871S0tLE127dq2xvvny1pg+wqYPa79+/eoUbr0Wik2ByXyha0hJSUmd/sF///vfE+lgBp8xX/yr98FtTBpbs1Bs+tI2htbvuKGCXHIg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TzxR+vbtK4FAwC7jxo1rVBxPPvmkHHPMMbLFFltIOByWDh06yPbbby+//vWv5eOPP077MQAAAABAY0efTvfiR226+fTcuXPlqKOOatK2FRUVcsopp8hzzz1XFVZQUCCRSES+/vpru0yaNEnuuOMOueKKK1KYagAAAABApmjzPwV07txZDjvsMLn66qvln//8p/Ts2bNR240fP76qQHzxxRfL0qVLZePGjVJWVibz5s2TAw44QOLxuIwePVo++OCDNB8FAAAAADTQp7gFFj9q0zXFBx54oKxbt65G2LXXXtuobadMmWL/HnzwwXLfffdVhQeDQdl9993l+eefly233FJKSkpsE2sTBgAAAABoX9p0oTgUavo8XStWrLB/99hjD+f7RUVF0r9/f/nwww9twRgAAAAAWksoEZCsNPf5jSUC4kf+rB8Xka233tr+1ZpGFxcX237F9RWcAQAAAABtm28LxRdddJH9+9prr8kll1wiy5Yts/9PJBK2dnjYsGG2hnjfffeVs846q5VTCwAAAMDP6FOcPr4tFJuC8DXXXGP7EN9///22/3BhYaHk5uba/sPffvut7Z/8yiuvNNhM24xkvWHDhhoLAAAAACDz+bZQbArDEyZMsNMumamYDFMzbKZkMsrLy20T6k2bNjUYl4nH9EFOLr179057+gEAAAD4B/MUp49vC8Vr1qyxUzmNGDHCNpGeM2eOrF+/3g7A9dRTT0n37t3lr3/9q+y9995VTas1Y8aMsQXo5LJkyZIWOw4AAAAAgE9Hn26O4cOH2/7EZkqmWbNmSSDw80hrpqb3hBNOkP3331922mkn+f77720z6kcffVSNKycnxy4AAAAAgLbFlzXF8+fPl3//+9/29ejRo6sKxNX16NFDzjnnHPva1BybAbgAAAAAoNWaT8fTvCR8WTz0Z6H4yy+/rHq9zTbbqOttt9129m9paamsXr26RdIGAAAAAGg5WX4dZCtp8eLFsuOOOzrXW7VqVdXr5GBcAAAAANDSQvGgZAXSW6cZpabYPwYNGlT12gym5WJGnZ4yZYp9/Ytf/EI6dOjQYukDAAAAALSMNt98+qeffrIjSSeXeDxe1eS5eriZbimpb9++cswxx9jXzz33nJx99tny3Xff2X7DlZWV8vbbb8shhxxiB9lK9jsGAMBPYglvCwAgvZiSKX0CiTY+glS/fv1s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sWPH2qbQLm+99ZaceOKJkpWVJVOnTpVf/vKXEg6HbfiVV14p5513nn1tBtDKVBSKAQAAACDDhQIxCQXiad5Hwv5dsmRJjdpdrZbYjCp9wgkn2DmFTW3x3nvvXfXesGHDbE3xLrvsIpMmTZKzzjpLDj300Kom02ZOY01JSYn9Wz0N6dTmB9oynbRffPFFOwS4+YXCjFZmJoo2i/ZrRpJ5P7lufYuZYwsAAAAA/KBjx441Fq1QbPoQ//jjj7L11lvXKBAnVQ+fPXu2/duvX7+qAnWyKXVtplBefd10a/M1xXPnzrUdu5vDzKfVpUsX9X3TFAAAAAAAWkswGJVgML39P4LirY/MDz/80GCNblFRkf27bt26qj7IZj5iU7k5b948W3tcmwk3Bg0aJC2hzdcUG507d5bDDjtMrr76avnnP/8pPXv29LT9fvvtJytXrlSXlvqFAgAAAADail69etm/CxYskOLi4jrvmymaPvzwQ/t6q622sn9Nf+Ojjz7avjZ9kGtbvHixvP322/a1aZrdEtp8odjMi2V+dTDV8bfddpucdtppniaRBgAAAIC20ac4/YsXZv5hM4q0mYv417/+dVVfYCMSicgVV1xha5NNy9yTTz656r1rr73WdlN9+OGHZebMmVXhpvbYDMwVi8XkpJNOkgEDBkhLaPPtgs0cWAAAAACAltW9e3d54IEHZOTIkTJ9+nR57bXXZM8997SFYNME2kzPFAwG5c9//rPtX5xkmkXfeeeddnRq0xX24IMPlh49esibb74pK1assE2sTbwtpc3XFAMAAAAAWsdZZ51lC8AjRoywI0u/8sordiBkMy7TmWeeaUelHjVqVJ3tTC3yyy+/LEcccYR8+umn8uyzz9r5iceMGSPvv/++dOvWrcWOoc3XFKfCF198ITvvvLN8//339pcM0zb+oIMOkosvvlh222231k4eAAAAAJ8LSVSdxz11+0g0abuBAwfaptBeDR482C6tjZpiETuv1vz58yUvL08qKirk66+/loceekh23313uf766xs8iWabDRs21FgAAAAAAJnP14Xi7bbbzg7O9dVXX0l5ebmsXbvWTiI9a9YsWyBOJBJyyy232Pbu9ZkwYYIdajy59O7du8WOAQAAAIBfpmRK/+JHvi4UmzbuZhqn/v37287gySHChwwZInPmzLGdxI1x48Y5hxhPMu3e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zZo1DY4ibfoTG+ZvcjTm6su4ceMaNfr05MmTbfjIkSOrwsxrV5zVmZGfk+ENNc1O7sMs5nV93nvvPTnzzDOld+/ekpubK7169ZIjjzxSnnjiCWmKN954Qy644ALZYYcd7KBkJk4T90knnSQzZsyQRCLRpHgBAMhk9CkGAGSkKVOmyPDhw53v/fjjj3Z588035fbbb5epU6fK0UcfLX5iCvI33XSTxOPxqrDly5fbZdasWTJ9+nQZP358o+IyI3OfffbZ8vzzz9d5b+nSpXZ56qmn7A8RpnDcrVu3lB4LAACtiUIxACAjlZaW2trSgQMH2sLYgAEDpEuXLvY9U0ibPXu2zJw5UzZs2GBrMt9++20ZNGhQjTgefPBBG4+p/TSF6O7du9uw2kzcjfHLX/5Snn76afnPf/4jf/nLX2zYZZddZsNb0t133101+rVhatKHDh0qhYWFMn/+fJk0aZI8+eSTNQrMGnP+9t9/f/nyyy/t/02N/CmnnGJri02t/Pfffy///Oc/5dNPP7U1yYMHD5Z3333X1iIDANAeUCgGAGSkAw880Daf3nbbbZ3vjx492haMjzvuOFvwveaaa+z/qxsyZIj9m5yGKT8/384r3FR9+vSxi6lZTTIF8ebE6ZUppP7ud7+zr0OhkEybNk1OPvnkOudm2LBhtna3IRdeeGFVgdjUPl9//fU23urMuTXLnXfeKZ988olttm4WAADaA/oUAwAy0k477aQWiJNMreWVV15pX7/yyiuybNkyae/uvfdeKS8vt6+vuOKKOgVio2PHjvL444/bmuP6mNpfU6g2zjvvPBk7dmydArERDAbljjvusDXKyTRUVFSk6IgAAGhdFIoBAG3aAQccUPXaNOtt75K1v6agagrFms0331zOOuuseuN65JFHql6bmuCGnHPOOfZvcXGxHeQLAID2gObTAICMNmfOHNunde7cubbp8MaNG6WystK5rulr3J6tXr26aiRt0w96iy22qHf9ww47TP7617+q75s+wobpH2yaUCebUWuq18SbdU1fbwAA2joKxQCAjFRSUmJrOp999tlGb2MGjWrPzMjSSQ01LW/MOsnpoUxzbDNYlxfr1q3ztD4AAJmKQjEAICOdeuqp8u9//9u+7tChg51yabfddrO1o2bArKysnz/CPv/8c/n9739vX8diMWnvPxQkmXPQEHPe6lN9wDCvIpFIk7cFACCTUCgGAGSct956q6pAvMsuu8hLL70kPXv2dK6bnZ0t7Ul9BfuCgoKq12bE7YZs2rSp3vdNfKZgbKa6Wrt2rceUAgDQPjDQFgAg45hCcNL48ePVArGxcOFCyXQ5OTmNrmFds2aN+l71PsTffvttg/ttaJ0tt9zS/jUF4+q10AAA+AmFYgBAxlm5cmWj+8W++OKLDcZnRmo2EolEClL3v/gaG2fnzp2rXjc0bdTbb7+tvtejRw/p16+ffb1gwYIafYxdzDRV9Tn44IPt33g8LrNmzap3XQAA2isKxQCAjFO9L2x9tZ3vvPNOowrFyWbHDTUnbqzqzZgbE6eZczlp9uzZ6npfffVVVbNxTXJALFOQ/dOf/qSut2rVKnnssccaNcWS8Yc//KFq/mMAAPyEQjEAIOPsueeeVa9vvPFGZ2Ht008/lZNPPrlRNbVbbbWV/Wv6zf7www/NTl8yPuPDDz9scP3DDz+8amCw++67z1nQNzXIJ510kkSj0XrjuvTSS+0USsZdd90lTz/9dJ11zLRVZqCyhkbj3muvveSUU06pOp/HHXec/Pjjj+r65lyb/t5XXXVVvfECANCWMNAWACDjnHjiidKnTx9bgJ03b55sv/32cv7559um1GaAqddff12mTZtm5ysePny4PPLII/XGN3jwYPnXv/5VVdM6atQo6dWrV1UzaBNvY6Y4SjKDf2222Wa2NvYf//iHdOvWTfbZZ58aI0IfeeSRVa9Nn2hTKztp0iQpLi62hdGLLrpIfvGLX0hFRYW8//779hjMsZnC7OOPP67ue+utt7b9rK+88kpbgDbnyixDhw6VwsJCmT9/vt3PkiVLbPhTTz1V77FMnDhRvv76a/nkk09sX27TPNsUzs3xdO/e3Z5jc5ym0Gxquc1c0Ntss43ccccdjT5fAABktAQAAK1g4cKFporXLsOHD6/z/rx58xLdunWrWqf2EgqFEn/84x8Tr776alXY2LFjnfsqKSlJDBgwQI2r9nZ9+/a14eav5qGHHlLjc328rl+/PrH33nur6+fl5SWmTJmSePjhh6vCzGvNDTfckAgEAmp8p5xySuLrr7+u9xwnbdy4MXH22WfXG1/15eCDD1bjAgCgraH5NAAgI+2+++62dnL06NG2ptg0GTZ9efv37y8XXnihzJ07V3772982uo/yu+++KzfccIPsscceUlRUVGOwrKY477zz5OWXX7a1qqZWO9mkWWP2aWq477nnHtl7772lY8eOdhtT63rxxRfLRx99JGeffXaj92+alZtBuU4//XRb6x0Oh2XzzTeXI444wtaiP/HEE42ersqc1ylTptg5n6+++mpbk21qiU2Tb1P73bdvXxkyZIiMGzdO3nvvPXnttdcanU4AADJdwJSMWzsRAAAAAAC0BmqKAQAAAAC+RaEYAAAAAOBbFIoBAAAAAL5FoRgAAAAA4FsUigEAAAAAvkWhGAAAAADgWxSKAQAAAAC+RaEYAAAAAOBbFIoBAAAAAL5FoRgAAAAA4FsUigEAAAAAvkWhGAAAAADgWxSKAQAAAAC+RaEYAAAAAOBbFIoBAAAAAOJX/w+WOECBEpCrQQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(fig)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9bb7d525-f727-4fbd-bc95-126111f52d0c", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/driver/check/.ipynb_checkpoints/EC_check-checkpoint.ipynb b/driver/check/.ipynb_checkpoints/EC_check-checkpoint.ipynb new file mode 100644 index 0000000000..dd8cd18dcf --- /dev/null +++ b/driver/check/.ipynb_checkpoints/EC_check-checkpoint.ipynb @@ -0,0 +1,582 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "887c003d-0904-4443-b0a8-d2c2675e4263", + "metadata": { + "jupyter": { + "source_hidden": true + } + }, + "outputs": [], + "source": [ + "import xarray\n", + "import pygmt\n", + "import pandas\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib.colors import ListedColormap,LinearSegmentedColormap\n", + "from matplotlib.ticker import MultipleLocator\n", + "from IPython.display import display" + ] + }, + { + "cell_type": "markdown", + "id": "4065b987-8ecd-4aa5-aa85-760c8a90cd14", + "metadata": {}, + "source": [ + "### config" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cb5587d5-bcc4-4023-b0ae-e28743fc0e76", + "metadata": {}, + "outputs": [], + "source": [ + "# variables\n", + "\n", + "#vname='Doppler velocity'\n", + "vname='radar reflectivity'\n", + "#vname='terminal velocity'\n", + "#vname='vertical air motion'\n", + "#vname='Ze-Doppler'\n", + "#vname='Ze-terminal'" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "5a951cf4-47ec-439a-bd6a-5b71e6ff3239", + "metadata": {}, + "outputs": [], + "source": [ + "# meridional zone\n", + "\n", + "zone='tropics'\n", + "#zone='mid-north'\n", + "#zone='pol-north'\n", + "#zone='mid-south'\n", + "#zone='pol-south'" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "25a7ea7c-98c0-4b2d-8174-d2995d734cb4", + "metadata": {}, + "outputs": [], + "source": [ + "# cloud regime\n", + "#ctype='ALL'\n", + "ctype='stratiform'\n", + "#ctype='convective'" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "950f2697-2451-4634-816b-139f78f8e0ea", + "metadata": {}, + "outputs": [], + "source": [ + "# only for Doppler or terminal or air velocity\n", + "\n", + "zonal_mean_flag = False\n", + "# True: zonal mean\n", + "# False: CFED" + ] + }, + { + "cell_type": "markdown", + "id": "414f7d1c-1b87-4fce-a618-92cb0b56a08c", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "### internal process" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "3295478a-ad57-45a5-924d-89965bf9a1cc", + "metadata": {}, + "outputs": [], + "source": [ + "Nlvdplr = 80\n", + "Nlvtemp = 57\n", + "NlvdBZe = 35\n", + "\n", + "temp = -79.0 + 2.0 * np.arange(Nlvtemp)\n", + "zgrd = -39.0 + 2.0 * np.arange(NlvdBZe)\n", + "vgrd = -7.9 + 0.2 * np.arange(Nlvdplr)\n", + "\n", + "Nlvhght = 60\n", + "hght = 0.125 + 0.25 * np.arange(Nlvhght)\n", + "\n", + "Nlvglat = 144\n", + "glat = -89.375 + 1.25 * np.arange(Nlvglat)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "125d2e01-a852-416d-a93c-86052f30bfdc", + "metadata": {}, + "outputs": [], + "source": [ + "# target region\n", + "\n", + "if zone=='tropics':\n", + " rgnID = 0\n", + "elif zone=='mid-north':\n", + " rgnID = 1\n", + "elif zone=='pol-north':\n", + " rgnID = 2\n", + "elif zone=='mid-south':\n", + " rgnID = 3\n", + "elif zone=='pol-south':\n", + " rgnID = 4" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "62a61e04-41b7-4dc0-af99-b8dfcc7b42b7", + "metadata": {}, + "outputs": [], + "source": [ + "# data access\n", + "\n", + "if vname=='Doppler velocity':\n", + " if zonal_mean_flag:\n", + " var=np.fromfile(\"../data/EarthCARE/vd_zonal_mean.grd\", dtype=np.float32)\n", + " var = var.reshape( (5,8,Nlvhght,Nlvglat) )\n", + " else:\n", + " var=np.fromfile(\"../data/EarthCARE/cfed_Vd.bin\", dtype=np.float32)\n", + "elif vname=='radar reflectivity':\n", + " var=np.fromfile(\"../data/EarthCARE/cfed_Ze.bin\", dtype=np.float32)\n", + " zonal_mean_flag = False\n", + "elif vname=='terminal velocity':\n", + " if zonal_mean_flag:\n", + " var=np.fromfile(\"../data/EarthCARE/vd_zonal_mean.grd\", dtype=np.float32)\n", + " var = var.reshape( (5,8,Nlvhght,Nlvglat) )\n", + " else:\n", + " var=np.fromfile(\"../data/EarthCARE/cfed_Vf.bin\", dtype=np.float32)\n", + "elif vname=='vertical air motion':\n", + " if zonal_mean_flag:\n", + " var=np.fromfile(\"../data/EarthCARE/vd_zonal_mean.grd\", dtype=np.float32)\n", + " var = var.reshape( (5,8,Nlvhght,Nlvglat) )\n", + " else:\n", + " var=np.fromfile(\"../data/EarthCARE/cfed_Wa.bin\", dtype=np.float32)\n", + "elif vname=='Ze-Doppler':\n", + " var=np.fromfile(\"../data/EarthCARE/pdf2_zv.bin\", dtype=np.float32)\n", + " zonal_mean_flag = False\n", + "elif vname=='Ze-terminal':\n", + " var=np.fromfile(\"../data/EarthCARE/cfed_zf.bin\", dtype=np.float32)\n", + " zonal_mean_flag = False" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "5f3a14a2-0e88-40be-9248-240a590fd3a1", + "metadata": {}, + "outputs": [], + "source": [ + "if zonal_mean_flag:\n", + " pass\n", + "else:\n", + " if vname=='radar reflectivity':\n", + " var = var.reshape( (5,5,Nlvtemp,NlvdBZe) )\n", + " window = 2.0\n", + " extent = [ -40.0, 30.0, 20.0, -80.0 ]\n", + " iy = np.where((temp >= -80.0) & (temp <= 20.0))[0]\n", + " ix = np.where((zgrd >= -40.0) & (zgrd <= 30.0))[0]\n", + " xtics = 5.0 ; ytics = 10.0\n", + " vmax = 0.2\n", + " origin='upper'\n", + " elif vname=='Ze-Doppler' or vname=='Ze-terminal':\n", + " var = var.reshape( (5,5,Nlvdplr,NlvdBZe) )\n", + " window = 2.0*0.2\n", + " extent = [ -40.0, 30.0, -6.0, 6.0 ]\n", + " iy = np.where((vgrd >= -6.0) & (vgrd <= 6.0))[0]\n", + " ix = np.where((zgrd >= -40.0) & (zgrd <= 30.0))[0]\n", + " xtics = 5.0 ; ytics = 1.0\n", + " vmax = 3\n", + " origin='lower'\n", + " else:\n", + " var = var.reshape( (5,5,Nlvtemp,Nlvdplr) )\n", + " window = 0.2\n", + " extent = [ -6.0, 6.0, 20.0, -80.0 ]\n", + " iy = np.where((temp >= -80.0) & (temp <= 20.0))[0]\n", + " ix = np.where((vgrd >= -6.0) & (vgrd <= 6.0))[0]\n", + " xtics = 1.0 ; ytics = 10.0\n", + " vmax = 2.0\n", + " origin='upper'" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "02c2d337-fb7c-4c23-a78b-111110b75c4c", + "metadata": {}, + "outputs": [], + "source": [ + "# cloud regime\n", + "if zonal_mean_flag:\n", + " pass\n", + "else:\n", + " if ctype=='ALL':\n", + " sel = var[rgnID,0:3,:,:].sum(axis=0)\n", + " elif ctype=='stratiform':\n", + " sel = var[rgnID,3,:,:]\n", + " elif ctype=='convective':\n", + " sel = var[rgnID,2,:,:]\n", + "\n", + "# warm:0 upper:1 conv:2 strat:3 other:4 all:5 w/o warm:6" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "5410286f-6ef3-4f4f-8545-9d9c00c979cb", + "metadata": {}, + "outputs": [], + "source": [ + "if zonal_mean_flag:\n", + " pass\n", + "else:\n", + " if vname=='Ze-Doppler' or vname=='Ze-terminal':\n", + " smpl = sel.sum()\n", + " smpl = smpl.T\n", + " nrm = 1e-2 * window * smpl.sum()\n", + " else:\n", + " smpl = ( sel.sum(axis=1) * window )[:,None]\n", + " nrm = np.broadcast_to(smpl,sel.shape)\n", + " \n", + " zero_check = (nrm < window)\n", + " work = np.zeros_like(sel)\n", + " \n", + " work[~zero_check] = sel[~zero_check]/nrm[~zero_check]\n", + " work[zero_check] = np.nan\n", + " cfed = work[np.ix_(iy,ix)]" + ] + }, + { + "cell_type": "markdown", + "id": "7c08110a-4bf0-420b-9d4d-5d05368ccc7b", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "43319578-dbc9-4500-88fa-5192ce01bbcf", + "metadata": {}, + "outputs": [], + "source": [ + "if not zonal_mean_flag:\n", + " pass\n", + "else:\n", + " if vname=='Doppler velocity':\n", + " sumID = 0 ; numID = 1\n", + " elif vname=='terminal velocity':\n", + " sumID = 2 ; numID = 3\n", + " elif vname=='vertical air motion':\n", + " sumID = 4 ; numID = 5\n", + "\n", + " if ctype=='ALL':\n", + " totl = var[0:3,sumID,:,:].sum(axis=0)\n", + " smpl = var[0:3,numID,:,:].sum(axis=0)\n", + " elif ctype=='stratiform':\n", + " totl = var[3,sumID,:,:]\n", + " smpl = var[3,numID,:,:]\n", + " elif ctype=='convective':\n", + " totl = var[2,sumID,:,:]\n", + " smpl = var[2,numID,:,:]\n", + "\n", + " zero_check = (smpl < 1.0)\n", + " zmn_work = np.zeros_like(smpl)\n", + " \n", + " zmn_work[~zero_check] = totl[~zero_check]/smpl[~zero_check]\n", + " zmn_work[zero_check] = np.nan" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "843e2f9c-a5d2-42ba-be18-29d4a07ffe0e", + "metadata": {}, + "outputs": [], + "source": [ + "if not zonal_mean_flag:\n", + " pass\n", + "else:\n", + " window = 0.2\n", + " xtics = 30.0 ; ytics = 2.0\n", + " origin='lower'\n", + "\n", + " extent = [ -90.0, 90.0, 0.0, 15.0 ]\n", + " zmn = zmn_work" + ] + }, + { + "cell_type": "markdown", + "id": "e316738a-98f2-4d0c-ad2f-73b2184e6b36", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "### make figure" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "21c37598-91ff-4b32-a1bb-cd565146fcc9", + "metadata": {}, + "outputs": [], + "source": [ + "colors=np.array(\n", + " [\n", + " [248,248,248,1],#white\n", + " [160,210,255,1],\n", + " [ 33,140,255,1],\n", + " [ 0, 65,255,1],\n", + " [ 0,185, 0,1],\n", + " [250,245, 0,1],\n", + " [255,153, 0,1],\n", + " [255, 40, 0,1],\n", + " [180, 0,104,1],\n", + " [ 45, 45, 45,1],\n", + " ],dtype=np.float64\n", + ")\n", + "colors[:,:3] /=256\n", + "color_listed=ListedColormap(colors)\n", + "color_linear=LinearSegmentedColormap.from_list('color_linear',colors=colors)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "e594689e-b171-4ff0-876b-ab02247e8ee0", + "metadata": {}, + "outputs": [], + "source": [ + "tmp=np.array(\n", + " [\n", + " [ 1, 64, 38,1],\n", + " [ 71,108, 25,1],\n", + " [154,125, 66,1],\n", + " [206,185,156,1],\n", + " [242,239,246,1],\n", + " [236,196,225,1],\n", + " [204,124,186,1],\n", + " [164, 65,138,1],\n", + " [101, 2, 75,1],\n", + " ],dtype=np.float64\n", + ")\n", + "tmp[:,:3] /=256\n", + "near0=LinearSegmentedColormap.from_list('lower',colors=tmp)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "e20b3b56-8732-400a-9ed0-8fb9d706bd6a", + "metadata": {}, + "outputs": [], + "source": [ + "tmp=np.array(\n", + " [\n", + " [ 26, 51, 51,1],\n", + " [ 35, 85,130,1],\n", + " [ 61,144,199,1],\n", + " [120,197,204,1],\n", + " [231,255,232,1],\n", + " ],dtype=np.float64\n", + ")\n", + "tmp[:,:3] /=256\n", + "lower=LinearSegmentedColormap.from_list('near0',colors=tmp)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "036d42bd-7b01-4dd1-8832-103e506fd51b", + "metadata": {}, + "outputs": [], + "source": [ + "N1 = 128\n", + "N2 = 256\n", + "\n", + "lower_linear = lower(np.linspace(0, 1, N1))\n", + "near0_linear = near0(np.linspace(0, 1, N2))\n", + "\n", + "hoge = np.vstack([lower_linear, near0_linear])\n", + "\n", + "zmn_color = ListedColormap(hoge)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "63251813-c7d4-4e45-a235-8341f6135216", + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "if zonal_mean_flag:\n", + " pass\n", + "else:\n", + " plt.ioff()\n", + " \n", + " fig, ax = plt.subplots(figsize=(16,9))\n", + " im = ax.imshow(cfed,\n", + " extent=extent,\n", + " interpolation='nearest',\n", + " origin=origin,\n", + " vmin=0, vmax=vmax,\n", + " cmap=color_linear,\n", + " aspect='auto')\n", + " \n", + " if vname=='Ze-Doppler' or vname=='Ze-terminal':\n", + " ax.set_title(\"2d-PDF: \"+vname, fontsize=32, pad=16)\n", + " else:\n", + " ax.set_title(\"CFED: \"+vname, fontsize=32, pad=16)\n", + "\n", + " if vname=='radar reflectivity' or vname=='Ze-Doppler' or vname=='Ze-terminal':\n", + " ax.set_xlabel(\"reflectivity (dB Ze)\",fontsize=22)\n", + " else:\n", + " ax.set_xlabel(\"velocity (m/s)\",fontsize=22)\n", + "\n", + " if vname=='Ze-Doppler' or vname=='Ze-terminal':\n", + " ax.set_ylabel(\"velocity (m/s)\",fontsize=22)\n", + " else:\n", + " ax.set_ylabel(\"Temperature (degC)\",fontsize=22)\n", + " \n", + " ax.xaxis.set_major_locator(MultipleLocator(xtics))\n", + " ax.yaxis.set_major_locator(MultipleLocator(ytics))\n", + " ax.tick_params(axis='both', which='major', labelsize=18)\n", + " \n", + " cbar = fig.colorbar(im, ax=ax,\n", + " orientation='vertical',\n", + " pad=0.02,\n", + " fraction=0.045,\n", + " shrink=1.0)\n", + " cbar.set_label(\"\", fontsize=13)\n", + " cbar.ax.tick_params(labelsize=16)\n", + " \n", + " \n", + " fig.tight_layout()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "59fc2653-f03d-4c20-9206-7589e180b816", + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "if not zonal_mean_flag:\n", + " pass\n", + "else:\n", + " plt.ioff()\n", + " \n", + " fig, ax = plt.subplots(figsize=(16,9))\n", + " im = ax.imshow(zmn,\n", + " extent=extent,\n", + " interpolation='nearest',\n", + " origin=origin,\n", + " vmin=-4.0, vmax=2.0,\n", + " cmap=zmn_color,\n", + " aspect='auto')\n", + " \n", + " ax.set_title(\"zonal mean: \"+vname, fontsize=32, pad=16)\n", + "\n", + " ax.set_xlabel(\"latitude\",fontsize=22)\n", + " ax.set_ylabel(\"height\",fontsize=22)\n", + " \n", + " ax.xaxis.set_major_locator(MultipleLocator(xtics))\n", + " ax.yaxis.set_major_locator(MultipleLocator(ytics))\n", + " ax.tick_params(axis='both', which='major', labelsize=18)\n", + " \n", + " cbar = fig.colorbar(im, ax=ax,\n", + " orientation='vertical',\n", + " pad=0.02,\n", + " fraction=0.045,\n", + " shrink=1.0)\n", + " cbar.set_label(\"\", fontsize=13)\n", + " cbar.ax.tick_params(labelsize=16)\n", + " \n", + " \n", + " fig.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "id": "bfc0da8a-a5c5-40b8-a0f7-ac1496802524", + "metadata": {}, + "source": [ + "### results" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "009c34ad-ecaf-426e-8917-5be596ed7295", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABjAAAAN5CAYAAACmCHL9AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA91xJREFUeJzs3Qd0VNXWwPGdTAoJCYFQpSMqHaSKFBVBAQFFxAIWmopdbE9ABRQF9aF+2AsqdgSlKk1AkKJIURFREOkgvYQSUudb++jkTZKZMJNJOZn8f2vdNe3euWfunYRw9t17hzidTqcAAAAAAAAAAABYJLSwBwAAAAAAAAAAAJAVAQwAAAAAAAAAAGAdAhgAAAAAAAAAAMA6BDAAAAAAAAAAAIB1CGAAAAAAAAAAAADrEMAAAAAAAAAAAADWIYABAAAAAAAAAACsQwADAAAAAAAAAABYhwAGAAAAAAAAAACwTlhhDwAAABQdW7dulQ0bNsjOnTslISFBUlJSJC4uTkqXLi3VqlWTZs2aSWxsbGEPEygUNWvWlO3bt2f6edHnEBxOnTolH374ocydO1d+/vlnOXTokJw4cSLTOk6nM+N+//795YMPPsh4/P7775vn4J9LLrlElixZkvH422+/Nc/ZICQkxOv5BwAAQN4ggAEAAHK0dOlS+eijj2TWrFmyd+/eHNcNDQ2VunXrypVXXik333yz1K9f/4xHd9SoUfLkk0/myVnIacI46+RyoPr16ycTJ070edLN2/GKjIyUEiVKSPny5aVixYpy7rnnmuPWpk0badGihYSHh+fZmAHkjv4sX3/99bJv3z4OIQAAAFCACGAAAACPfvzxRxkyZIh8//33Ph+h9PR0k6Ghy7PPPitt27Y1t+3ateMoezleiYmJZjly5Ihs2rTJBIxcSpUqJVdddZXceuutctFFF3EMgUKwfv166dq1q/k5he80S2X69OkZj88//3zp2bNnsT6Eejz0uLjo8dDjAgAAAO8IYAAAgEzS0tJk5MiRMmbMmBzLYWj2QJkyZSQpKSlbGRWX5cuXS/v27eU///mPPPfccxxpP2mZLs1+0UUzMl555RVTpgtAwbn//vszBS+io6Old+/e0rhxYylZsiSnwgudqHfPrtOsNQIY0zOVFdPMQAIYAAAAOSOAAQAAMmhPiz59+siXX36Z7ajUqFFDrrnmGnMlcpMmTaRs2bImiKE0gPH777/L4sWLZcqUKbJq1apM227cuNHnoxwfHy/PPPNMrs6KjslX3bp1k+7du0tu1alTx6/1W7dubSbwPNXVP3r0qFm2bNkiP/zwg6mtn9WKFSukVatW8vTTT8vQoUNzPW4AvtOfyUWLFmU8joqKkpUrV0rDhg05jAAAAEABIIABAAAyDBgwIFvwQht0P/HEE3LPPfdIRESEx6MVExMjLVu2NMsjjzxiJvgef/xxWbBggd9HV5uA33HHHfl+VrS/REHsxz3g4ev+tJTUu+++K++8844pLeWeHTNs2DDZs2ePvPzyy/k4WgCuLDJ3GsQleFGwNDBuK5p2AwAA5L9/LpsEAADFnk6If/LJJ5mOQ9WqVc2V/w8++KDX4IUnF1xwgXzzzTem9JEGJOCf8847z5Tc2rlzp9x+++3ZXtdSUi+99BKHFchnf/zxR6bHTZs25ZgDAAAABYgABgAAkG3btpkr+7OWY1q2bJnUq1cv10fopptuMs3Azz77bI5yLmh9/bfeeksmTJggISEhmV579NFHTdkuAPlHS7tlzUgDAAAAUHAIYAAAABk1apTpxZD1Kn/texGounXryrhx4zjKARg0aJApzZW1X4kGMQDkn6y/F119fwAAAAAUDHpgAABQzO3duzdb6agOHTqYZt55hUm/wGlj89mzZ8v69esznvvqq6/kzz//lHPPPVeKmu3bt8vq1atlx44dcvLkSZNtcuGFF5pm5zk5cOCAbNiwQTZv3myujj99+rTExcVJmTJlpFGjRqY/QV5+344dOybfffed7Nq1Sw4fPmxKommJr7Zt2+Z5eTT9LFqySJve79u3T44fPy4lSpQwje2rVatmjo32m8kvut+ffvpJdu/eLYmJiVKqVCm59NJLC6zng34PtIm99oDR3i96HitVqiT9+/f3aXvNSPrtt9/Md0S312yJChUqSKtWraR69epFuseBfp7vv//efC/084WFhUn58uXNz772HnI4HHm2L/3Mv/76q/k+HDx40Ow7MjLSZOVpLx/9OcvP7yEAAACQiRMAABRr48aN0xm6TMuUKVMKbP8jR47MtO8aNWrky370fd33o/vNTxdffHGm/fXr1y/g95wwYUK2c/X44487baOf1X2M77//fsZrn3/+ubNZs2bZPoe3Y5SamupcsGCB884773TWqVPH43bu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qVKl5Isvvsh05bL2jch6lXlWuo1ere+i53nGjBnmSnZvdB3N8MhtiRktCdO7d29xOBw+b3PrrbfKiBEjMh5rKRjXFe/+uuCCC0y9/8jISCks2vvC159fzUp45JFHsmX3PPzww2fs66JZJl9//XWm8ljaf+PAgQNiixdffFF27tyZ8VivzP/qq69Mhk5ONEPi1VdfNb1RXDTLRD+fNz/99JN88sknmZ677bbbzDZavswXzZo1Czg7Ia9l/Vn88ssvTbk0X79fH330UY7vV9jKlStn+gi5aAxFM7N8pRkb7m6//XaPJfgAAABswl8rAAAUYydOnMj2XGFOzuPMPJ0fT30AbDNu3DiJiYkpkH1pCaKszYW1lExOsk4CamkX7Q3gazPpguobofSzuffGONNn80bLbfkTPMlrWq5JF19NnjzZBDjdJ/i1hJavNIih5adctCRS1gnrwvxd/Prrr2c81vOipcG0740vNICjJc3cz6f2OvAma58MbQA+fvx4Keq0lJ42I3fRUmhaQswX2th63759mUppaX8I22Qtc6c9O7KWgvRk48aNmX5XaHks7UEDAABgOwIYAAAUY8nJydme89asFXbwFATwdB7dab8AvVLXfSlI2vdCe14UpKzNzrM2q3enNfOXLl2a6Tntp+ArbbZ9ww03SEHRYEndunUDauSuV89rX5HCpFd/+0OzRdzde++9Z8y8yCrredLsHBvMmzdPjhw5kvFYe3lo/wl/aBDCvYeR9kg5fPiwx98X2i/G3YMPPihRUVESDLJmTWRtyu1N1vU0iOmpEbwNQZpWrVplPD548KDpSeJv9kXPnj0z9XsBAACwlX1/kQEAgALjfhW3LVfzawmrZ555xq9tKleu7Pd+tGGxP1d/uyvMkjueyqEU5nh80b59+zydCDx27JgpCaXlf7Qxs15lnTUoow2O3bmX5slKmxG7b68Nwv1tiq6Tgf6UcsmpjM2mTZtMA2L9bHq+tVF7Vu4BC91Gy4jVqlXL5/106NBBCpMGHnxprO5eKkubR7vLzdXxGvjRiXrX8dNG0zbIGkg5UwPunAJTK1euNPf1O62BO23G7U5fd//+aAmhvn37SrC46aabZOjQoaZhtasx+p9//innnnuu1200CKDlumwuH5U1wOreRF2DE/q5vdHzrQ3E3d155535OkYAAIC8QgADAIBizNPV/Do5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DxO80JOkmRwnT54020+aNEliY2NN9Oumm27y+0QBAAAAAAAAAILP9OnTzQS/BhxWrlxpggtffvml/Pnnn6bKz7Jly+SJJ57w+f2aN28ukydPloMHD5ogyGeffWYCCTo3rfPWP/74ozz44IPZttN5bK1MpLfDhg0zgQud19Zbfaxz3fq6+8X+LrfffruZT9esD83g0P1rNaOvvvpKQkNDTYBm3bp1fh8bMjDcdOjQQRYvXiznnHOO/P777yba5U5Ta+rWrWtSZW644QZz4t29++67cuutt5r7K1askAsvvDDT67p+3759zX2NVOnJBAAAAAAAAAAUX5oRsWrVKnn66aflsccey/TasmXLTGaDlnLSjAZtVxCIjz/+WG6++WaTzXHs2LGMbA31+uuvy9133y3nnXeemR/XwINLenq61KtXzwQp3nzzTRk8eHDGaxs2bDDZGg6HQ/766y/TmsGdzpnr3LmnOfUzIQPDzd9//21utbZY1uCF0pN5/vnnm/snTpzI9voHH3yQEQjJGrxQeoJq1apl7n/44Yd+nSgAAAAAAAAAQHDZvXu3CV4o18Xv7tq1ayfVqlUzLQpmz54d8P60xYHSLArN0HDnqjqk89juwQulj6+//npzf+rUqR63a9u2bbbghfvnmjVrlt/9PAhguNFG3eqXX34x5aCy0oP7888/m/stWrTI9Jqm1Wh9MNW1a1ePBzskJES6dOli7mvNMgAAAAAAAABA8aVlnVR8fHzGxe9Ztfh3Ltq1biC0LJWKiIgw+/Q0lqxz32cah6/baQkq1/59lT3NoBjTBt5z5swxNbr69OljOrVrOSm1ceNGGTp0qCkfVbt2bdPI252m1GgajdLGJt64Xtu7d68cPnw425fERSNqrsbfSt9b1y9btqwJhAAAAAAAAACALZxOpxw/flwqV66c7er9/HT69GlJTk4W245F1jlcLQGlS1Zbt241t9WrV/f6ftWqVcu0biDjev7558397t27ZxqPnrtDhw7lOBbXOA4cOGCCEdrU25fPUKpUKbMkJCSYdevXr+/zmAlguNEG3Nqg+9FHH5UvvvjCLK7O7ppSo13ZNcihtcj0gLvbs2dPxv0qVap4PeDur+k23gIYGjx58sknfT6RAAAAAAAAAFDYdu7cKVWrVi2w4EVsbKzHajqFSZtxZ21BMHLkSBk1alS2dTVwoFzB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3Q4ePGiKG9WuXdvkByxVqpQZ6jZ9+nRTkAjpaWGot99+2wxNrFevnsm1GB0dLZUqVZKbbrrJFIfKjA5dzM5xv2zZMro/wH3vxvnef5qjc9GiRWZobNeuXc3QW/exmtEoy7Q43wev79043wcW5/K8xXk6/3FM230e5xyev/3O75bg/2bneyD/+57vgeBfo+Fcj1xzoUD56aefXEWKFNGrr54pM3v27HFVq1bNs2zRokVd0dHRnn83atTIdfTo0Xxrf0Hx8MMPp+pj7fO4uLhUz5UpU8a1evXqDNd//vnnzTKRkZGusmXL+px2796d758t1PterV+/3lW6dGnP8sWKFXNFRER4/n3NNde4EhIS8vVzFQTefeTu+9jY2FTPde7c2XX69OkM13/77bfNMuHh4Zke9998802+f7ZQ73vF+T5nvvzyy1T97D3puTwrnO+D1/eK833gcS7PO5yng4Nj2t7zOOfw/O93frcE9zc73wPB6Xu+B4J7jYZzPQKBERgFiBYD79OnjykI3rJlyyyXT05Oluuvv97U9tACLVqpXiu/6x0b7733nsTFxcmmTZtMBBupNW/eXF599VX59ttv5dixY3L27Fk5efKkuVti5syZpsD74cOHTaRfC+D4csUVV5iiN76matWq0fUB7nt9TosR6R0aenfAunXrzLp67E+YMMHcKbBkyRIZMGAAfZ/BOUP7f9KkSabQkvb9qVOnTC2fe++91yyjd3vdf//9mfZd5cqVMz3udSQMAtv3nO9zp2TJktK+fXt54okn5D//+Y+UK1fO721wvs//vud8n7c4lwcW5+ng45i26zzOOTw4/e7G75b8/83O90Dw/6/K90D+X6PhXI+ACUgYBPli3LhxJrJ5xx13eO6cyGwXTp8+3bNMRpHQOXPmeF5ftmxZHrc+tCxZssTTd7NmzUr3unv/XHnllUFpX2Hu+2effda8FhMT49q1a1e610eMGGFedzgcrh07duRTqwuGL774ItPX77//fk/f79271+edLVWrVs3DVoam3PY95/ucS05OTvecHsP+jsDgfJ//fc/5Pm9wLs8bnKeDh2PazvM45/Dg9Du/W4L3m53vgeD1Pd8DwbtGw7kegcIIjAJCo8rPPPOMyTH32muvZWsdjYSqtm3bZjhio3v37lK9enUz/8477wS4xaGtRYsWnvnff/89qG0pbLLqe/ex7H18e+vfv7+pBeN0OmX27Nl53NqCRc8VmXHf2aLWr1+fDy0qPHLb95zvc87hcORibQSz7znfoyDhPI1QlJvzOOfw4PQ7gvebne+B4PU9gneNhnM9AoUARgFx3333mRQ4Y8eONcOzsqJpolatWmXmO3funOEyWuSrU6dOZn7p0qUBbnFoW7FihWf+4osvDmpbCpvM+n7Hjh2yd+/eTI97DV64Uxhx3PunSJEinnkNACH/ZNb3nO9RGHG+R0HCeRpIjXM4Cttvdr4Hgtf3CN41Gs71CCQCGAXAtGnTZPny5dKhQwfp1atXttbZvn27qZmh6tev73M592ual/7o0aMBanFoSkhIMPVEtI7CXXfdZZ675JJLTJ0RX7Zt22b6uGjRoubCee3atU0wSmuPIPB9v3XrVs98do77H3/8kd3gh6+++soz36BBA5/L/fXXX9KkSRNzzMfExEiNGjVMrR3v9RG4vud8bwfO9/mL833e41weOJyn7cAxbQ/O4cHH75b8/c3O94Ad/1fleyB/r9FwrkcgEcCw3P79+01hLr0IOGXKlGyvd+DAAc98xYoVfS7n/Zr3OkgdydfRKvqoKYk0BZEWLmrVqpUJLEVHR/vsLi1kpD9WdP/pCf7nn3+W6dOnm4u7zz77LN0c4L7397jXwlNa+AtZO378uIwcOdLM6wgWDcb5oncYbdy4UaKiokwgVVPgabouHfbbp08fU4ANget7zvd24Hyfvzjf5z3O5YHDedoOHNP24BwefPxuyd/f7HwP2PF/Vb4H8vcaDed6BBIBDMvdf//9cuLECXnhhRfMXczZFR8f75nXu/998X7Nex38rVy5clK2bFmJjY31PKcXYseNGydVqlTJsKtq1qwpo0aNMkPmzp07J0eOHDEpwJYsWWKCFy6XS4YPHy5jxoyhqwPY9xz3eUODEHpXxR9//GF+qOhdFhmpUKGCPP/88/L999+b415HdbmHS+sIMvX222/LwIED86ilhbPvOe6Di/N9cHDc5x3O5YHH8RpcHNP24W8iePjdEpzf7Bzzwf3/Et8DwblGw3GPgApYOXC43n77bZd2aU6nRYsWperFd9991zz/j3/8w5WUlJTqteeff96zXkZmz57tef2XX37xuXeWLl3qWW716tUFdi8Guu99OXjwoGv06NGukiVLusLCwlxDhw71u61nz551NWvWzLxvsWLFXMePH3cVZDb1/fDhwz3bTfs3423q1Kme5Q4cOOAqqPKr7/v16+dZ580338xRW51Op+vGG2802wgPD3f9/PPProLMpr7nfB/4vq9atapZVr9rc4Pzfd71fWE739twPgrFc3l+KWzn6YKEYzrwsnMe5xwenH4vbL9b8lNWv9n5Hghe32eF74Gcy+oaDed6BBIjMCx18OBBGTBggDgcDlMDIyIiwq/14+LiPPN6B7Qv3q95r4OMXXTRRTJo0CBZvHixGTb34osvymeffeZXd+ldASNGjDDzmr5Ih9khMH3PcR94jz/+uOcultdee82kgMqJ8PBwGT16tOcumU8//TSg7SzMfc9xby/O93mH4z44OJfnDMervTimg4O/CTvxuyXvfrNzzNv7f1W+B/LuGg3HPQLJv6viyFSPHj2kS5cuOe6lEiVKeOYHDx5s0g49+OCDUqdOnXR5+hMTEz3z7tc037xO7iFy3nU0GjZsmOF76mtu3usU5r7PjubNm0vr1q3lm2++kalTp/r93i1btvTM79q1Swoym/o+7XFfvHjxTI97fV0LTRdUed33Tz75pCfNmQYfNKiaG1rUq0yZMibnLsd94Pqe833ennNyi/N93vR9YTvf2/Q9HErn8vxS2M7TBQ3HdP7jHG6vUPrdkh+y+5ud74Hg9X128D2QO76u0XCuRyARwAggLVaTWUFnf2jRWzV58mQzZcYd1Xz00UdN3jlVt25dE0nWO523bt0qnTt3znBdfc2dx65UqVJSUAWy77PLXQh6586dUpjZ1Pf169dPdWzr30Fmx329evWkIMvLvn/iiSc8Iya0noveWQE7+57zPUL5fO9LYTvfF5T9gowVtvM0kBXO4QgF/vxm53sgeH2P4F2j4VyPQCKFVIjS4tytWrUy8zqcKyNaSFqLSquOHTvma/tCgfuOlJyk3lqzZo1nvnr16gFtV2Hu+1q1ankKR/k67rWY+ooVK8w8x73vobjePwj1B2Ig/Prrr+aOXcVxH7i+53xvN873eYPzffBwLvcf52m7cUznP87h9uJ3S978Zud7wO7/q/I9kDfXaDjXI6ACWlED+SarIt5q+vTp5nUtprNmzZp0r7///vuebSxbtiyPW1xwJCcnu1JSUjJdRvtL+1X77sknn0z1Wlbrnjt3znX55ZebdWNjY13Hjh0LSLtDQW77Xj377LPmtaJFi7p2796d7vVXXnnFvO5wOFw7duwIaPtDwaBBgzznBS3IlV1Z7Td9/eabb/YUfv3pp58C0NrQktO+V5zvg1MIk/N9cIuQcr4PPM7leYfzdHBwTNt7Huccnv/9zu+W4P5m53sgOH3P90Bwr9FwrkegEMAI4QBGUlKSq0GDBmaZihUreoIUTqfT9cEHH7iKFy9uXuvcuXM+ttx+etH7sssuc/373/92/frrr6lO1nv37nWNHDnSBB6070qVKuX6448/Uq3/1Vdfudq3b+965513XPv27fM8n5iYaPZBs2bNPPtOL6YjcH2vjh8/7ipXrpxZpl69eq7169eb5xMSElyTJk1yRUVFmdcefPBBuj6NJ554wnNsjh071u+/Gz220+47Pd98++23rmuuucazbfo+sH2vON/nztGjR11//fWXZ6pcubLZF7pfvJ+Pj49PtR7n++D1veJ8H3icy/MO5+ng4JjOezk9j3MOz/9+53dLcH+z8z0QnL7neyC412g41yNQCGCEcADDfbKpVq2aZ1m9K71IkSKefzdq1Mj8+EHqPnP3j056wbtMmTKek7J7ql69umvjxo3puu7LL79MtVxMTIxZPzIy0vOc3oE+ZMgQuj3Afe+mQYvSpUt7lo+Li0vV/x07djQjYfC33377LdXxWbZs2UynV199NdN9Fx0dbfadPno/f88995gf7whc33O+D9xdi1lNvXv3TrUe5/vg9b0b5/vA4lyet/hdnv84pu0+j3MOz99+53dL8H+z8z2Q/33P90Dwr9FwrkcgUMQ7xFWrVk1++OEHkyNw/vz5pjh4ZGSkXHrppdKjRw/p37+/REVFBbuZVqlQoYLMnTtXvvrqK1m7dq0cOHDA5O13OBymvsJll10mN954o/Ts2VNiYmLSrd+gQQPT399++61s2bLFrHv8+HGT91KLiLZp00b69u1rlkNg+96tSZMmsm3bNnnllVfks88+k3379klsbKwpItW7d2/p06ePKaaJv2lhUe/5gwcPZto9p06dSvXvsmXLyhtvvGGO+82bN8tff/0lx44dkyJFiph6F1dccYXpd3dtHgSu79043+c/zvfBx/k+sDiX5y3O0/mPY9punMPzF79bgv+bne+B/O97vgeCf42Gcz0CIUyjGAHZEgAAAAAAAAAAQIBwCzIAAAAAAAAAALAOAQwAAAAAAAAA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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(fig)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "51b015e1-d4d4-4bf6-ab3e-e1df9e55e344", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/driver/check/.ipynb_checkpoints/MIROC_check-checkpoint.ipynb b/driver/check/.ipynb_checkpoints/MIROC_check-checkpoint.ipynb new file mode 100644 index 0000000000..21622a2717 --- /dev/null +++ b/driver/check/.ipynb_checkpoints/MIROC_check-checkpoint.ipynb @@ -0,0 +1,260 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "2ad48f61-e598-4a15-89f8-a0483fe2c9fe", + "metadata": {}, + "outputs": [], + "source": [ + "import xarray\n", + "import pygmt\n", + "import pandas\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "dc10108f-956d-47bf-a02c-f42282da2ef1", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xarray.open_dataset(\"../data/MIROC_inputs/ctrl_MIROCinput.nc\", decode_timedelta=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "eaf47183-d94f-49f7-a397-ce248957a526", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "xarray.Dataset {\n", + "dimensions:\n", + "\tlat = 128 ;\n", + "\tlon = 256 ;\n", + "\tlevel = 40 ;\n", + "\thydro = 9 ;\n", + "\n", + "variables:\n", + "\tfloat64 landmask(lat, lon) ;\n", + "\tfloat64 skt(lat, lon) ;\n", + "\tfloat64 orography(lat, lon) ;\n", + "\tfloat64 sunlit(lat, lon) ;\n", + "\tfloat64 pfull(level, lat, lon) ;\n", + "\tfloat64 height(level, lat, lon) ;\n", + "\tfloat64 height_half(level, lat, lon) ;\n", + "\tfloat64 T_abs(level, lat, lon) ;\n", + "\tfloat64 qv(level, lat, lon) ;\n", + "\tfloat64 rh(level, lat, lon) ;\n", + "\tfloat64 tca(level, lat, lon) ;\n", + "\tfloat64 cca(level, lat, lon) ;\n", + "\tfloat64 mr_lsliq(level, lat, lon) ;\n", + "\tfloat64 mr_lsice(level, lat, lon) ;\n", + "\tfloat64 mr_ccliq(level, lat, lon) ;\n", + "\tfloat64 mr_ccice(level, lat, lon) ;\n", + "\tfloat64 fl_lsrain(level, lat, lon) ;\n", + "\tfloat64 fl_lssnow(level, lat, lon) ;\n", + "\tfloat64 fl_ccrain(level, lat, lon) ;\n", + "\tfloat64 fl_ccsnow(level, lat, lon) ;\n", + "\tfloat64 dtau_s(level, lat, lon) ;\n", + "\tfloat64 dtau_c(level, lat, lon) ;\n", + "\tfloat64 dem_s(level, lat, lon) ;\n", + "\tfloat64 dem_c(level, lat, lon) ;\n", + "\tfloat64 mr_ozone(level, lat, lon) ;\n", + "\tfloat64 phalf(level, lat, lon) ;\n", + "\tfloat64 Reff(hydro, level, lat, lon) ;\n", + "\tfloat64 lon(lon) ;\n", + "\tfloat64 lat(lat) ;\n", + "\n", + "// global attributes:\n", + "}" + ] + } + ], + "source": [ + "ds.info()" + ] + }, + { + "cell_type": "markdown", + "id": "47c43a93-1549-4475-bb14-62e92a04287b", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "4afebca7-6d9a-42e4-87f8-22381a3240cb", + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "data=ds[\"tca\"]\n", + "data.load()\n", + "\n", + "zid=10\n", + "hid=1" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "f18b7b21-31f7-4d84-b9b7-8a2f0c188704", + "metadata": {}, + "outputs": [], + "source": [ + "var = data.isel(level=zid)\n", + "#var = data.isel(level=zid,hydro=hid)\n", + "\n", + "#lat = ds[\"lat\"].values\n", + "#lon = ds[\"lon\"].values" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "faf8c56f-18c9-4d70-97b8-37c086594c59", + "metadata": {}, + "outputs": [], + "source": [ + "region = [ -180, 180, -75, 75 ]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "663f115e-1c8f-42d8-b233-3b7331f2c602", + "metadata": {}, + "outputs": [], + "source": [ + "lon, lat = np.meshgrid(var.lon, var.lat)\n", + "ll = np.column_stack([lon.ravel(), lat.ravel(), var.values.ravel()])\n", + "\n", + "grid = pygmt.xyz2grd(\n", + " data=ll,\n", + " region=region,\n", + " spacing=\"1.5d\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "e06f7d7f-9135-4007-85f5-9e91f679b585", + "metadata": {}, + "outputs": [], + "source": [ + "fig = pygmt.Figure()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "67a53630-fc07-4cbf-b5fc-eabc5b57a137", + "metadata": {}, + "outputs": [], + "source": [ + "fig.coast(\n", + " region=region,\n", + " projection=\"W15c\", # Robinson 投影(15 cm 幅)\n", + " land=\"lightgray\",\n", + " water=\"white\",\n", + " frame=\"af\"\n", + ")" + ] + }, + { + "cell_type": "raw", + "id": "9fce5808-e758-4045-a8bc-8ba746f09c6f", + "metadata": {}, + "source": [ + "pygmt.makecpt(cmap=\"turbo\", series=[float(var.min()), float(var.max())])" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "34d714ca-db20-4b4b-8081-9f540e4ccd3d", + "metadata": {}, + "outputs": [], + "source": [ + "fig.grdimage(\n", + " grid=grid,\n", + " cmap=\"turbo\",\n", + " shading=True,\n", + ")\n", + "\n", + "fig.colorbar(frame=\"af\", position=\"JBC+w10c/0.5c+h\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "431e1d02-99ff-4ca5-a28d-f4db72f1d58f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABywAAAPzCAIAAABqXWyyAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAACB0RVh0U29mdHdhcmUAR1BMIEdob3N0c2NyaXB0IDEwLjA2LjCzUUzDAAAgAElEQVR4nOzdd3xV9fkH8OfckeRmkh1CSMJK2IQNDoaICG7MjQXcratVa62zjtbW0dpqrVqt1p9aFUduXIh7ICBDQED2HmEkhOw97r3n98dt4zXPJ2EImZ/36/f6veKn3zz35N5zvufkyZdzDNM0hYiIqB1zuVzZ2dltvRVEREREP5XL5WrrTSAiorZhsAlLRETtUGPjNScnp623hYiIiOhEyszMFDZkiYi6GDZhiYioHUlLS9u3b19tbW1bbwgRERFRa2BDloioi2ATloiI2pjT6ZQWV7yOTp7V+LVZcwiOsdlDdThg2CQ4eOKtv9Lhc/F5OhyUVAYrVITO0+H7z+zXYYztKlgh9dMqHY4+bzwcvHhLvg7r8wp0eNh9AFZoKC3V4YzL8LZ5U+p0+OnKr3WYVNQfVqioOKzDOYnBOpy3oRpWiKyt0eGBxS/Bwckh4M0sqSrUYVhgGKxwy8236bD7aUN0eHEB+JRF5PdnJOpw3j7wTorITcEJOgxI3qbDodvvgxXKHOAdfvuLdXDw926PDudM6qHDp54E2yAiy2pe1qF32V4d9ipeASuIt0JnhhhwrMVi1WHvpEE6HDDzalihYdIAHT67GBy2IiIZYM+8d0KyDpdV4Q/0gtA4Hd7w6BQdXnHXPbDC63+7WYc1CSAUkVPH/kKHA9Ac+PaG7bBC3Sc7dBgXn6HD6RnNHOPp5Tp8Z/1NcHDVGvBx/Pq8O3S4dcAaWGF0cKAOrYF48LclX+pwXQH4QSb0AYetiGz87nkd5m8Fx/6vr5oMK3z8woc63NTMhOCpfV2HvcrABp/TC1dI7R2tw3krGnRYv+EzWCEsyKLDiCB8hA4ZmKrD3Gq7Dnfngv1ERHbWR+owJKwbHHygEpydLYfADD+sf29YobIeTCnl6HAuKwVTq4h49q7VYWDtLjhYasDcaHXEN369MvcN/I0iwoYsEVGnZmvrDSAioq7omBqvRERERJ2D/xWObsj6Lo0MwxA2ZImIOh02YYmIqJWw8UpERETUiA1ZIqIuhU1YIiI6idh4JSIiIjqio2zI+rqxWVlZvkssIiLqQNiEJSKiE4yNVyIiIqLj1kJD1nd95fv/bMgSEXUsfDAXERGdAEdsvM4cc6eI9B1/Jvxfu50H8gYbOEOVj8CPHspAzw9ZZn0GDs7ZOlOHfQLBc4r2LqyEFdKKh+vQOAwePeTdvgVWKDsAnoCUmgye1yQiSVPP0OHXkeBpVJdlOGCFV8K+0WH+W7Vw8GnWc3VYCp76I/Xf5cIKMaHg+Ve7vv5Yh4EFK2GFvr1SdBg57iI4eGM5eOjKzBngAx1z1rOwwicmeHrMNdXgAy2s+wpW+O1OEN4wBv+9Ic4NHig0cg949NChfPycq+fywDOCPht+DRzcMxEcSjtKeuow98PdsELwG311mLBzvQ6DGsATaUTE9IAnrQXYguDgxFRwfA2aBg7boO7gUxaRurgYHb73+WY4eM5N4Kfr0/8BHUZ78ITQtwI8kuiy58DDnbbPeQ1WCLYF6HBMKHhWkogk2et1uEvAwXjIDQ4NEVm3CqzDuCR0tg7fXbIEVng863QdPmOshoMTD/fT4Xcx4PFZo6pPgxX6x4OnMI124I8jqf4VHdYHJOnwwS1gG0RkUv9MHb78HZis9heAnUdE7AmTdGgEgydliYh7NZiKx44DT6LbYsPzj9EwTIfj7PE6HN4dP6vtgffBVJOw8Ww4eGzCYB2WVoJ5pmcUfrRXfhF4WmDe2g1wcFEhmO5CKsCkba0Dj6AUkbAo8Oi88CjwNDPTHgIrlFaAZ0jWVeCXk3ow2OIGp2yztgQWCLR6dWh4KkVk0feP4BdlQ5aIqCPgSlgiIjpOR9l4JSIiIqKfbsKwuxu/btKQ1StkeQNZIqL2hk1YIiI6BkdsvE4fepPvC0dQcCttExEREVEX42vIBkUkishni27y/5/4RC8iovaJTVgiIjqCo2+8EhEREVErO2vCU41fsyFLRNRusQlLRESAy+XKzs6WFnuvI+Ont+IWEREREdERnDXhqcTw/3798nw2ZImI2hE2YYmI6AdHXPTKxisRERFRh3DluT+skG2uIcsnehERtRo2YYmIurojLnrNyPjvFbw176PW2ywiIiIiOkEuu2GV74tXnx3ln/OJXkRErYZNWCKiLqrlRa+NjVciIiIi6jQau7HSTEOWy2OJiE4SwzTNtt4GIiJqJUdc9Dp55P2+L2788+36f50+aSP8rgPXn6fD9U+m6PCcXeNhBbt9sA6f+vwuHd763aWwQvT6dB2ef/YMONjWP1WHnyXt02FR/nJYIeY5Q4c93CU6HNwnBlYY/ug0Hb7h+BAOzq8vB+F78Tq0RoXBCrZ/H9Lh1HNmwsFr9uzSoWXdTh2mpfeFFb595yUdRtUs0eEVd/0DVki+MVWHvy8BZUVk/yzwR+Un/36zDscOxX9d6L23Xof3P3GvDl/NXKVDEZk34h4d9qrA78/bb7ysw6A4uw5LewfAChcPBgfCe4ffhoPvW5SqQ3suOMYzKobACsMde3VYmFegwx1L3ocVHI4QHUYk9IaDT3eer8P/2xeow90L3sMvt2aZDuNC6+DgS/7xsg5LK8EVcq1zHazw7qd36PCXMxN0+Me/VcAKWbOf1eHkgAvg4Htqwcv9peaPOvyoN54D0zd8oMPsIrDBt0++DFZIlSIdlnlXwMFxVWU6/P2HW0CF4ZNhhTv7g7OMe/+DcPAAR7IO9y0HL5fWEAorvLYczIFbe4N5pmegBVb48pBHhwU2fDjnWa/SYcTUKToMj8rDFT4A85L3c/CBJkROhBUufaSXDutDwSwqIpsXgAPhmwpwtyJzJ3655ODTdBhWBI5xEdn17ms6DKmp0qGnGuyWIhJiAzN8gAkOxt6DT4EVkoaO1OHOWnx+z/9+pQ5DbWCXEHclrOD1eHUYGGCFgx1hkTosKHfrMK0PuGwQEU9kT98Xr/4lFQ7g8lgiohOFK2GJiDq/lhe9NjZeiYiIiKhruuzOPb4vmnRjuTyWiOhEYROWiKhzOuKi19QBj4lIr2CwQImIiIiIuqbL7txTGRDu+/rdP0U15rx7LBHRT8QmLBFRp9Lyoldf45WIiIiI6Iguuq/Y94V/N1a4PJaI6LiwCUtE1OEdcdHrqJnfiEjh5m9bdbOIiIiIqFO46L7imkP/vevuJ8/3a8y5PJaI6OixCUtE1FG1vOjV13glIiIiIjqBzr52u+8L/26sqOWx7MYSETXBJiwRUUdyxEWvo5NniYg56letullERERE1MX4urFFn9wvIitz32jMG7uxIpKZmcmbFRAR+bAJS0TUAfh6r801XuV/vVciIiIiotbnfy3apCHLmxUQEfkYpmm29TYQERHW8g0H0tMfDa1aA/+n6/7woA4zfr5Ehw/tfAVWeNe4VofegzVwcN6bb+rw2aWf6fCRYdNghR4bL9JhmGnRYX1lCaxgy1+pQ3tYlA5FpDawpw7v+uuNOnzqrU2wwj/uHa3DTZG1Onw1dB6skG6+o8P5r2yBg2uiQZPdeMGqw8vPvgpWWF9t16G1AV8DlBfl69Cdf0iHZUveghX6OECFW1+bq8Pup++AFeZ9PUOHj6ycCQf/5YK/6dCZDo6Opb87D1b42aGJOsyw/1GHh/I3wwqTbgSV7znlVjj4wtuf06H3/nd1+HH0Xlihxw6wZ5buWgoHL5oWCgbLXTocZa2DFba5e+nwlicKdPhg3/GwwguPva/D3t0dcPDWA9U6rNn+hQ4N+P0iMSHgB5l9851wcNqFw3X4RSjY4Z/dsABWSHdM1uG9Y8H+U177HaxwaOk+UGEWmBhF5IrLf65D4z4wYb74f+BNExFLWKAOB58JjoJ+9tthhc/f26XDyrDL4OA/Z32uw9t+D0Zae18AK4y7HMxg3zy+DQ420XRnLPbq8OaXHoAV/vX2bB027BwFXmtXGawQvKxUh6FBeId3J/bXoacCnOzSxp8PK2zZt1yHDXvB7BESGAkrJKSDny7EBs4yIlI7PF2HtilBOowYAaY1EVn0LPjpJp96DRy8avtqHbpzdurQvrMcVoipPqzDlOREHRYU4QrxoQ06jO4JPjgRKWkI1mHPjAywDUl4lwiMidDhqsW5cLC1AUyYdRUVOiwoAiNFpPgQmH9sFeDlAh0hsEJlA1raZXpFZN0GPIdweSwRdU1cCUtE1O4csffauptDRERERHTMhg7+q++LJt1YLo8loq6JTVgiovaihd7r6ORZ5Q6wVouIiIiIqJ1roRsrfJYXEXUZbMISEbWxlnuvrb45REREREQnRePFrf99Y4XdWCLqGtiEJSJqG+y9EhEREVHXxG4sEXVBbMISEbUel8uVnZ3d3M1e2XslIiIioi7F/wLYvyHLbiwRdT5swhIRnXTsvRIRERERtQwuj2U3log6DTZhiYhOFvZeiYiIiIiOFbuxRNQpGaZptvU2EBF1Ki33XkfETmv82rA79IDpV9wBv3HQpeN0WNZvNRx8pr1ch3uGOHXoriyBFT5Is+jwuT5j4ODI5ZfoMKn6sA5tFi+sYFbs0GGo3arDqbOugRVq4vrrMOf95XDwzX+4SIe7Yyt1+Nzzb8IKjm/B2TMsLkWHRdfXwQpx7ybosCZ3Hxw8dNhEHRYfPKhDW2QUrFC4Y4MOQ4oPwMFVlRU6DDz4vg4nT7sUVpjw4oU63LFplA7/uGQQrGCLvEGHH8yJg4PHb1mpw1sfuEWH/wy6CVa4fsIjOvw45zMd/urCIbDCw2O36bB253Y4+PxBF+twYgrYAyebL8MK7s/e0eG8Pfvh4Asvn6bDJO8UHTp2FcMKj2c/rMP102N1+No/zoIVJttn6/DAphVwcH19rQ671azTYWK3cFhh9IWX6bD3uafDwY+Ulupw14IXdRg2dASsUHYA/SDFbhB2x1Ou7WCqDoPPHwYHx8dG63BWD7C04qF/4hOKvQgcoVEeMIseLsKfUUB1qA5t1XY4OLr3UB3uL1msw8QKsA0iUh0FptyGWjBTiciYoefocFcfcHwd3LQAVrj7UlDhrmd/ocOA97rDCslF4GAMDQI7toiEdQOng2oP+EBNAadFEQkKBQdjZWWVDhvqq2GFYCsYbARGwsHuGnCNMfDUc3XYZ+JpsMJ3U8t0uGwlmEVFpKZhjQ6DNvfVYcB+vAdWfbJIh709u3VoEfwZxQyYocMyNHWISMa40TqssILPyFMCzuMiMvIUcCAMuDgVDl7jOKTD3QKuwfat7wUrjNoBdraIdHCNal+5FVb4fjV4M7esAm+7iLhr0JHbAHYJw/Oj3XV1PjjxsRtLRB0LV8ISEZ0YR997JSIiIiKiozciYabvC/9uLNfGElHHwiYsEdFP4nQ65X+XgNrwmMmtuzlERERERJ3WiKgzfV+sLv6iMWQ3log6BDZhiYiOB3uvRERERERthd1YIupw2IQlIjoGR3zWlrs6v5U3iYiIiIioyxoRdaY1NFb4FC8iavfYhCUiOrIj9l5beXuIiIiIiMhf4zU5u7FE1D6xCUtE1BKn08neKxERERFRR9FyN1ZEMjMzs7KyfLcXIyJqNWzCEhEBLdzylb1XIiIiIqL2D3ZjRSQnJycnJ4drY4molRmmabb1NhARtRct9F4np13dJOl59q/1sHpbGKycfH00eLk+z+tw5DceWOHl+/+gw83n4b+lrR6fpsMVu8/Q4XTro7BC2KEaHSYE1cPBUf276fCb3jt1GPFWPKzgiQ3R4crsT3VorvsMVkgaBn66GgsoKyL2iyfpsP5AqQ5r8wthhTH9e+rwu6/X6rBvzzhYYeu23TqMCsH7T51h1eHhg7t02C8GV7BYDFThIH65ba/pMCSihw6v/M8rsEL4+PN0+Ep5KqgQtg1W2G8FO9XzX4PPSESCRpyvw34VH+tw0eu3wwp9DvbV4dWXgh959YCvYYW388D9oBNCwacsIlU7wU9dcDBChxMTvtChiKyvAhv8wLR0OHjGRrBnnv/aIh2uDh4PK3j2na5D+2d1OkzzHoIVDAvYhw1PORycMXaaDntd+DMd7ttTBitsOwAmq22fzYWDAyv3g1DAHBjQgCcEyGK36NAIATuViIy/8i4drqgCb5qIxNpCdZgbV6XDAwvxhGnbj366InB82d1gpIj07t1Lh46eg+Dg3H1gqhnWM0iHtTH9YYVzLkwBZdG0JiIvmbk6PPMAqLBo71ZY4dArb+sw0XDosNbjhRWspeDYD/PuwINtATq0BYBP2bAFwwqBEck6dFvAYE8zG2wPAqfLqLgEOLikGrzzJbtX6zApBbztIhKcCCYrMzQWDj6UAI6aGlutDu2FDbBCbRr47A69Da4xQgrwlBJ86BsdWj0FcLAIeJMj48C+HdnvNPxyPcBVXI9e+HIifkiiDsvHgysEhx3MEiISEvSWDmukWocNXnyWCTcqdLikHhyJIrJ8J/hAPSvOBWE1OMuISOiTn+vQUQw+Iy86y6xFI9mNJaLWwZWwREQt3fI1I+pUEYmMwRedRERERETUUWREnSZiisja4iWNof99Y3mbAiI6ediEJaKu64i9VyIiIiIi6nwar/abdGN9vxpkZmZyYSwRnXBswhJRl9Nc73VEzBleL/53T0RERERE1Pn4urH+rVgRycnJ8S2MFd6mgIhOHDZhiagLae6WryNiwO1EiYiIiIioK2j8dWB14VeNIW9TQEQnFpuwRNT5sfdKRERERERH1Fw3tvE2BezGEtFxYxOWiDqt5m47MDp5loh4qvEjvImIiIiIqIvzdWOtwfErc99oDHnTWCL6KdiEJaLOpoXHbfnar0REREREREej8TeIJt1Y3jSWiI6VYZpmW28DEdGJ4XQ6Ye/1mXs/1eHBCo8Oi/Lx8tg+z03T4R7bTh0OcvweVpj/n3U6rNlRqcOth96BFW68caoOezTzt7SDvQ7ocERYiQ73V/WAFfqH5urQKoFw8Aa5U4c33DBYh44lIbBC74JVOjRM8P6Y7lpYQYxgEIb1gmPjTr0ahDcO0uFny5bCCiHLQdizd4YOK9avhRWKNoLKUe4dcLAjEnxMmXfcrsNVQZGwwu4vwe7q/uSPcHCUHVwbBCQN1+GuuDGwQv+/x+pw/gt3gbJpQ2AFq6VMhx9kjYOD38i+WYcv7pqiw5iy62CF3/xmhA5zI8F88uon22AF99OJOgyz4eOrZt9uHYZ376PDIdMugBVCneAY98S/Cge/+wj49INXgR/Zsr8GVojK3azDpAjwJMPuvcF+IiKBceBgjO2Fj9Dc0HQdLvz34zoMS+wLK5h54FCKMvfCwZ5y8GZ60fxjGLCAGGJBg0GYMfkKWME2GMzwm/aCbRCR8iirDg/Of1uHcd56WGFA/946LC0Hs+uks0bDCmHd43SYNiYBDm6oBVOKxevVoWfoYVjhsBfsmQX2L+Hgh5/5XIfeyKE6NHLssELs4i06DLODN9MuYKYSEW8D2FcMKYeDDQv4QO0B4KTm9oBLFxERDzpyLeAKwUT7qogYFnB+twSDaU1ExGwAmb2bDt1efJVidZeCtDYfDw6KQC8HTnYVyfg2UwN6xOsweNYoHX7+9jxYITUSnOxqF4I9TUQsO14EIfqU8YchkpwILkgS+g2Dgx0903S4qhwcjMFWPIWNfzhKh/Nq9ujw7LhiWOH20m91aC3BU+75C9/X4b7z3tThhBB8SVNk36pD7yfgWnRB/qmwQuoT4E0LDAyAg+NqwYTw0Y65TRLepoCIjkZzMz8RUYfhcrmcTqdhGLoDOzxqAuzAEhERERERHYeMqFMzon7U4c3JycnKyjIMw+l0cmEsETWHtyMgoo6qhdsODI+a0PrbQ0REREREXURjH3Zt8ZLG0HfTWN6mgIggNmGJqOPx/UsfuO61LTaHiIiIiIi6KF83tkkrVkR401giaoJNWCLqMFpY+joydoqIeD3gJmVEREREREQn1ai4/97de1XBD/cL9u/G8qaxRMQmLBF1AM0tffX1XomIiIiIiNqD5rqxvE0BEbEJS9Q2Gv8Kekx/ET2+7+q4jrj0lYiIiIiIqB3ydWObWxjLVixRF8QmLHVmuoV39H97hO2/E3iybKyck5OTnZ19lB3Vxu/q9Odsp9MJe6+jk2f5vvDWFLTuFhERERERER2bxt9fVua+0Rjm5OTwHgVEXZBhmmZbbwPRSdFcF0+OopfawveKSMs90yb/U3MvZBjG0W+P/q7OeuQ2d9uB96sqmiQLjG/1t7+7OkWHSWuS4Gvt3PS5Ds+8bRQc/ECvFTo847Gf67B2xHWwQt3HA3T42ANn6LDUtgNWuNheo8OU/RFwcMHC73VYkYc614d2wgov7XlTh48EXwYHxyyIB9tm2a1DT81hWMH01oLQ9OrQZg2AFcQerrPkUT+DY60jp+twy/Smu5mIFN27GFYYO2C8DteuXqbDyA0vwAqmxa3DlLTJcHDaRb/QYXkfsG9/V1YFK3TfDV4usnQPHGytBh/T6tXbdBiWlAYrRA/O0GG37mE6nDE5EFaoS9+ow+r9eO69+Z0LdBi/c6oOJ/UcASvsySzSYWXh9Trc8AXY20Wkxxtg9qgTsA+LyHlngw96S003HV56RS9YQUau1tlLJe/Bsd8/nwDSv2/QWV8L/vuW4T2kw+mX36/DNRU9YYW8xWBK8dRXw8GW2jwd2q11Ohwy7hxYoc+wISBtALOoiCx85XEdFlaAH9n/3O2vmXMySK0WvADCNMGB4DFC4WDDAsKQnuN0OGESPqmNuxzsgS+uAxsctuQ7WOGa+0bqsFv3fXDw0KJ8kNZZdVbx8BxYYVCvQh0WeDLhYKMQXAwEbHSAkfn1sEJkLjgRR3lBaFo8sIII+JBME8zDIgJ3KwNVcATHwgr1BtivAtHgmrKDsIK3Dp2dm9nhIcMAH6glMBKPtoBTuenB7494wJFresGEINLMBqNDNCgkSofn3fYoLPDx92BXue0XeH5+MX2JDldM2aTD+Gowz4hIP0eJDnuk9IGDh2deqMP9ju46nP8mOHGIiJG3WYdJieCUFH0BONuKyIfl4LLz4kvxB5reAM6twfP36/CFUnyEXnvTLTqcthv8FAP/8xGsUNX3YbANG/D5KzIWXOp0C0rUYcrGXFghOeBHM9hj/wAzMBfGEnURXAlLnVNzvyb55OTkOJ3O5s5zLXdgRSQrKwv2YeHiWafTecQ/b7a8PV1Ec2+7br8SERERERF1RL/99QIRiS/accdr1zSGXBhL1EWgv6QTdXD+563MzEzTj+92BPK/vqf+XpfL1dgKzMzMzM7O1t8rItnZ2fp7s7KyfN+b+T++F8rKyjriNufk5HTNJqzL5XI6nYZhNOnAzv3dh77/a6sNIyIiIiIiOkkevfTfj176b//E95ujYRjswxJ1VlwJS52N/4JKvV7V1/LzDYDrLv27q026oi6Xy+Vy+Tqqeu2q74X0PyTxvdzRLHQ9+jvDdg7wzgPsuhIRERERURfR2IflwliiroArYamz8V/H2txa18avdYvWv4Grv9fpdPqvh9Wvqxe9NjZtm9vgxhfqIoth/Ze++r8to5NnsQNLRERERERdUHMLY51OJ/uwRJ0Gm7DUqfg3MVtoaDbXSPVvvDZ3qmtss8K+qv6uI54y/Ru7R3Pjgo7L135tvGlDo9HJsxqfGUpERERERNQ1+X4z8v/lyLdyxXePgq6wZIeoc+PtCKhTaeyiNtdm9Tni2auFb/dvqp6oE6F/X7JTnlzhQ7fYeCUiIiIiItJ8vyutzH2jMfF1Y32/qHa+XxiJugiuhKVOpYV/9X8Cv72FFq0+HR7NCdJ/MWxnuilBcw/d4tJXIiIiIiKilnFhLFEnw5WwRCdGZmam7649/s/XanyQV8src+XHTwzLysoyTfNkb/BJ5XK5srOzm/Re49Z97ftir0jD14X6u34/vr8OK1dshi/hfWifDlP2vKvDG959ClaouPE/OvzXmzfDwf3vu1iHlwzP1eEVk7bDCnLGSp0tNR/R4X1bz4MFnpt+jQ4dtgNwcNrAU3X44qpvdPjSGdfDClOLHtfhzwKS4eAt7n/r0OOu0qHV8MIKtoAwHQYER+vQHgJCEakL6qlDM7wHHLyjDOyB5bPBhezgsy+DFda9dr8Ou5k7dBgQGAwr9O13mg7dgy6Cg/cXgvetINmjQ8NuxRV61Olw0bxP4ODBVlD5of+7S4e13d2wQnhMgQ4HyZc6tDQUwQrb617R4R2fHoaDQw+P1OFFEybr8J2/vQArWN4DV0Qxpz6nw+6Fu2CFkMr3dJgWEwIHmzVlOvzFOX10mDx2EaxQX3u7Dle/mAYHu3dU63CAJ0+HwQFgpIicOu0GHe4pB/t2xZ4NsEJsXJQOR485HQ4urQGhp+yQDi+9C9/GxzGoRIcbLWDKFZGYgBd1mPLxn3W4ZtsyWEEEHYxorYPHC0aKiAiYMG0GOGxFxGYE6DDZASokjgGHhohsiazQ4ZqBT+jQu3MirHBGFDgLX1GxHw7+bDT4oL8sB9NaMZ5RZOJscIS+FYJPuIHrwaFkLN+iw5HjpsAKdRHgZFe0PUiHIXXrYAXTQCtdvHh+FgFvhcUCfuSG+kr4/W5PPRhcCa4QrPZQWMEW0h1slhsdiiLe+nIQesE2mLXgXCAihmEHoTUQDhajufdNv14zO5Bh6Ky+pliHX/z9d7CA8/rf6HAR+uBEpG7lGB1eML+fDrsVnAErPPXAtTq8fNB0ODgoNVGHbjT/3PD3DFjhwc2pOjy9MEaHO9fjs/BAs5cO3xiDT7jpKeAKyjMJvBWrtz4PK3x7Z4MOvWXgwE8K+hRWqA8CD/+oHgZ2CRE552Jwwf/+fz7X4ea94MJDRH552gU67PmrCXDwpangF6I8t0yRX/q+/nPwf2fUxoWxfHgXUQfCJix1To1/FdQnpOb+YHiU95P1599kbOyiZmVl+S9rFZHMzMyjKdg5bkoA7zzQ2B/e7VYAACAASURBVH4lIiIiIiKi43NX9WJRrVg56l85iahtsQlLnUeTfmvjKtQmDMOApyj/p3Idn8Y+rH8X8uhPh76bEvi+13dTgnb1J81bb70VvkV5eXkiYpqmXr07OnnW3vnXtcbGERERERERdQ13VS/+sv8zTe4Y6/s9lwtjidozNmGpc2quA+uTk5Nzkpaaulwu37/E9/3nsZ4CXS6X8b9/MOV/W4P2IDs7+8AB/C/fNd7ylYiIiIiI6ORp/J2rsRvLh3cRtXN8MBd1To0d2MzMzMzMTNM0s7Oz/W/M6uvDnoyX9rV3fY7jJRobuCdvC08qPnSLiIiIiIio1bTw8K423Coi0tiEpU4rMzMzOzvb1wyV//VGTdP0v2FrO/zzoO+mBL6v29UW7t+/33fPgSbtbB/94E4iIiIiIiJqHfrXscZWbPv5pZKoi2MTljqt5m4F4H8G+un3gT0Z2u0W+tb2+j9ATLj0lYiIiIiIqH2ArVjfr8ZsxRK1OTZhqXPKzMxs4R9f+C81ba0tOjbt7aYETqfTMAy2X4mIiIiIiNo5/e8U2Yolag8M/UBzog7K6XQ2tggzMzNbOLv4P7bL/xBofChWy8eF/wsd9xF0xNeCr3KUW3gC+W+GT/QT8+DI9FHjdRjk8MDB28yXdFj2fLgOLyqLhRUmXXW+Dm8L+1SHtRsXwAoZe3+nw8tut8PBl9jA7rRi6Z91eE3yW7DCd30Ldbj83Cd0uP27VbBCbnWRDktrDTg46Frw3MX505fr8LSC4bDChhzwZgYsfwQODg0HH5OjW5IOg614g+vtYTosKtwPygZ3gxVCkkbocL8lDg7uHwU2Y12RW4cB276CFQIrv9dhJPqRY4ZOhxXKK+t02GfSFDh4a1mwDjev+lKH1bu3wgpJBZ/p8KIb7oWDT30I/CBhlk06dFe/CCusWLpahzfJhTp8/p25sML9Gf10OG32Q3DwKaGv6/C2G8Eu0WdLKqwQF+LQYeDg0WBoegSsULL5sA5D1y6Cg89yTtDhkIvAvt0nDL/DQx/8jw5tn18MB9u3HtRh/wCwq1xw4wOwwo7wQTo8uH6vDrvHg3dSRCZPTAAbNmkjHPztWvByE1LBYZsevRNWSP5irQ4Do7xwcP3mzToM/ga8P6PfKYEVPOikbLEGgteqL4cV7NYAHcZEpcLBvUaCiWLzknd1WGWLwi+XfKYOd+SBD7RbXAqs8MupiTrM/90ncPBffgHOa4YHHOMBm/HxFZ4wUIdlp+KXC/4/UDkheagOY6rxE0fTZs7R4bzHwBmwR91SWME08M4G2dCuYhrWo6/QzGUhCE0TX5hZ0MuZza3XMdCpHFVu7uWaGXwMbxo8vppbYGSgDbZawSWf1YKvA6Oik3U4Yso5cHDtgNN0+NF8cA3mSEmFFWp6gau4/Us/hoNjjTQdTuwRrcN9s8HJXUQGVKMrq/Hg0re6LhVW2FMHrqBy74OfkRgfgX/nF2ot06GjG55/iivAFVRdWT4o68mDFXpP+oUOCwLw+2M4wDXYhF/30uHTBS/DClWPr9fhozc+CQfLRHD1+9T7NTqsCSiGBepW5eqw5NGmS2da/n2ZiE4SroSlzsP/LNLyGcV/bSkceZSLT/WtUU+gxjaxHPX2nEC+Ow8YhuHfgY3fsDx+A7iCJCIiIiIiovZpxJ8OjvjTj/4iyyd3EbUJNmGJjlnr3MSgrZ7QBW/8yvYrERERERFRx9VCK5arYolaB5uw1Dm1/Dc9/3OM/8hjXdnqv1j1ZHC5XI2bdLJfS9h+JSIiIiIi6tR8rVj/bixvF0vUatiEpU7lKLuojY+9ak4La139m7at8M83WuemBM09d4vtVyIiIiIios6HT+4ian1swlKn0tiybPnf7/s/v8s/b26FLHRSbwjrvxn+NyU4GfWb3PhV1PmYiIiIiIiIOh/YiuXtYolOEjZhqVPxb1lmZWUd8aFbekDLt2F1uVyN/cpWuD9A44uejLK6/eo7AbP9SkRERERE1HXoXwP55C6ik4FNWOps/Hujvn9P0fifTdqO8KYE/h3PJm1c3/1SfV9nZma25gnpiPdPOHq+G7/C9uuJegkiIiIiIiLqWPSiHLZiiU4swzTNtt4GohPM5XIdcZlqZmZmcytMj/jtLXzv0TMMw/fFUR6DTqfTv216HEeuy+XKzs5ucueBIV8V+r4odxfpb5lU3k+H5bHVsP7atbt0GNYzGQ4+Kz5Eh90KwZ+Fnt2/AlawfnpYh7ddPkWHyeeDkSIS6rkavNxDS+HgZcPP1eHqi27TYfTygzoUkasmzNRhzACrDgeND4UVCnbVgsFv9IeD384F4aJb79JhuAcWkMiCBTpMTOoNB4f3HaXDvqeN1OGGT76GFRrq63VYsm+rDr1evMXp516pw4Xr9sPBkgsqDzx9sg53zXsMFjhn5sU63FsIfgp7XC9YoTo0TocbDhbAwZVLvtRhsFmnw9/eie+U0uf0njrc0vN+ODih7isdnndTlA7ju/8aVvCcu0WHt9X9RYfFi4phhSfdYKeyRoTDwXW7MnTYbSeYwWJM8LaLiG3NmzqMTh2mw8pTwbEsIpVr1+pwznXT4eD0GWAinWEs1GH+/Htwhecm6LDHynI4uEdIoQ5PPe8aHUZMOx9WWLoUfEynTorVYWoUPj0t6L9Jh7GOKjj4soYnweAg8M473j8AK6ydv0yHqz8HO7aIfFsDjrvoveCtsO4C+4mINDz8mg53rQMnlLzC3bBCYo8hOhx8yhlwcPLUs3T40F1P6zChCEwdIjJmxEQdlqZfqMPheAKTsZcN0OEpm8+BgyMfBLtrQgnYf0qfj4EV6n+7XYeB20rg4FB3pQ6juwXp0O3B61EC7F4dVhSDKyWHG1z8iIgpDTo0xICDm6lwTE7KL3QWiw2/GH41kJomPmUbBnjnm3s5r9cNaxz9y0FWi12HtsBucHBYRHcdjjjzIjjYHgdOuLlh4Fha/MnHsEL/gEAdDpt+Khz8yktgrUZqaLQOT58xHlYYNAyc33fawPvzyYj/gxVsbvD+vB2cBwdHrHpVh+GPj9Bhn2U1sEKvQWN0WNsALqrrCjfCCgk903U4+QJwHSgin3rAZ7f0r+AKauqpp8EK8cPAVcq/A16Egy1vgqu7v70Hfukoi3sOVnj6/BQdju8HLsvzpsbDCoeX7vR9se2hof75CfktmKiL40pY6oScTmfLS0ezs7NbOH/4vr25W7621bnnp7yo0+n0LeP178AO+aqwsQNLRERERERE1CjtnnVp96xr/E+uiiX66fDfG4k6OqfTaZqm7wzR5DFcR9PN9HUt/ZeO+r63yf0NforjWMp6HN/SZP2sD3uvREREREREdES+PmzjqlhfK5arYomOD5uw1Jn9xBODrxV7ojamlcH26+jkWbUvP9Um20NEREREREQdke9GsStz3/D9J1uxRMeHTViizka3X/nQLSIiIiIiIvop2Iol+ol4T1iizsPpdBqG4d+BbfJ0SyIiIiIiIqLj1uR3TN4rlujosQlL1Bmw/UpERERERESto7lWLFfFErWATViijo3tVyIiIiIiImp9uhXre5Y1W7FEkHEcz1snovZA3/v17Gy3/38OSfXo79oYtw9Wqy4O1mGc3a7D8pAKWGFT+Vs6jCn/ORxckvS2Dvt/db0O0xNgAbGf9boO+1nAT/HLm/4GK6Tf+k8dXtHrOzj40rs/0uEXc9/RYcXscFhhTVSDDreO7qXDqIIiWCE9AdzF+8kNv4SDo9cO0+HEBvCHN7OmFFYoyd2kwz/MfQAO/kbqdPjq79fpsE8C/kR3LvpYh46qzToMG30VrLBt1Vc6jDZL4OCf//luHVrd4DNa6wiDFbp9v1OHY6b31eGjj4P3QUQadq7V4alj0+DgYael63DBOPDTOYJqYIV9QYt1+PNg/P68sRJcNx+qWqDDQdvAQScin8WB96fsafAZeR2wgCQeBPNPad4uODg6EHx28eN+psP93y+CFULyPkAx+lu1CaZWEUmMT9HhnGXPwsGRkeDjGHv333UYfaAQVnAsnKTDgfUb4ODU2FQdXvD4EzpcVxoAK4QNrtfhrogCHXYLqYIV5uaC2dVY3RMOTvgyVIdXvAhe7sY6vMHF14G58ZH3tsHBk84EL5cQn6XDZe/PhxU2jQTz9taix3RYsWcJrJCWMUGH9vBYOLhq2iU6XPTEozpM3f8JrNC3T4YOu8/8jQ4TUyNhhTN/VqvDoctuhIPnzH9Ph++9e40O0w/sgRUCDLBfeQLxCdci6ELFCNKZ6S6HFcQAx75hBbOV11OJK8CqYsDcFPDrmCMgBIw0vbCC1wvy9J6DdLjzID4KAmzgUKqoLYODrRZwQeL1grnRa+AHkBimW4ceLwhFxDDA+2ZHH4e7mQpW9Ma7PeDEAT8LEQkOjNBhTEwqHDzxpt/pcG8R2Kkq6q2wwrLFy3QYsBOcOESk59RrdXj4UL4Op0wZCCskDonWYffh4HLimhWfwwqpe8EMdsl4sA+LSM9+uTqMsv5eh+dfnwQrRH8Hzh2DoqLA0NrDsEJpITihGDVgw0Rk0JizdVg/BSx5+fBff4EVepfs1qGlvhgONtHhXFTfTYcxXlBWRGbOB5dbbw8Ap4NhOVNhheHpYM98aeiHcLA8+MM16tonfnQdm5mZ6WvI4m8k6pK4Epao49GrX8/OdjfpwBIRERERERG1joxbtmXc8sNfergqlkhjE5aoI4E3H2D7lYiIiIiIiNpcxi3beIMCouawCUvUMfDer0RERERERNT+8V6xRBCbsETtHduvRERERERE1LGwFUvUBJuwRO2Xbr+KCNuvRERERERE1CH4WrGNv8ayFUtdGZuwRO1Rc+1XdmCJiIiIiIiow4GrYttwe4haH5uwRO0L269ERERERETU+egbFBiGwVYsdR2GaZptvQ1EJCLicrmysrKahBe+4/b/z52DN+lv3L9gJyzoTWjQ4dT00+HgTbWVOrTE5Osw8pNTYYXa8bt1eEFcOBx8dfRGHda5t+hwW+EzsMKLeTYdjqxbpUNHBn5/zg/crEPrFVfCwd/Wgjfz3R61OvzwhUthBcs/m364IhI2ar0OU42vYYWDwVN1OPTrW+DgwWaFDj9wLdPhn+7CH2heRLAOf/WvR+Dg4IqeOjwl/BQdFmxcAStYSrbp0Ft7GITh/WGFwSlggxMuvQoOLpy0Tof7G+p1eH63AFjhDPNtHZ5dMlaHs5bNgBXm5R3QYcZ+Aw6OOqO7Du2DwftTG3QIVrgvBBx0pdXz4OCicPCD9Kgp1eFdtefACl/m7tXhqJxpOuwTVgMrrAkM0WHpc0/CwT0s+3RYHztah+X71sAK1kowu9osYJ4ZknEmrPCzR8DBWNS3Dg6e+Q34QR749wM6fHTJFbDCwDowYdqD8ZQ7Z851Ogy7EuyZO4PAuUBE/rX7Wx0mDQzSYX7RLlghsBBUyF8SAwev/c0fdNgjCHx2lT+/Hlb43cLvdPja5KFw8KAKcKJ5vQxMue/1wUdowhLwQa+8PFCH//nLZbDC0DBwlnGExcHB1Q12HVYUg1N2WAA4F4iI3V2mw96pGTqc/ac7YIXBZ4CTvu2BZ+Hgv6x/SYfP9LhNh/2/Hwkr2Dc/p0OvuxoOtljRvI1+4/F63SAVMSxonQr6pck0PbCCCNhVbFbwwTVXObk3mIfNkFhYoEeQV4eZf/utDuvzwEwuIk/nR+ow6iV80rfWVoFtiAXbVlsLrpREZP12cP0TGpMMB+/bA67uQh3ddBgdmworFBfm6jAicYAOd21ZACtYDPCBOgLD4ODo+H5gcGyKDg/fDCZnETl0uFyHdRsO4pdbtlaHoSFgfh549lmwQnAc+EH2VoMzYOJM8E6KyEE7mBCuDMPXGHMbkkBaPUFnN1ZcCyt8thtc/+RWgKNg0zJwvSciFVXFOrR8+CIcLB5wZkyNAVcpU+/9AyzwfFKBDhsuehwOtlaBN9nwggqGacUVrGB3veZP/9Lh8LPSYYWs0A902D17ChxsMcCuEhMOzoDRaq98MetHm5qZmckbFFCnx5WwRG3P5XI5nc4mHdgL33E36cASERERERERdQJXZ5tXZ//wVyiuiqWuAPzVgohajcvlys7ObnLzgfEv4JVTRERERERERJ3GuJdqRWT5Vf9dKOtrxWZnZ7MbS50Sm7BEbcbpdLL9SkRERERERF1Zk1ZsVlZWZmYmn9xFnQ9vR0DUBvTTt8a/UMcOLBEREREREXVN416q9XVjRSQnJ8fXhOWNYqkzYROWqFWx/UpEREREREQEjXupdnTyLN/XbMVSJ8MmLFEr0e3X0cmzGs8uRERERERERCQ//mWZrVjqNNiEJTrpXC5Xk9u/sv1KRERERERE1AL/35obW7FtuD1EP5FhmmZbbwNRp+VyubKzs/3br+lz9zUZE5oSAL+3phI8N8+xAty4YOSA7rDCiqQ8HYbb8J9e+g75UIdDA3brsKeMhBUq5Fkd/ubr8+DgP0xeqMMv8sCPvCwfV3h0SB8dnle/WofR774HK6z8cKUObxvhgYNXVf1Rh/2eXqLD1FtehhWWXfSZDkPKQYX0vrWwwvI1w3SYsetqOLgn+px319XrsPDwLlhB1h7QWWx0EhwbFBQCKu/erEPbnq9hhfAgQ4cxAyfpMH8b+JRFpL6mUofWlNPh4KE3nqXDiDNf12GWuQpW2PcC+Dt81M/H6PCqVdGwQkXCJTq81gAVRMQav1eHJcF/16HTGwkrJJbm6zD1c3wvlMOfLdLhCodXhw9k9YIVdhbdp8Pw6IFg6JeHYQXroqazpYjE1xbBwRaw+0jFoe06tFV8DytEJ4/VYb9hIDznlvNhhRFDwOEc9KtfwsGfm/t1eGXp3Trs//UKWKFX36E67DPxXDjY0S1ChxtHg3PHikVrYIXYkH46zE8Ds0Tct1GwQvUouw5zLiiAg3uvvEOH5tw9Orxn4U5Y4Z9jM0AFGQ8Hx74PZrCk8u90aO17Bqyw4a5QUNb7Lx0Wrr4JVkj6sEyHKcHFcHBtQLwOq6vAHBhirYEVAoOCdTjq1FN0eMEN+EcengLen5Xn/AIOnrtvvQ5nvNFXhw8nz4EVAl+4C6QLP4eDS779qw5NE5/fm/FTfz8yBMxKFosVDg4JidNhSho4HcQNnwArBISF6/DcX4HDdkzQt7BC6b+u1OHoXilw8D+mva3D06xf6HCBHRz4IvLB0qlgsDcXDp61DVx7FG3YpkNbM1e5I4eCeelAVZAOF2/Cp8W6xS/qMCnaAQd3656sw1ULsnXobaiCFULiwQxfnX4hHFxdBM7vdo9bh5aaclihZ3IPHSZmgMvOymiwr4rIdgNMNXXx4LJBRCyngCur/A0f6TA8CezYIrJnPpgwxQI+fcfwQbBCfBy4Qtg9Dx/4CR8PBttmD9NhuqMUVphxNbhyeCMGjpX1j8zXobEGzKLdPRthBdNTosP4iEQdTs28ElYY+PMZOnzJBk76IvLZF9/oMPQAOE8lhAyAFaxngt3Vsa7pBi+8+kcfcWZmJlfFUkfElbBEJ4Vv9WtWVlZjB3bI7OW6A0tERERERERELZj4ojfmo68a/zMnJ8cwDK6KpQ4HrDsjop+oyc0HRGTI7OVttTFEREREREREHZ2vD1s447//SsPXiuWqWOpAuBKW6ETST98aMns5O7BEREREREREP13MR181WRXLZ3ZRR8EmLNGJ4XK52H4lIiIiIiIiOtma9GH5zC7qENiEJfqpGm//6h+y/UpERERERER0kuglsbxRLLVzvCcs0U+ib/86OnmWiODH2xMRERERERHRCeL7BXxl7hu+//TdnYALY6l94kpYouOkb/86OnmW7wRARERERERERK3D/5fxxrsT8Eax1N4Ypmm29TYQdTAulys7O9u//XrVi94mYxr61elv3F3ZdJiI2HuUwFdx9NyiwyhLgA4/+gZX6JM8RIc3DVoKB48reU+HT732qQ4DNtbDCs9sv0OHNzxyLxyc1L9Yh49uy9bhnRngpxCR6//9hg4/e/pFHa5Ns8MKjx24T4fpW76Eg9129FNbonUWc86DsMLypG90mNRwqg6LxhTCClH5PXV43rlRcHDOrxbrMDAgVIdTR6bBCp+8/RFI3WDHFhGLGDoMPfy5Dq2hPWCFi2+6TYerJVmHjkWvwgq9eyfpsLLvKXDw8pFVOtxve1aHlt3ofRCpSH5MhxFJoGxqxHewwmCjvw4jTfz+HCr5nQ7fyr1EhwuH58EKtbUrdPiP/wP7iYjs7t5NhxeuKtPhHQ1nwArhSyfo0PR4dBhYWAkr9PBu1aElEb9c3Z4FOrR69uvQMPCfn62O7jq88pc363DIHWC3FJHTc8E7f/tF4+Hg/NmBOvy6ar4OL4odDSu4y8D7FtsLTwirvgeDC8xyHXrq8Qw/si/4qYO7B+lw8gywn4hIWkCIDlNfGwkHhy8erEOzAIw0gkBZERn8+SEd2j0VcLDX1qDD4KAwHVbVgTdNRAwT7Fcpt32iw017NsAKCcPBW1Gd/S4c3LAdzEu9B4wAQ1PAWUZEDq0FJ7trbsrU4dgr8L/tGbA3X4cLLz0bDnb1Bdc/T824UId1G/bCCvZzwYEQkx8LB4ffB/KofeCywWKAk5eImAJ+P4K/M+HvP0aBAcE6TB8+Q4c9z5wJK6xctFGHl/32LB1uGbYDVhhx6zgdXj16Ihz8xXV3gcoxYLobfxOeMN+UIh0+HAF+ZBFxjLtGh4EBiToMNsB1soicd7CvDr+JBZP2/sfw/cTOPR3s2/EpYA4UkbAUcLJbsxTMEpse/AWsYPeCS0HTdMPB3tpqHRpopxIrnjDdNnBBm5iSrsPSSnwdaB0LZo8DlXvgYMdhUCQkEGxweU9w4Soixee/r8O6hb10GPRZDaww7CKwU6WOxL8yuP7znA77W8EOb/WCuU5EBoaW6vDsG/AlzSO7wKx7eP4iHYZ/AX59ExGHgPNlavIAHfYMBlcjIjLs+ut02BAXAwfPS1+jw0/fBNvm+D4FVoj3DNRhelwfHXqG4Gl/93c/Ordu+sdQ///MzMxkK5baD66EJTo2vn/a0HIHloiIiIiIiIha2cBfrxv463WN/+m7USz7sNROsAlLdLTg/QfYgSUiIiIiIiJqP5rcKpB3J6B2gk1YoiNzuVxNHsDF278SERERERERtVvwRrFtu0nUxbEJS3QETe4/wPYrERERERERUYfg//s7705AbYtNWKJmwfsPtOH2EBEREREREdEx4d0JqJ1gE5YI4P0HiIiIiIiIiDoN3p2A2pytrTeAqN3R7dc23BgiIiIiIiIiOiF8v+CvzH1D/nd3gszMTK6KpdZhmKbZ1ttA1F40ab9e8rt8//81akic/pavyvfAUmXFO3XYa8BpOtyzeTmsUBmeq8OA+kgd9gwaDyvsS1mjw5+X4J7y4yvG6jBx5t91GBUUAitcGNlNh88cfAIOvnrAL3R4fdx28HLPfwgrPPkxqDy3F5jQcnc/CCukf/0BSAOC4WCzvkqHtm59dHjYnQArRIbYdWg5/RIdTr1gEKyweMy9OlxzP9glROSsbpfp8GAM+MNb6aO3wwoOu1uHhnjh4MjQAB3aDDDy4rsfgBU2Twef3SubvtPh+NwLYAX7vhodFnTHf2vccHiuDlN2jtDhmFt7wgr9+l+rw2fm3qPDGy8IhxWWV9+vw70FDji4occYHb7dLRZsw3NXwgr/2t1Lh57QU+DggJfCwDaMAm9mt/URsEK36iIdOqRSh1Y3GCki0gAGez1lcKzFAHsbvMJp7qLn0ruf0eHYmUN0ODx1HazwVX+w/zzhBAe+iFRNSdfh3rArdeh4B8/wg3uDSTtvzTY4WKxWnYUUFOqwv30PLHDlyzN0OCobzB7W6qWwwldp4Ag969f4pxuwG3z6Qd5SHZoG/ki9tgYdWgzwPogI2n3E4/XAwVBKTG8dHo6ZoMPE2FBYodv1WTr85F/z4ODoJa/pMCKxrw4bEk6HFep3fKTDq353lw4vuhqcmkVke8PTOtwwBZ+yfz0aTJhXPgIOmfuffAhWeG1rng6vduDZ9YIUsLM1PDRMhxmnzIQV1iwHv4rbreBM1+CphxVE0F7VLLAb9+6ZocNhV/wWfv9nm8Epe1BAAdisGHxSe/uUHToMDPwEDv7u9Ck6jHsH7BKZX+IKH9nBmxkbiQen3gAm0o1P7NVhwiFwJIpI0A09QFoBTrgNi0tghVNTUnR41gA4VnalgVNVtQ3MYP9ccAhWCLwTTKSxtRvx63nBdOetBr9HmGZz0xraXdHkag0CV/siYhro+tkDjkQR8YQOBJWjwEW1uxLswyJSU1kO0gjwKVeE4suq4AO7dRgfGQgHn3LTHTp8rdf3OrQH4kkp4huwGakfZcPBM26/RYfPJObr8NAji2CF5I3gcB4z40IdxiaBK0kR8aB/MF0QGg8Hx4eCfeWdQeAdLnhzPawQXBetQ+sicPYZMnQ0rJCQBma2NVsPwsGx9T/smR/P/eECOzMzkwtjqRXwdgREIuj+A006sERERERERETUOUyfs2L6nBW+r3l3AmodvB0BdXUulys7O5vtVyIiIiIiIqIuZfqcFYWL/867E1Dr4EpY6tKcTmdWVlZjB5ZP3yIiIiIiIiLqUvz7ADk5OU6nk31YOhnYhKUuyuVyGYbBB3ARERERERERdXH+S7Ia707AViydWGzCUpfju/1rVtYPT8DgAlgiIiIiIiKiLg62Ytt2k6gzYROWuhbef4CIiIiIiIiImtPk7gSGYXBJLJ0QbMJSV8H7DxARERERERHRETVZsMUlsXRCGKZptvU2EJ10TqfTv/0659X/7vZVNrD/hxgGLLJna4kO67pb4eCiNet0aKkGL5fUfySsYO0WrENvQaUO88dWwwrJ++J0eMCRDwdX96vRYU1NoQ4T58fAChIepLMHfx0Fx07f8X86fPfu23W4vUoesAAAIABJREFUYnstrPB8Jng5WfU3nfXY/C2sYKvP1WFkGN7gyuC+OvSUbNChYQ+HFexBIP/lv/+pw2s3gZ9CROxfhuhw6sir4eBlLz2lw+iCZTq0WYpgBZvNpsPYvmfiwQGBOuw/foIO549KhRWq7n1Nh5GZF+vQkhwBK9RVl+sw6gDYMBEJPwt8HIHxVTq8q98tsMLe5Ut0+MrIC3WYt68CVth/KF6HVZXgsBWRKWeBItH/+osOX3/rN7CCLSZSh2F5YJ4RkcDdq3QYEVSHxuIJ0yIeMNQE73BIENixRaSyDByhzbHZwA9S3wAmzIzeo2GF2S89rsOEwd/psO9dV8EK92/YpsOnJ82BgwfOAVPKjnPBCWXgqItghYOVu3ToKPbCwWdk9NLhmVf31+G0nh/CCtG/f0iHwWlJOixd2AArWHJjdTh0/VY4WNDFqd1ux4ORBk/90Q+GL3dMDAMsa7Dbwb495dqHYYV98YN1+MXmz+HguDf+rcOEvsPBhgWBA19ECjZ/pMPL7gZnn5dnguNIRMoDwBXClNeydCgir24G5/eQIrD/WPAVjZQMWKzD6/96Bhz8+IavdfhtDDic//DVWlgh/UNwlZJXWKrDvd+/DyuYxjHsVQaaSEMd4LOLHzwDVjhkSdVh2sBkHa4/HcwGIrL/3ud1GBkNPiMRufCGC3T4p9736fDF3z8JK2wZACarp1bgE+78r27ToeXAJB1OexhfpZyfcL8O95wNZolc90ZYwRsAPv3rep8GBw+OWa3DfGORDlMOzYcVrnaBz8729Hg4OLkGnA6sXnBRZNaD32VExOtFE6YJPiO4r4qIiadRPBjOuRYruLA3AsCJQ0S86Fxn1B8GqSUAb0IDmGvM4O5wbKANXNKknQbO75sO418MT7kCHLnuoeCiSES+fwl8dpfdBiaE5+zfwAq71+fpcNALQ3V4oXMQrPB+NfhBqtbhC7N+EeB3Q68BKhQdAseRiBQXHtChOwJcw4cH4pNadyt4uSEpeMVhQQq4At9XAHbXCMd/v5g750f/a3Z2NruxdNy4EpY6uSYLYOe8ajZ2YImIiIiIiIiImjNnrjln7g89BC6JpZ+CTVjqzJo8gIvtVyIiIiIiIiI6Jv59WN4llo4bm7DUOTVZADs6eRY7sERERERERER0HOCSWLZi6ZiwCUudUJMFsHwAFxERERERERH9RP4P7MrJyeHdCeiYsAlLnYrT6WyyAJYdWCIiIiIiIiI6Ufz7DDk5OVwSS0eJTVjqJFwul9PpbGy/ChfAEhEREREREdFJwCWxdBzYhKXOwHf/AS6AJSIiIiIiIqLWwSWxdEwM0+TTiqgDc7lc2dnZje3XcXfnjZkQD0cuTdmpw0PWEh0mvtsHVvCW1YBw90E42FNarMNxZ43X4eHYcFhh3+lrdbhz/yEdxhQNgxW86w7rcFTEADi4uLdHh0GhIDx/sBdWmBn6qQ7XvH4bHFy6o1qHH1WW6vAlz6WwQmq2VYfhHvhxlMEKAY5oHTbUVcDBNqtdh27T0GG3iARYwTPwch2uHbBPhz1394UVoqaA/efQfdfCwSGeXB3aAwJAaA+GFRJSwH7ljU6Hg8sr6nS4ax/4OIIqwJEoIkGWSh1GTL1Hh3vd+bCCd9FCHdpqC+BgI30iSE/pp7O8fmtgBWsPcPaMsK3UYf6yGFghfPsgULYQH1/lCeADte2x6TCxLApWsNaCd1jqwEEnIoG1u3Ro1ME3swFWiI0Fu3F4n1N0uHvbRljBU7BMh7bAUDzY69ah6a7V4W+uuQNWiPgD2LbzKsG2ZV96Nqzw0SgwYZbccAEc/MWb4LgL+XM3HfZLToQV7BVbdJia9Uc4OLFXpA5fHpetw+KPN8AKyQ+CwznCA05JpgXvw2Kg3A5mURERdHXqNUGFZr6/1RlgQyLDe+hw7Bx8Wpy/sUqH1W4QikisG6yiCCjfo8PQ7viEUrR6rg5PnzZThzVwthSJvKJQh0kNF8PBt0w/S4eO8hAdRpfshhUibOCSZuh5v4WDY/7aXYd/yfsSDN0H9mER+eqUj3R421/f0WGPuXfBCkNPAT/y1pXgPCUiBaV5OqysA5O2YQHTvogYAeDawxIcB0b2nQ4r5G4EU25SA7gWFZFeE67T4chp43SYf/krsMKrHx7QYcVq/NM9eDGY2U7pO0OHk36Lr1J6LE7TYWwUeH+qg/FlufsgOC06zsFvZo9rwYSw7fBTOjz0GrjwEJGAYZ/rsGLTQDh40KJUHQ5JAWeZfavegxXKa8p1aDXB+R2ebUXEFDBpn8w+w9HP/XgbbOhQiuiWDAdb7A4dBkX21GFU6mBYYVsd2NmmZuCd7d2fgcsJ92JwdTdwKrjOEZG1NnCxXbXlGx3GZf8MVojuAw4ZRxm42heRkB7g2mxvMfhdGJ7cRaRqG5j5HSXgDBjaIxVWGJwGrnOqu0fAwbZAsBkVB8E1RlAU+H1TRJYk79dh4LvV6//2wxSUmZnJVixBXAlLHViTBbDj7gaXsEREREREREREJ8+Q27Y2fp2Tk2MYBvuwpLEJSx1SkzvAjrs7jx1YIiIiIiIiImoTQ27b6t+K5V1iSWMTljoeLoAlIiIiIiIiovbGvxXLJbHUBJuw1JE0WQAr7MASERERERERUXvCJbEEsQlLHUaTBbCjk2exA0tERERERERE7U2Tu8Q6nU4uiSU2Yan9uvXWW5OSkpKSkqKjox0Oh/8C2NHJs9pww4iIiIiIiIiIWjA6eVZj7yInJ4dLYolNWGq/srOzDxw4cODAgeLi4traWl/oP4sREREREREREbVb/h0MLont4gzTNNt6G4iw6Ojo4uJi/+SPSzz+//lSw179Xb3zk2G11Y5PdJi8fpgO7WEhsIJlJXi5/n17wMG5BdU6TBqapMMNoRWwwqHUPToMfAMMHjNjPKzQowz8lSV3NL6HQ4G7Xod/TntNhwP37IQVNm9cqsN56w/CwY9una3D/h+U6TBISmAFrwHeYbs1AIy0OmAFMb1gsBuU9Y3WkcUWCsa5G+D318RN12HvMZN0uKcnKCsi9XNf12FY9Vo42PSU67Bn4iAdxk+8FFZY/f0eHXqqQVkRsZZv16EjIl6HdcW7YQVBn11NaLoOGw5thgVCKteDbYjvCwfXBqTqsKgA7K6BUXhKqbocHHeeBWCWMD0eHYqIkXdYhyHNnJOT+4LPzhsAJqvS0mIdioh7y3wdRgSBA19EesQl6rCkIFeHFfU1sEK3mN46zC8C+49Riycl0wOOfUszh7PXAzbDefNjOhyXNQZWiB8A9quY+2fo8BdB4IMTkZqzhoDwQBEc/P1TV+lw1siLdbhiD/5AbYuf0GHwAFBBRLzoY9q8GcwevWQdrGB6wcwWYA8EI9FsKSINnjowuNmrUOOoovbNYrHqMKnPaXDwVg84ZELLN+LKqZNBeHiTDpNPORdWsDnAoeStBWfAEd3xafGiO9focOQz8+Bg8/UJOuy7/QMdTh4+DVaIjo7WocWCV5MM/eXlOswY+54Ou3/0CqzwzQcrdVgxEOzwL1z/MKzgXTtTh5Vv4Uu+lMJlOgy0gnOHuQuf9BvQVVxEWIQOIyOjYIW3v3hTh6PSxsHBGRMmgspnTNJh32n5sMIz3n/q8M3HwacsImeG36vDg2eASXvD66CsiEQvBafs0CIwMTr2fw0rxCWDC5LK4DT8crExYPAl4CjYsvMrWMHyVaEO+0y7CA4+PB6caBwFkTrM37UcVuj23GodhpQs1KE9FFzaiUhDObj+sVnBHCgiXg/YXd1eNxwMWQxw7HvRhb3RzKkDnqqiQmLh4IjeYP+pMoN12OAG2yAiZgPY2coqwWlRRP7w1C06fHTEAh2W/gb/Hlp7AdgDE7eDn85yzdewwsa94IItYlkGHBwRDDYjsSpMh0Xr8G+R0XabDsuranUYaYBQRDz14M08+5LhcPAf48EMb32rUofpg86CFWoHH9Jh2QJQQURsCT+aitdfEdf4dXZ2NlfFdkFcCUvtlMvl8u/A/nGJp0kHloiIiIiIiIioQxjyn4LGr3lrgq6JTVhqj3zP4Gr8T7ZfiYiIiIiIiKhDG/Kfgtl//e+/MsnJyTEMg7cm6FLYhKX2xeVyGYbh/wyu217B/7ibiIiIiIiIiKhjaezDCpfEdjFswlI70mQB7G2vNLADS0RERERERESdiX8flk/r6jrYhKX2wul0cgEsEREREREREXV6s/9a7X9rgqysLPZhOz02YantNbkFARfAEhEREREREVGnx1sTdClswlIb07cgaMONISIiIiIiIiJqNbP/Wj06eZbvaz6tq3MzTNNs622grqvJLQhuWVn7pu17PSwoxwu/vT64DqTfl8DBYeGJOrRWgp5vcGgkrGCGBOrQs3MPHBzeb4AO7ckJOly/4T1YIaw4VIe9Lpyqw6LB+2CFPU8t0OHNd+I/rHXrvU6H59e/rcPdC9+BFWYvzNdhyIuz4eDIhu06NALASK+JP30DhSaKDcMGK3i9aP/BhZsD5k/DxBUC4kbosMKRrkO32w0rhObN06HNZoWDQyJTdFgf2k+HlVX1sIKlchcIrfhPd/bQeB021NeCoRWgrIiY9ZUgtIB9wnSXwQqhQeCQqbXHwcGeylwdGugPk+7AJFihzhKlw/rAGB3G2othBVsIeNMieg6CgwtN8NOVblqswzHDwU4lIlHh4M3sPiwDDv5iwR4dlix9SoeGWQEriBVssFkH3grDwMe41/TgysjQXiN1+LPnHtdhQMYeWCEt71c67PdkkQ5DJk7HFeKX6XD1/DFwcK/iTB0Wr/xWh9FlVbBCN89uHcYmD4GDzYRhOiz4dq4OA6vwEVrjBhOmxwNmD7OZSRvOrsc04bZn8GIa/nTBDnyNURuUqkOLBb9DDQ3gTbabpTp0pJwJK0SnpukwYuhQHbq/+xxWmHdZoQ6912yGgzNnX6fDrHvAeSo0BO/wez1g5n95UzAc3GMTmF13x4PJ6o/DJsIKT/99kw53jO+lw/+MBnOdiPx1yX4dLtyEf6POmjFah4tCwHlqzLLesELt2HIdDjPAtr1VjM+h1tdAhXOGh8DBw38OPqY4a7UO+7jxZbnj63vAy23bAAd/tedKHY6Pf0iH/8/efQbGUV5rAD6zfSWtepcsufduCzdMMaaaHqQAAUIINZCEkARucm8aKRCSm4QkpNBDC0iiY0xxMBgb27j3JtmWbFlW79qVtsz94WSv4vMusbBltff55bwcn52dnfnmm8+T3W3THoMd2j8A7y723Xgdxh3GY2CCpUyHqeMvgcX17WBuFhUHpg2Hq6thh9aUOB0muVJgceK8OTrc2QjuAnzPrYQdnLFg25KaK3U43FkFO3TYwMmYN2seLI5qAwfhqi0bdGh24gHBHwBXH18A3Na1+/ABb6DB1R/EDwPFwnE7bgR4OQuYB4qI6UMDpt8Li7PiwS3nzb8BB/w/zvwF7PD8nRN1mOMHM4Tzpg2BHRwzYnX4XPqnsLjxY3APOD14uQ5dufgtD3eBm7VkL5i4ltfABnL4U3AqhXz45VJSweFa6QYnXf2O7bDDKAe4WZt5EZ5UN1nBu9vqBtOqpCgRkadPd4eTq666ikuxAw+fhKXeccxXENy91nf3WrReQ0REREREREQ00N244v/Xjo/+Wlcvbgz1BC7CUi845isIuPxKRERERERERIPcjSu84aXYo+uwfB52IOEiLJ1SRUVFXb+CgA/AEhERERERERGFdV2HLSgo4DrsgIG/KpGoJ+hvgO3FjSEiIiIiIiIi6oOOrsMe/ZbYgoICfkXswMAnYekU6boCm5dzTfi3/4iIiIiIiIiI6BjhlRN+NcHAwEVY6nHH/AYXl1+JiIiIiIiIiP6jruuw/GqC/o6LsNSzjvkNLq7AEhEREREREREdp67/Z+KCgoL8/Pze3R763AzTNHt7G2jAOuZLYBP+9HLX/2qpBX/FvsGvQ/+6rbB/tN2lw3j/Abw1iVN0ZnNH6zAUlQAb2H1NOvSATRARMTKn6nDfzrWgQ6Addhh10dU6/LQW7Ip7v7wQdkgY2qnD3KxtsHhC5bM6/M3rT+nwd09/B3bI2rFJh27HEVhsMcC/AIW6Nxwdf7Fx/KkZoa0By1FmhvBGWAwHKHamgNIOvNNMCerQ6ojFxX7w6eONs1lhhxnj5uqwdN9mWNzkB/st5G9GmwDOcRGJcqKTEW1wR8ALO8A3Z7XidwePQJvVqUNfRyvsAD9+0wD7wRE7HP79QGu1DkMJ02Cxy7dHhwsK7tTh6IWzYYdyD3h3T/7wFVhs2bVah/G+DTqEb1lEzFBAh9FRSTr0R/hAAyiPNErc/KVv6nDcr8HY6PaeBzuc/RPwcrHV/63D1F9mwQ773vuHDp3PgbcsIpYKcHaMMqt0mD7xXNihcttSHZ72hdtgcUPmaB2Wv/eRDttWPgg7WGzggA8GwXe7mxEGQTyKDj6GBQ9KhtUNQkciLA61V+rQRDvYYsdTmtTs8TrMu+M+He5qBRsmIjsWv6vDEQdegsX/vfUxHUbZl+mwse0B2OGlT/aBsGYmLE4MPKzDmERwMtqS8Qg/aerHOly85EUd+qLxoH1+2a90+ErtIlic2nCzDqM2glFi7A2Xwg5VdS0gPQw6VHSAq4mIdLz4jg5HTMB7+PoHwc3/lTPe1GHcC5/ADutXPK7DWz344yhdc7cOPQfBRS0hEY/PjbYOsG1lYEpsN8DFS0TcocMgNSLM+ezozDXQKeqtgw38VnC4mhGmfLGJaTp0Jo3QocesgR3aD4CLflpytg4zZ+GbjmHzwaRx2Gi8wfGTwL3PjUvAp3/pGjDWiUhsjF2H7725Qoft9YdgB6e3RIcJsfiSneIEc/i42HgdxqSkww6btq7XYUdHGyzOiAXHz6K7vw4qr8XXiK+VP6LD8kcydThz+Fdhh4WzwHTrYCy4FxaRnangNF/3V3DK5I24CXYYNgEMVq4k8HJVjoOww6oacKjYXsmBxcP3pepwzkxwHgUSwe2JiGSPBwOF2xLhltMKduZOAZ9+uQWPgXvMfxsoto785zrDVVddxdXY/ohPwlJP6boCm/Cnl49ZgSUiIiIiIiIiouM0qeSfTz7xqwn6KS7C0sl3zJfAcvmViIiIiIiIiOgETSrZxK8m6L+4CEsnWVFREb8EloiIiIiIiIioJ3T9ta78/Hw+EttfcBGWTqauP8PV9aujiYiIiIiIiIjopOi6DsuvJugvuAhLJ0dRUVHXL4Hl8isRERERERERUQ/p+ugbv5qgX+AiLJ0ER7+CgCuwRERERERERESnzDFfTdC7G0OfjYuwdKK6fgWBcAWWiIiIiIiIiOhU6boOaxgGv5qgz7L19gZQP3bMb3BF/fYR96GUfaosZXUa/Otxaxfr8NpLT9fh1sNe2MFq9eswGDcOF8cn6tCVlKHDvEWzYYeKskYdbmmJh8U733hdhwlVH+hwwjU/gx2yRsfq8JYvL9Th+LFrYYfMXR/pcM2v/wCL7/LV6HDJU/fqcHjjetjB4gAdDMOAxaZpwhx0iJCb6L9EKj5+Rrd6wDdh4LcWkk6Qdhzqxsshwc4mmNssdh2evgD8G8nkW78COzx6fyFInZWwONS+E20DuMREJYyEHXwmKJ47ax7YhMZq2CEmJgYUx+EzdP3OPTpsrinTYTA6HXbwtdXpsN3bqsNAez3sEO0A/w56zrWX45e7fowOOyrAW16b1AY7LNleATrswKNHescaHY4bOlWHNQ1HYAe7zaFDT3KODsuOlMMOnU0gnzvxDFg89ebLdDg89IQO5/9lL+xgX/5tHc6aMU2H1e8MgR2Mqo06tO0Dx4mIzPeAwzjvz4/o8PGbfwM7zBgCdmbIhz99hwR12BoDrjKmLQ52MINghD8Zg+5ABi8GZigAi91W8Bn52sFpKxGurQnRyTps62iBHaLQHUCiF5zO5WeBq4mIOD8A48+Nzz4Fi5Msz+pwc8Wvdbi0BIyiIlKbCN6d1cQnY3weOBmrlo3V4UUt+JJkt4CZp2Gx6tD/tAd2ePvTr+vQlQHmoiLiTQBXnykTFuiwLqkddqgq361DSxuYJ5uFr8AOQzq36bBjOwhFZMV3tusw9j4winquGQ07zF38Vx3OsYCzQERKMsDlMm77fvByjR/CDh5nFEg70M50oEqRUBCcSg50pRORYAc4c90OcMq0mnjQtgZA7jJcsHi4FRyZV/zgPh3uD+IOKZ1gV0TPAm07O/AjXJ4jYEyxT8azXKulVoffHAPmqD/K+TPs8PuJ4I38cRaYpUT/Kgt2mOMHF7t0J76ojfjC1TqMGwnuIsUDdpqIeGMbdJgMbtREROw+cLC5h4Mb6gOd4OZURC6IX6HD3++YpMO9q8HgLCJjHNfq0HUxupcRaTkMRtfoC8Dst6wMnLYiMr12uA7rksBx0uhzww6ueHAE1k/UKxMiIjviwYUmqmWoDufhAUxs0eBSnpx5EBbH2rboMDf4pg7fFDC1E5H1ZeAwrngWTImjds1tv+2fV5+CgoLCwkI+FdsH8UlY+pz0CmwvbgwRERERERER0aAV9dc/RP31nw9d8Sti+yYuwtLnwRVYIiIiIiIiIqI+JbwOy6+I7YO4CEvddsyXwHIFloiIiIiIiIioL+A6bJ/FRVjqnvz8/OLi4qN/jvrtI1yBJSIiIiIiIiLqO7quw/KnuvoOLsJSNxyzAtu7G0NERERERERERFp4HVZECgoKuA7bF3ARlo5LUVGRYRjhFdi8HPD7lURERERERERE1BdE/fUP4dUb/lRXX8BFWPrPjvkSWK7AEhERERERERH1feE1HH5FbK+z9fYGUF/X9SsIRGT2xUuP/uGbUxfo4nF3btdhXONo2DkqZoYOl7e06jD3nItgh3ZXUIcHJ6+GxenekToMWjp0+LvDNbCDZU+sDlveXgKLx9e+p8MLH/6zDusqm2CH1EvBu2uInq3DnX+sgB0+jPHr8JsesNtFpPOP43Q4pvkTHZoWL+wgYoDMjFB7vH//5BRDcNNOvK1hRPrHLfCCpgleMOI2oP8Q4wSHpYhcds8vdfjxtBE6XPoiOG1FJHPYFB02HvkUFg/JnKTDWBvYFeNGj4cd4tPTdDjtW1fq0JkMTg0R+ST6Czp89A/4i1OidoCzw52eo8PWyh2wg9nWDNIgODvOvuJm2OGcgjN1uHJaIyx+bB3Y87clgg6ZI/bBDrNSHDoMzJ6Gi8eAET4qM0OH1YfwgOlOTtbhuhLw2XlLfwo7RLtidDjz2mthsUxo0Nm+X/xch2UbroMNZo1ZpMMh4zJ1WPrxNtghs32iDucUDIPFLhsYEJ5+cb0OJ154NezgaSvVYVwmOI9EpMEK5nstrXU6jHGBD05EpKUahJZuDJk9NOT2ERGudSCOdnpgacLQOTqsK1sLi92edB3GpAzXYZLdCjukjpigwzYf2OAhh8BZICKtX8rWoTUF1sodgUodjj4ABsxDM/Gd4Q3OFTqsb42CxTnRW3S4zQSD+XPPJ8IOiVXzddhufKRD0x6CHRIaj4C2tcthsTjAGwm0+nQYCpwHG9jawITWjHfq0Dp+Lu7QCA6qYZNmwuKho8BR4UwE76LTnwQ7uB66RYfzH3oUFv/jjMd16I19UodxS/4GO6Q6wWDTFp2gQ9PEZ3NSIpgnu9PAtEpErEHw2bU21YPSmnLYwRFs1+GQmZfC4mHTwKU8Jh5c9FtT8RyjNr5Mh3sC4A7lukRw4RCRhcYhHVqr42Gx/SCYQbnjo3WY1fIA7LA6BCYDr5z2rA4/WAzGOhHxPQ5mCPPywMRDRMxoMKFdHwCf8r5YMNaJSFTSGh0+eh7oICLRreADDVW6Qds1dtihVG4CadsqnTn3fAw7rP3Rmzr8ku1PsPiMy0D4WjW4NUiaiibPIpscG0FxVJUO4wP4GjpcwPEjp8FaaUoGCw7btoELx9B6PE/2ucGeD6UGYHGrFcxRxQAnXcfGdbDDQht4uSW1YIbpXQ/mEiJSmjVHRBKz5tSv+ob8ax2WT8X2Fj4JS5+l6wrs7IuXhldgiYiIiIiIiIioX0ic8/ujfyguLuZXxPYWLsISdsyXwHL5lYiIiIiIiIionwqvwwp/qquXcBGWgKKioq5fAssVWCIiIiIiIiKifi1xzu/DS7H8UoJTj4uwdCyuwBIRERERERERDUj8qa7ewkVY+jfHrMCGz0wiIiIiIiIiIhoAuA7bK7gIS//v6G/kHf1zXs41XIElIiIiIiIiIhp4uq7DGobBr4g9BbgIS/+Un58f/hkuLr8SEREREREREQ1gXRd/+FNdp4CttzeA+oSuK7BLS82u/2lLbiH8Kw7rbTpMCRzWYXZbJexw/RZTh6Vtt+ow9q1c2CH7ijNAWpMEi+uzXtLhJ0uadJhadiXskNOSrMNbb0PbIGKfe4kON3e26/D54D7Yoe2Kp3Vo3HqjDt+6YxvsMPLht3Toe+s0WDy+frkObVGGDjsC4IMTEUNAcV/WU5tr4v0D025tg8UA/2w2euRMWFy4A/T2L1upw3nnz4UdjpTW6nDC2efA4rEe8P7yfrlAhyMsYJQQEU9TM0iX3ayzzZlrYIfvvJ6qw6h/4GlEcoNPhy7/ER3aW3bDDmaoTYd5Y+fo8OK7L4Ud9mWDPfxaXRUsviobfNDfGLtRh7GNu2CHklSXDgOv4AFhs3ygw19UB3WYveUs2KF1f0iHVUsf1mFisAZ2uO2un+gw+opRsPjhjpd1WNcJ9rBnRxrsMDI/RYdbrHYdWnbhQ2L2HPAZVQ0dBou3PHS/DtPsnTrMuBZcbUUkfeI0HVb4HLC4rLJBh9GCiuNGwg7SskNncAQz+9u14BTzuGJh7sycosMkF57SyBFw7k8692Id1lbWwQamJ0GHlZ0eHWY24ZuFhDwwBq5MLoXFpXVgfG4Y/VUdnhVVBjtsQkPj1QkrYPFqX6YOA6XodP50NOzg/OBJHeadpI+8AAAgAElEQVROLtDhwbPA1UREXO1TdWivAVcZEfHvfF6H1VuLQemGv8MOHisY4X2pZ4HXCsAGErA06rC5CXzKInKwEuTxXqsO64L4ou/PAYNSrQdcOERkfmOLDt+a9RfwcnN/BjuM2wKGO/fWd3TYUYOP4fSJYLLUmYAHzEAbmNLEpYHLwZGPlsEOHRUf6jDKjUf4Fie4ftXU+nXYnAXuRESksArkxsFXdLjNdi/sMGku+OxySvGEpPMQOBmzfluuw3uGgFBEXksFx/HPcy7T4W2Cj8DzvgRufEybGxbvcYABKM0EO+2KMnAmikjecvB/9I6asRgWl3+wToeWneDa6t6ODwlnMxqX9oDiBN922CGEhpQlD94Hi7+aDmZ37jPrwSZ0gMNSRMZGtepwq2zS4WH/WNhhogscgakRLiglw8F0qzYBFL8WxIPSdE+0DkfVgbUCEUlNzdBhhx2ctos3o7shkUbLBTrMmAJuvozJe2EHoyRPh84Zt4f/fPqM20VkxatnikhBQUFhYSG/naDn8ElY+qwVWCIiIiIiIiIiGsBOv+Kjo3/g87A9iouwg1pRUZFhGFyBJSIiIiIiIiIatLquw/Jh2B7CRdjBq6ioKPwzXMLvgSUiIiIiIiIiGqy6/lQX12F7AhdhBymuwBIRERERERERURjXYXsUF2EHI67AEhERERERERHRMbgO23O4CDvo5Ofnh1dg83Ku4QosEREREREREREdxXXYHsJF2MElPz8//DNcXH4lIiIiIiIiIqJjHLMOW1RU1LvbMzDYensD6NTpugI74+CqkCp4Kf1+/beeuq86Qj+njkJNmTp0b5gJ/77D79bhuFClDr1Rdthh2HTQYWWlFxaXJozXYVxStg6nuUfADplT63S4x+aHxc+VPKXDhtvAzpy0bxPskDFpng5/d91sHTZf+33YIS/jHB3GHIK1Yo0CYWegQ4eGGLgFfSabFYy3Ths4hgWGIgHT1OHGbath8Th9hossevgnOtxTAdqKyIJrU3R4dtJYWJxyqEmHHZ+u1OHi7z0AO3ywYoUOd6F/Kvrok5tgh6TQEB0m+HbCYmegVodGqEqH43OnwQ6pSak6zH/4ezrMGr0YdsgO7tXh2NzJsDhFwBtJWbVPh03P/QF2yOmo12F7JjpQRO4Ogl1xMA0cP1WjwDaISPaaOTrMmzRMh6ef9RfYIXAxONh+Vl0Oi6v2gZ1ZE/ymDsfVb4YdoqLBhSbUCUb40fPB0Coi7X4wYG5/7M+w2OOr0eGYdI8Op4yLgR02pbt0uONN0FZEomMTdRiTO0aHh/dvgR3gZdgUePzgIWVgXzvge4M7otXXAjvENB/Q4ZybbobFNUuTdDjzogk63NOCn7fY9fZuHboCQR2OScYfaHMqONjWmwdhscto1WFU6Cwdbm0shh3Wb12gw7Pn4505q/QtHforTtNhYit4yyKSMnKGDlu3vKjDzM14juqYAS5g9Q58fXfYMnTo7CjRoSUKDwimaQUdqt/VoSuEh/2gBeQ1nfguoGYvmCFU7wYTWuuProcdHj90hQ6bJQ4Wh+rbdGhpA2dBaM4e2OGDe8CeT9v5VR0OewRfsqubAjoMWvHZ4a0CtwwBPxiHm52xsEN09HAdNjT5YHFcG3i5pmZwqAStuIN3eaMOO5eDa0SgCU87388DG3xdBr4pMxPBcRXdeoMOc197HHb44coKHX448h0d2ozbYQdXC5g0HnniMVjs2bFRh0NvvEiHuw6+BDt82fltHbr34gmJxLwCwmow1MS14ePHI2BAaLJ06jDgxied1Qouaw1NR2Dx0l89rMOz7PeC0nnrYIdUx6c6tNeB61TtQTxoV4yYosPh1mhYHKw/oMP2RrAC4EzcADvssaDiKDB5FpHOAPg4jgTBRc2ahlfngnvAwkuw4modjr4YXG1FpGwSOIb9b4DTVkQWXPbkv/1PefKXN7pFpLi4uLi4uLCwkE/FniA+CTtYHLMC27sbQ0REREREREREfdl9T///P6gUFBTwedgTxEXYQYHfQkBERERERERERN3SdRGJ67AniIuwA1xRURFXYImIiIiIiIiI6HPo+qPuXIc9EVyEHciKiooKCgq4AktERERERERERJ8b12FPHBdhB6yjK7Dh/8kVWCIiIiIiIiIi+ny4DnuCuAg7MHEFloiIiIiIiIiITqKu67D5+fm9uzH9DhdhByCuwBIRERERERER0UkXXmUqLi7mOmy32Hp7A+gkO2YFNnruT3eoGse4J+Dfbbc26nCsEYLFfqtbhzEdlTqMiq2AHabd+JAOvbljdLhzdCvsUPpauQ5TJwyHxW01CTrMcKfpcEXHJtjB/3EDCLdWw2LLc2CbJzSs0+FZ886DHa5cfKcOU++ZoMP5QzthB9ebE3U4vP4DWNxpBnVoiAGL6TNEOWNwnjFVh45Qhw6tVvzPY8E2cASePv98WDz5Tzfq8HBHmw5vnH4Ydqi887c6fHPZMlhcXQnO/X3NzTq04RNU/vLFC3XoWAcGhMl1G2AH09gDQgs4sEUkOzFXhwvu+IsOR+aNhB3a0GlXMqxGh1PrqmAH6wYwio5wbYTF/u0gX/XiKzp8OQ6/5VCzqcMnAr+GxSO32HX4s/tv0+GWUbWwg/Mepw6zymfo0EgCGyYiD7iX6zBhKeggIq0xYDPcLyfq0BrEH0fz7m06nH7+Ah36cj2ww/ZXwZGZcAQM+yIyLSNKh4v++7s6rB2Jh5QP14EzN9UTB4vjpoEP9MBbLToM1O+FHewGGJdMM4BqeeEIA7uitQMMjCIy2unXYcoFeA7mHl+gw5qxYBxOcS+FHZZ2gA6TdoJrRIMDf6ArOw/p8LC1HhaPAeei5FmP6HDx7lLYwffpJTr8KDcZFq/YXaJDoyZdh9GZI2CH1gww8reXgnM8qmUN7GB+9EMdOmPGwWK7gD0Pz69AB5ird4thtcLcaoA80FKGm7SCT7+2GVyFbbfvgh08MWCOatvvhcVDOkDnWnuWDuOex9Ny1xd/oMOSM8Bnt38BPuCHrB+mQ8+hg7DYaoIz1/tpIdiw5n2ww4i8C3Q4ZvZMWByfAU4EVwa4duSWgUuPiNjTHtahfy24S4quAddKEdn5/a/osPnXY2Fx8iMv6NA6N0WHvsps2CE6Hcwc7ixfBNrW61thEZFQPJg21L2D/4/Vaw6C4pz14PgJtOPjJwl9dK3ngts6EdnecjHoEPMlHU64Ad9FZrjA/lm5BAxr/iVgti8ihhccmRYbmEuISHULmE6sew3M4qL34lnc5ivBwebwf0OHTh8+Zdqt4DITEBcsHjrEocPqRjC6dljwoB1rgA+6Kgiu4yLS5gP7LTMaLMRFZ2XADkY5GFKcQTAdPa0DXxbnTwUj/LYZb8Hip94AZ+6ZP3oelP5E1pb/Xf61DsuvJjhOfBJ2QOEzsERERERERERE1KP4POznwEXYgaPrCmxezjVcgSUiIiIiIiIiop7Addju4iLsAHHMCmzvbgwREREREREREQ1sXIftFi7CDgRcgSUiIiIiIiIiolOM67DHj4uw/R5XYImIiIiIiIiIqFdwHfY4cRG2f+MKLBERERERERER9SKuwx4PLsL2Y1yBJSIiIiIiIiKiXsd12P/I1tsbQJ9T1xXY1AueKRNxNQZ12ejSt3ToSsSL746YDB16bemwOFC1RocjR83Soe9798MOOz+o1eH+7MM6HLE+C3Y4lLNPh+6PKmFx65VuHW751fs6zIgeBjs0jnfo0Hx+JyzOaf1Yh7NmL9Lh+X++D3Y4bet/6fChnFawYT+9AXYYG/gQpHZYK4YY+D+QiIiYYurQ7YgGYdpk2GH0nAt0mDt+qA4NE7yWiDTXNelw9g1TYPFpwcd0aG+t12HT/a/DDqueXw3SCIdJYwwIfehM2r79QthhepVXh9GxJTpssYKxTkTsNqcOs5NGwOKvP/2IDkN523W40r8Cdti/d4YOhx4BOyKYBo4TEQm8/786LNmBh5SNtZ06fHAs2BWlH98DO4ytX6fDt/7yDVi8c+gBHS4L/EOHhr0Mdmg1WnS43H6ODl1vpcIOHU6wM42DzbA4uv58HXq8y0EYlwk7JLgCOhydBY74X9VuhR1cHQ06nHzW1bB49ulDdBiaEaXDlyxrYQfvTrDBztAkWLzTbNRh9ep3dJgleA8LGgPhiDA4ryXHu3dELBYr7BAdDQaKTe1gYBSR7cOX6fBMa6wOr29YAjvsHvE7HT57+M86zO7E84bK98HLecckwuLs0eCOI835ig4Db4O3JiJSdp7Ogg/6YK1379k6jGrp0KHl8IewQ6jkVdDBij5SSwh2EANMtm3t23CxiTrj7ETPMNPEGwynHnDyIyKmCcYf6QDXKWk+ADskNoJrR8iKXy4UBY6f+CC4CzDaYAPxP3q9DnMfB7uiccY3YQevB4zwMQn4LikjCdx01KeBWZGrYRfscMaiuTqMzcuFxQe94I2YQ8Fg/p6/AnbwbjlDh7bJ7Tq078Dn+Ccv/FSHz3vAvYyILLobDHdPfqdQhw8sHAo7rPwfcEO0f/jTOqzbthl2GDEVjGDrPWCUEJGtk8C4XZ0AbgyzK/H5FURnxz/+dC0sjneO0eGY08bqcBHIRESypx/SYVFLnQ6NHeBIE5G0Q2AEs/oP4NfrBIdKXS24banadhC/XA2Y8tWd+6IOWzv2ww7ZnUd0WGaAUUJEkuzgsxuSCpYmjBSwJ0VkpDUebJvph8ViAVPiIyGwf7JG41WIdBdYstgeAse2Ix2s54hIgh0M2qfZwLsQkez5D+qw+N0PQNtbb4Ud0tZcXPXml+Rf67BFRUWwbNDik7D90jErsL27MURERERERERERGmXPH/0D3weVuMibP/DFVgiIiIiIiIiIuqDuq7D8mHYrrgI289wBZaIiIiIiIiIiPqs8DpsQUEB12HDuAjbn3AFloiIiIiIiIiI+jiuw2pchO03uAJLRERERERERET9Atdhj8FF2H6jsBD8ZCQREREREREREVEfxHXYrrgI2z/k5+cXFxcf/TMfgyUiIiIiIiIior4vL+eao3/gOqyttzeA/rOuK7CnTXlgQoIblg2bO0KHpZvBOvu+batgh+bDm3RoWkxYPCR1tA59Y6/QYe72atjhbQ/IG57YrMMNa0thh7i0oTpsa2+BxY7tTh0mxKWAbag5CDukPfKcDg1XCBaLDez50666XIcTsvCqeuUTf9fhD9Zfq8MpgR2wg9Vp1WEgFITFpsAP2jiuaLCCu2L+peAsEJG82/J0+JGzQocHNqfBDp63W3W4LvcHsDjlLy/q0HY5OOBHX5wOO9xi5ujwJysPweLfRF+jwxmbqkCpG7wLERE72J3N3gYdxjg9sMG8y2/XYf73L4XFFZmf6HBIcIkOL7PFwQ6l46J1eHH5eh1+9K0fww5/qwfvbmkyPsPqfd/SYe77Ph1+9xs3wQ6L7rtXh5PXXQmLS99eo8OXPz5Th56pX4Adci8H+8dR/T86PFJ+C+wwbNoFOhw62g6LO4PoyrgLHGyOdgfsMPW8WTp8IBN8oPbHm2GHMeNP02HiCLAfRCRuMrhGrIr7QIcHtn8MOwS9c3Ro8zbBYv96sCucjaDYYsX/PB8ywcXO4PWg+1wOPILtbvTqsP6XeEoTMwOMbG+cvlOHH8Tlwg4Xd27UYUviOh02P4Pngbmd4CYi+fyLYfEaE8wwP1y9WoeBfXfADu56sBmBlWCDRWS4d7sOvUngKhwVQtcpETHBKWMG4JQP7x8RdMpEmEMZFpCbZqTOp06kDYbgTDLYUXvimxFhqg23ATPsYPZrGGC4i1v/MO7gTgVhJhiHRcQz7modtjnBzgwF2mAH54ghOlydWgmLd/jAVWl6NBpSAgdgh0BNvQ7tLjBYOa4H9zIikrJ1vg5feuQ+WPzs2/k63LclSodrZi6AHV5bCu4NP5n3gA63R1jtWLwLjK77ZuAj6P1MsG2tw76rwwTjNdihtQxM+KUZ3KmJSNzubTqcc+lZOjyc1Qg7DLeW6LB82hM69PiSYAebFdwFpNnw/vH5/Trs3A/ehb0K7QeRnCxw7ZhRAXZ7/MhhsEOy4dLhcl8AFvuDYG4/NHu3Dsvr8SpETFKsDhOt5bB4Q0OyDlt9YDra6syAHcYNAfdZ4/1grt5q4FNmiGOPDnOs4FopIitCI3VotYPBqs2Hl00SreCWM5B42rTE0zZu+paIFBQUFBYW5ueDoWAw4JOwfd0xK7C9uzFERERERERERETdMm3qb4/+YTA/D8tF2D6NK7BERERERERERNTfcR2Wi7B9F1dgiYiIiIiIiIhoYOi6Dtu7W9IruAjbRxUVFXEFloiIiIiIiIiIBp5B+M2wXITti4qKisL/JsAVWCIiIiIiIiIiGgDCD8MWFxcPtnVYLsL2OVyBJSIiIiIiIiKiAWnQrsNyEbZv6boCm5dzTe9uDBERERERERER0ck1ONdhbb29AfRvCgsLw3++bdnfDnR26pq9Riv8u4dWJoNwZ0iHbfUvwA4Oh1OHUycvgMWzv36nDt/dYurwzV/eBTvESLMOY6UJ1YK2IiLNy7tRLEaE/FgpFrDTRMR0gg7BUBAWTx85C3SePEKHge/cCztc1HhIh9OW79VhfNZQ2KHF16ZDs60SFhvHvX8GjAgHSqTjB7jmkut1mPzdCbB4jftRHf72l5/q0PbbaNhhvG+nDjs8L8LiW+506dBZuE+He94u1KGILC316vDgefif7mY8Wq3DuDSPDmtbQFsRkRDY8y6bW4cLzvsibDDtVwt1GO94GBbvNsDL5XRm6zBxDTgTRWTXkxfq8Ka6Fh2+YNwIO8z8R4UOs+0BWHzmOZN1eOVTl4EOF7wGO7zw6Dd0OG/5bbDYWgEO43Ebt+uw/aWZsMPe+4p16AheqcPs08FoKSKZQ8GusLdZYfHwtngdHhk2XofJB/bADp0x4HANro/SoW12DOzQ+PFuHc4eA7ZBRJYk1+nww8rDOmwqxwNCTCo4GS0dqbDY3QYuVabhB2FnO+wg6JQ5/gsrhQWCYLeLSF1FiQ4nzcdzjKo0MFEpfQ3M6gMX3gI7RE8Cl4OvB/6owz/f8BDsMKT6Yh3WbquFxVnrwGFsP3C2DtvXfAQ7uGxgg1PQZVFETAsYiqPql6FKPOWzGOhihycIEc6CbswmxDS7U91XnYSZZLcanPAeNk10fuGLjIQ6wPy5s+wNWNy6IRGEEy/RYcURMOyLyPLFpTrsMIbA4u0HwdWncyGYQZ2TthZ22OUBL+cqsutwTMJc2MH9zRwdHmjD9ziuZb/R4TgHuDHs3P032OGBO2/QYcvWr+vwzB89Bzs0DgfhjgYfLG5Pv1+HsyeBBaPzh18LOzxV9qQOy9bho83TBj7Q+vKDOmwrHgk7vG6frsN77rhAhxOvBjtNRGz3z9ahJQGvHQ2dAh4dq2nsAB3sYLVBRKIC4NM/AjJxLsWDdtwt4Mbn8oRVsPj5cjCRa4mbqEO/BdzgiMj6NnCOJ7vwJdvlBxN+05miw+muLNhhjOuIDiudYOI6yorP8cMmuCy+uR+sFYjIpa71OsxAN7jLksFBJSJT8sD1/RzP+bA4Oueum0baRaS4uLioqGgwLMXySdjedM8992R34Xa7wz/G9XgpWH4lIiIiIiIiIiIaAJ4s+ee/TxcUFBQVFfXuxpwCXITtTYWFhRVd+Hz//Mc3rsASEREREREREdHANqjWYbkI2+dwBZaIiIiIiIiIiAaDruuwvbslPY2LsL3p0KFDpml2/R5YrsASEREREREREdHgEV6HHdjfDMtF2F5WVFQUXunnCiwREREREREREQ1OxcXFA3gdlouwvYkrsERERERERERENMiFH4YdwOuwXITtTeEvIsjLuaZ3t4SIiIiIiIiIiKi3DPh1WFtvb8DglZ+fX1xcHP6f3/joh7rGCHXoMNiBP7XoTybqMHlvQIcTU7Jgh+sf+4sOXxm5Dxbf8fSfdej5XaUOs41y2EEsIRAahs5M/PfFAmo/A2hjmjBEGyZimt14vXPPP1eHHsdkHT4Qtx92aHnsCtAhvk2HlvihsIO/7BMd2q0OWBwI+XUI948h3dvvPSTCURHpYAEi7ArcYd6ks3SYcPt1Ovzdltmww9rnxukw629eHSa59sIOI8eBznuWfwyLF3wtT4frhlTr0PE/o2EH6+1bdPjmmJtg8dxxiTp0Nh/QocXA//gXMoM69LjjdJg6Yybs0BG1VIfZ+5thcaYB/s8HKx97XIcXHMRDrqfwAh2ONhp0OCX6MOww68JFOpx5KWgrIt4pI3V4y45v6dDvBtsgIqfdsROEs8GFQ0Q6752hw4DLp8O4L94BO9gSQIfo9BQdfvmGNNhhyKwjOmy3HoLFL7W0guKPM3U44sKrYYdONLINqRqhw6povA2TrwZHps8LrsIikrIzW4deT6wOXW/bYYehw6fpMHNcFCzeWwKGGr+vBZR2VMEOFqtVhyF0uewTV4hTDr5rE11QOgPgsxARQTuzta4R1u5cVaPDwJYSHaY1zoIdftx2qw4TOp7RYYzlHdjho32rdThkzwJYnHUH2IyWlRt0aCtNhx1SK9/VYciGz68IFxp4fccHLJz/UI/rC3s9wjbA2S+cuohI2afP69D3KTiV4nz4kl1WmatDa+DHsNi+t1aH9W+k6vCJ71wIO8z0ggnJait4SGhK1EHYweXN0eGS8/H+idkBBoq4ipd16LC4YIf1y1/R4fCv3avDP33jm7DDj8b9Sodf2R8Ni2uGgnHJb1mrQ2sAzxCixoNd8cuvgXmOiOzdA2ZQRtGDoHQZGBhFxGoDc9eyuB/rcO6Cn8MOj5ZO12FBM5h4iMisC+fosNGdpMOSJe/DDnFDh+gwGA8mHkXLdsEOM58Hc7CSCFO+yn3/0GHMMHCXfVE2vkZ4A24dugSctiKy1gXyi9wJOpzvwLctI9rA5fKVsjd0uDcX3G+KyPSaPTp8/gV8h/LjmB/p8PRrT9PhshloJikS8oMOfzDxGtQMK5hs5+Vcs7b87yJSXFxcVFQ0wJZi+SRs7+i6AsvHYImIiIiIiIiIiMKrZAUFBUVFRb27MScXF2F7QVFREVdgiYiIiIiIiIiIjjFQ12G5CHuqdf0xLq7AEhERERERERERdRVeMQv/nNIAwEXYU4orsERERERERERERMdjIP1IFxdhTymuwBIREREREREREX228NLZgFmH5SLsqTMwjhgiIiIiIiIiIqKe1nUddgB8OSwXYU+R/Px8/hgXERERERERERHRcRpIP9Jl6+0NGBSKiorCK7DjnJe0VrXqmvF3rdNhyGKAMGUsfJXo8emg7XTwEfuG42dyv3z7r3VoPbAPFk8wSnRo2oMgtJiwA2Sa3SgOdaf4xBng05C0+BxYvLopChRPnafDZ+77MuwwKupNHQ4767s6rNq9BnbwJI3WYXs9+OBExAx26tAQ9J5PLVPwp2y1WEExOiTGDZ0BOyQkpemwrjMEi3eNLNBh4ZnX67AjfiHskI7+0SvZ+SEohYeayO4S8EHPXDgRFv842QNSu0Nn6/YcgR3Ou3uUDt+8EB9sX7O+rMMLFr+uw+b1zbCDz9+uQ9MEH0d1PThWRaTBO0yHpVu/B4t/9fRuHT5bAU7GqdsPwQ7BGJBPOe8OHU5aeBbs4M5K0eG3E5+FxaEzH9RhbOpwHcaddjrs0P7XG3QYcODjZ86c+TqsaqjVYbM9CXaI9YEP9CtXjNThsNPxoDSvZpsOA/sfh8XLAnt0uO1MMIpmjAM7TUReTwZX4cbH/Tq84epZsEPFnP06fFXAkSYilRvAYNX5CdjDSTZwYIuI1QDX9/RkPGDWvb1Wh1m+ch2aVjwGSh+4HPQ78BpqMfADEH5/hw53b1gPi1vbt+sw3gZezrl9NewwtB6cCLuTwegRKMHXCPcKcI67LGDYF5GD5eBgM0q36jDHvxl2sMRE6zDU0QiL4bWD6OSLcCPSGfDp0DArdBgCk1kRkdZ6cO0wn7kOFidawXTCMMFN2ZB362GHEvsXdZiQOESHjZ1gJikiUeAdy7VT58Ji308W6HDXr8FpO9yGN3h/+Q4dNq94Wofn5H4HdijJ+IUO83KWw2LPaw063Pi3J3WYPWEn7DA9BozPt7nwCHZ/JpiwSRXoYG0Go6iIBIIBHa763x/qcP/BKbBDak4uaPsanv/8LQAWNxYmgA1ePycDdvDvTABpCBwSjqgY2KHq4Vt1eM+CJ2DxrQImbK3PgoM4+oZLYYc7cp/R4Q5jBSwedRAcrm0jLtThxM4xsEN7M5ijvv93cGHdMSYVdihKBSdjtcMOi2f5btPhXW0uHWYlrYIdEj4Cn126735YfOSie3Q45cZXdbj2Xw0KCwv79f/LnE/Cngrhn3LjM7BERERERERERETHacB8OSwXYXtc+IsIuAJLRERERERERETULQPjy2G5CNuzun4VLBEREREREREREXXXAPhyWC7C9iD+GBcREREREREREdGJ67oO27tb8vlwEbandP0xLq7AEhERERERERERnRT98cthuQjbU/hjXERERERERERERCdLv/6RLi7C9gj+GBcREREREREREdHJ1X9/pIuLsCdf1y8iICIiIiIiIiIiopOln/5Il623N2AACn898PTkBcH2qmP+6+xF18K/VdsGFsSbmxp16G33wQ6TMwI6fO9Qpw4Tnr8Sdhhh9+vQcMJaCYWCIDVxcf9iiAHzWFe8Di+647uw2HNnsg5fKnpHh+NWjoEd8r54L2g7dLQOLQ437FBbulGHrQ37YDEG90SPfcomap0QlQSLb/ny7TpMmzVRhyW2NNjhz79arEPrht/D4tCm98DL2cAGG23HnvVHmZYOUIz+ISwUaQ8b4D9cet40WJteul6HLe9+qMPDCW2wwz53qw7jj4ADW0R+d+szOvzFEHAMt31lKewQ507Q4bRxM3SYPRt8yiLyrcwaK5YAACAASURBVAce1eHPfpcHixOCU3Q4MRbsiujkWNjhkmvv0WFgyAQdPtaOh5TqOx7UoRMeEyKJ8eB6bW/fpMMJqcNgh5H3gZebcAnYwyLirQUXmtXPvKrD6SOGwg7DTxuvQ2OGS4dNlkLYoRmdjJ+YtfjlHOBi9+G0Bh1Wpu2AHer8n4K2d31Fhy/aqmGHg39YqUNHPR6fHUGHDp2HonUY01oHO5xzBtiZDzffD4vNJWA6YbeDaYMZgg0wfGQPaBGHZxRaLOB0tkQ4x72d4KTrrNgCiz1uMBTHjjlXh5W1+JTxfvKQDkd0gGPb78BjoCV5nA7tDSWw2Llnmw4T0EXNdOL9E+hsgTlRX9SNqTIuDYXAWGwa6OZLxBo6fJyNTRe49IhIshwAaV2pzqrex1fA+KyxOsy5DtxaisiNuT/W4YQJ03U4aimY7YuItQxM2PY9e6sO0z/F084pBXfqcE0CuLCKyPnJlTp85W3Q2bkVNpCqC606fCMG32bb8lbosG0juAdMSgehiISqwfzQtICZpGfKF2EH+7o/6LD6iiOw+Kt3XadD//ngDu5QLZhJikhFLJj/nJnpAdvgxCshwS/8RocNtXiekjUaXEMb/1Kjw4WN4PZfREpzp+rw4/XgTkREFpdl69CIWaDDOen1sEPiAXDefdycqMOUrT+FHUbenqXD4Cg8x1iUCY7jHCc4hmNb8awxOATMHCZ8vRkWf/z6/+jwKdtZOhx9BNycjnNcsrPzTREpLCzsL99LwCdhT7LwB88vIiAiIiIiIiIiIuo5/ejLYbkIezKFvwqWiIiIiIiIiIiIeki/+3JYLsKeNF2/CpaPwRIREREREREREfWc8PpbYSH+lrM+hYuwJ0348+YKLBERERERERERUU87ugrXL76UgIuwJ0f4iwi4AktERERERERERHQq9f0vJeAi7EnQ9YsIiIiIiIiIiIiI6NQIPxBZUFDQu1vy2bgIe6KKiorCnzEfgyUiIiIiIiIiIjqVwityfflLCWy9vQH9XvirYL9w9kPH/Cf7kBm6ftveMtjHbCjR4bTpk3VYYR8NO7z75pM6jOvcpsOA0w87GIYBNiwEa08pszvF4D18VmfQ2251wOLr82/U4aJvx8DiN84apcM1qy7T4VUzcmGHC792sQ4DseD9NW5Mgh327M7R4bu/fQsWGxYwGpgCP/6TcEwYJngj1158ow7P+vVXYYeRKVt06PZt1uHll+2CHUatf1+HQRs+OyIA78LtjoKllpjhOmyt3o664kN+VMY4HR6IHQaLqypv1uFvNoL988j0ONjB4piuw9sm4fHnur+A/9PHWm+FDhNzL4cdoqVJh50zL9LhQ++BdyEi9rcbdTjath8Wix0cxlkecMqc/f3fwwZvNiXosOSRP+owOhiAHZJThoC0fDksdoYO6PD0y76uw7hFeA+ndYD9M27qs7DYFmoDafatOgu4g7DDRqNFh/tb6nQ4KR4fw9nngQFzStV6WGxLbtbhVMdaHT5cAk58Edn/aboO98U/rEPjiTTYIeEg3LB4WGxpBvsnbcQkHZqdYHogIm88/Z4OrXvwwZZhBS8nfnBIWCz4n+dNs1uX4gEr0hzDgq6hhg1cDkIhfJXp6ACfUciPP9BAW5UOa+rQoWLFR2CMtQGkNjAOO0MgFBGjBmyDGeH6FbLCN4KKuzPFMLo36SPqTREO1m4cw5EOeHzWoZMxFOyI2Fuzgg7byjbBv2/7OXrurOT7sPj6b9+kw//ac6YOf+B/Dnawl1yqw5iMc3UYbKiEHQ45fDp8Y9cYWPynzGNv80Uk+X6XDm3b8KD9kjdLhzOewC9XNfdGHdad1QlKP10NO0R1ggvKkfJ1OgwewJNq0wrCiyfhm9ZhN4CZw/wNYIZ513t4lptSBu5xYn7dqkPnKDSfETFeBhPX/ePwPc5UK5jyVf0GFPtS0LVSZGLnP3T4Rju+vlunXaHDu1PBrHG3CS6sIrKyEby7IR5wda7Lwhsc54nW4dluOyxubgE3RJP9YIMb/gbmoiLyPz/6mQ6j5uE1lr/6wS1n3tNgWuVNjoUdMtL/fYPLRf71pQR9cymWT8KekPBXwRIREREREREREVGvuPS07x39Q5/9UgIuwn5+Xb8KVj8GS0RERERERERERKdGeB2WT8IONOGVda7AEhERERERERER9QVHv5Sgt7fiWFyE/ZzCa+r8MS4iIiIiIiIiIqJeF16mKygo6GvrsFyE/Ty6fhEBERERERERERER9QXhddjCwsLe3ZJjcBH28wh/EQEfgyUiIiIiIiIiIupriouL+9SXw3IRttv4RQRERERERERERER9U3jJrk99OaxhmmZvb0N/UlRUFH4Mdtb0/z36B5szChY3Ve7TYarHD4vHLfqqDj8t69Ch752fww42ow6kRgiEET5zGBu4tqeYaCsshjVCcbfeHfgPLjv47M6YtgB2WPT37+gwYdVUWDzluVEgXFKrw4c3fAw7zEp7R4edZc/p8NzD22CH/f99hw5zS1+CxVAgGAAbNu50WHy45qAOD9WVweL//t4DOpxwz2gdDlu/FXZY/42v6PCFYIUO12w5B3bwR7Xp0GLgf5oKmeBgc9ujdWhLngA7tNfv12GwowYWQx5XnA4bjUxYvDcWFFuiwAHvaMRvOW7YRB3G/Go6LJ68ZoYOX33xTh0O27QHdoiKcegwEAC73RphyB0670s6rNu3GRZ37n9bh7nD83S4V8C5LCLNHeDssNbu1qG7Hb9lsYDxNTbKDWvHjJykw/SzLtXhq/vBholI4v6dOryg6FxYfNfvwM58xb5Bhw9edSvscE7m1Tpc4GnR4Rxphh3S1ryrw62b34LF6eeD/bOraocOz1/8Zdjh0uz/0mHMJHAVrl+JTxnH9tU6dHsrYbERm6bDQ0mTdVjx0WLYIVC5C7yc7wAstkmrDkN+MG0wjAiXfc4WPwe0Mw2LHdeiPNIk3QyCI1PQdSryJwc/aNghwjZ055gw4MuhLPKNCdqZx78FRBRZhNMZnGGWCNeI2OgUHY44HcwERGT3UHCrtXnJX0FpKAg7RDvAy8UeBnOwsdHoBllk2pfv1eErmamweN+aF3Vo2eLVoW8YuNcTEXkX5JMCYK1AROKThujwcDO4HXba8cdh+Ep1aHPG6zDQ0QA7QHHuRJhfdPN9OvzwG+Czi3viItjhg8oXdHj3eZfosHMh+CxEZG+oWofepjNh8fymsTpszlkBKu34kp34yV06/P6qA7B4/4LrdXjrNHCw7Vj+LOzw8jpwl9S2ukCHMfFjYIfkS87W4S1n44WpGZ51OhxvZoDSL+LHS8+NOaLD7W/jRxgtXjCvnmgH98ijc0bCDp6FX9Phzk9Whf+8cuVNInLVVVf1kXVYPgnbPeGvkwivwBIREREREREREVEf1He+lICLsN2Qn59/9Pe4uAJLRERERERERETUZ82b9+TRP/SRLyXgIuzxKioqOroCS0RERERERERERH1ceB02/H9t70VchD1e/CICIiIiIiIiIiKifqcvPAzLRdjjwsdgiYiIiIiIiIiI+pfww7AFBeA3zU4lLsIel/DnxMdgiYiIiIiIiIiI+ou8nGuO/qF3f6GLi7D/WfgTCn9mRERERERERERE1I/07pcS2HrrhfuLY76IwN/WqGs6KlbBv+syQXFs9pmw+P01u3XoWf9HHVptAdjBRKEB0wiMbtTil+tWrWGAF4xxJeqw0++DHToD3uPfiMlDZ+gwfuZ5Ohx1JqgUka+uAMX7CufA4hmv79fhmed8QYfvVARhhxe33qTDZdvBW67KeAZ2uOycaTpcE3TC4sRDL+nwS997WIfV9nTYof6xH+rwD6+9DovHnF6hw5hvgz3/7LZa2OHdYR06fOu923Q41r0NdoBHYMjsxqFttYB/x+roxGdoyIfeCDrrLAb+5zGHzaFDe/MeWDyh2arDgM2jQ5sbNpAR0SN0uNFrh8Uvb/2mDrO2HNShS47ADqE2sOcNNIQNm/RF2KHRM1SH7cG9sDh1yrU6rKkt0aFZ9R7sEB0EZ64l2KTDGAf4LEQkPi5Th8mzLofF9qyROly2vVWHwW0rYYfoRHC0PXXOy7D4R1eC0cOdO0SHtw7fBTtcYjygw7h2dH4t2Qk7PLXzkA4t86Jg8XV7G3RY8kGNDu97YB3skBR6VYcpVnB9f3zklbBDTutoHb79Hh7hPc9X6jDUBmYC9hp8jsd44X7Dl0VTQihGA1B3ru4UZsIdhy4oZrATdjBC6NoR4ZIU4QM9UUZ3ZoLwGhrp+In0Nk5wG4j6ETxKnAwnftYcf4dI8+SWdjDL3bn8BVz8CZioZHtbdOgOgmuliFgmflWH1lQwKXJOww9RrVoD5qgdBz+Bxc4qsBlpHeU6NEvwfZaE/KDYgkfypLELdNheA26HO0vxfZZYXToL+ttQKf7onTbwRoImvsepKQGT7fFF4EnDxxr/ADtYp4PwyCgwtdtYlwM7HKnZocOvjF8Bi2ckPqfDV1tBh2+3ng87TEgCt1RLO8HNhYjEtl+lw782VOmwphHfBfjWp+gwrgncR9gr8RxjqhfcDmeehdcxRpjJOkzZ267Dj0LgtBWRrb4rdDi+DRc7beCDdtrBMTz88tthh9VvvaLDDje4kzVE8nKuWVv+dxEpLCzsredh+STsfxD+IgI+BktERERERERERNQfHV3Z68WHYbkI+1n4RQREREREREREREQDRm/9QhcXYSM65osIiIiIiIiIiIiIqJ/q3V/o4iJsRIWFhUf/wMdgiYiIiIiIiIiIBoZe+VICLsJi+fn5fAyWiIiIiIiIiIhowAg/ahl++PKU4SIsFl6B5WOwREREREREREREA8mpfxiWi7AAf4+LiIiIiIiIiIho4Akv953iX+iyncoX6y/Cj8EGfS3H/rf21bre4YyGfSyWOB0e2F8Ci2M6PtFh0ObXoSEG7HDizG7Fx81iWGEe60nXYdAzTIf+Q2DniIjT7tThiLPugMWB1NE6XLFqpQ7fWroJdqhrnarDsUYjLE5KTdRh3PxFOlz6fDnsYMvYq8O533lPh4ern4Edin++Rocj6z6CxXf/1wM63P/1gzpc9yDYkyJy77qf6rC8+gxYfOd74F+AMtordfhu29WwQ2bZFB2OsywHpREPYbANpgRhqWGA867d3wlKG3fDDqYBtsPjAqNE3OgLYAdfAzhU0myHYPGo3DE6TE8DJ50n1gM7ZJ9/pg4/DYFBSUQS12XqMCEEztyQJQQ7WAzwcThtLh1WlW2DHZoqvDr02NpgsSPtPB222sG7CDW2ww5G43odpufm6TAmawLsUFG2B7xcTSssbu0Em+GtPKDDrDHTYAdfABzb9sN4QEj6M/g4okcu1OGzTRmww9sXfqBDR8krOoy1qEutiIjMXJSkw3X2LFhs1oNr6+ZzY0BbwUdgveWwDpNlqA4LUiKMoq+/rkPbL/AAFOdv0mG0CUJroB52CJnwyOzGJbvnphOD0PHvTDPCZ2Sa+Opzgi/Xg7ozPewDm0t06kQ6zTWH1QHzhOhkHda31cLiQBDMzeAWnPiZGKlDKASure3tNbDYZoI3YkO9HQ5wryci1tpPdWgabh0eXIUfcPO7s3Vor94Ji4e27gIvZ0XTiVCk+2nw7uwO/OlXbgLTiaAHTOyzR8+FHdrqwd1BYyOY5wRD6F5GxGaL0qE9IRcWl5RV6DAmaosO88z5sIM3CG5GViaC/VOW1QA7+DdN0mGhHdwtikjtiHd0uPYQmElmjcT7p8w1UYee8/C7G5cDDuNAM+gQmloNO5SXgQWH4N/B/NnjxQsvY0eDIWVUNH53qehuL7D4f3V4ODbCkNAAPjt3CC+bBG1gm1NSR+mwrgbMk0UkMOFyHXqXPaFDe/DYz2Jq1o2bKp4Wkfz8/FP2PCyfhD1W+DHY6akX9+6WEBERERERERERUQ85lV9KwEXYf1NUVMTf4yIiIiIiIiIiIhrApmbdePQPp+wXurgI+2/C+53fBktERERERERERDSwnbKHYbkI+//4GCwREREREREREdFgcIp/oYuLsP+Pj8ESERERERERERENNuHfiOo5XIT9Jz4GS0RERERERERENHiEH8Q8BV9KwEXYfwo/eMzHYImIiIiIiIiIiAaVnv6FLluPdu8vwo8cT0s4PdBy8OifTcPUlXarU4chUCgiEuxs16Hhr8bVhgEyAWGEV4ukm+VKrDse5lbDqsPWjhYduhzRsIPPkaRDf+1uHcLPQkQSYpJ1eOhwHSyuXf03HTqb14K27kTYIc5fq0NbhHe3cD74PhHPLSk6tC72wA4hO3jXL394QIe+h0bCDqe1bdThDb/HY8oyf6oOn3sePB4+obUedrjinTd06H1xISx27I/TYZX1bh2emzECdmiJ8+nQt3mDDu0RxrmgHxyukc5n0wR5yOxAtTDEotDxY4tNg8Wj5p6vw3EjY2DxjOujdFgT7NRhXQhv8NttYASrf3UdLI5pRjsTHcNTcmbCDm3eVh02tzfpsK6pAnawB/bpMBSXBYsr92wB29DcqEObF7+cJypBh470STo83GqHHXxtzTqs3gdOWxEJuI7o0G6Cs6DF9MMOgo5hdxoePZJb39ehdV+lDhOengo7HM64TIeG6yodjr+gHHZIcz2iw4YW0FZE6ie/rcMpaFdkm0Ngh1m+AzrM+vhjHa6qLYUdAj++XIfjW8BhKSIhG9g2E1zzJRThOm4xwL+jow85IliLNoFOJji1I6L+yIwwPhvots5qgPloQjK+CtsywWQptGsp3gwvuDr3jTE+wsuhx8DgraWJQhGx+Gp06LeDOzhHNLhbFJHOFnBL7vCVweKQNahDuw3M7kJmCHaAI38gGMDbFgA3s7GyQ4fpC78POxyqRnOMlY+BUj+Yi4qIYaJtC+IZZnsL2OBAxX4dRnvAxFVE7J4JOmx+dpcO0zKHwQ7eEHgjE6fiW6roIJiuu10f6nBdCbh5F5Gx7k06DLbhT//ypL063JkIDrbF2/DLGW5wznS6wJ1aVCO+rRs3b5wOR1jxAW//GNwlVVSCcHUH2AYRMarBmdthBzenImIzwf3X4ZoDOgx+8DTs0Jp4NtgG+HIR1uKOrgFOSzh9Y8MK+dfDsD33vQR8ElZEhF9EQERERERERERENAhNSzj96B969GFYLsL+22OwvbslRERERERERERE1Ct69JthB/siLH+Pi4iIiIiIiIiIaDA7BQ/DDvZF2PCe5WOwREREREREREREg1nPPQw7qBdh+RgsERERERERERER9fTDsIN6EZaPwRIREREREREREVFYDz0MO6gXYfkYLBEREREREREREUkPPwxrO+kd+4v8/Pyjf5iaOM8UUxcYhqFDf7BDh1aLF7+GAXavYcH73Az5UQdYCrY2ErvVjrrixffEhCE6TJhyCSw+tOENHQY72nTYaYBtEBF/0yEdmoFmHVotVtihprUBdNiBzxOX0anDyQu/qsNA6iTYYc/7T+lwuAt9cCIZt39Fh0/bH9Xhhr1RsIPltSodJnWAz+7M+RfCDmnX/UCHL25uh8V7V/1dhzGdPh2W7/sF7DDskQM69GWdAYutbeDTv+LWfB0umTQUdmi668c6TItN06HDlgE7eOtKdRjw1cJiA52NMIx0fqIRRZq8jTr0l2+CHVwjZ+rQPj4TFie136BDdwC8ZVc0Pr/2HgaDVWj1FbA4Owns+XOv/b0OPelJsMP2VTt0WLHmbR2abdtgh5AJhmJ/O/5AQ6WLdWhD449pCeEO7gQdVuzfDrahEww+ImLxHtFhsB2cGiJijQVXn0BrhQ7Nanz8WGPAodIZwJ++3X8YbUOuDtPMctghp3aaDidcCgbtmVFPww6fbC/T4dzx+N2Z6OoT11qnwyFN+JBYe6hahze/CfbwylpwconItJZ9Ogza8acPr87BUFCHka75IfQf4Kwhkm4VE9EgBG+RIoMzpYEMzgNFxALvfVCttx3MA0UkWAcuSaYzHW+GF9wymAIuKN0S4dPHbxmmET991DhgglsqM4CPwBCa3ZmWFh06XDGwQ/rQMTo8Uh9hjoEuuCa60w+F8LKA3QZu9wJ+MHWRCKsQhgHuAVvKdsEO3uS5OvTHgLdsawdzLRGJ9oCJfdCBb1q96GPqOAym67FDnLBDsL5Gh1E2cB5ZSvEsLq4FdBhdOwcWN5pgbhYXBHPUGD/ew+vXp+owaeg8WLy5/aAOh8b8A5TWgmNYRIJlsTq07QezXEdgP+wwOtehQ48f3PiIiN/n1uFbr1Xq8Jn5+D7CkpgIQrMeFuMBoQOMjdX1eECwNLygQ0cQjIFRUWBPikggFI237V8Pw4YXD0+KwfskLB+DJSIiIiIiIiIiorC8nGuO/uGkPww7SBdhwyvZ4T1LREREREREREREJD3w+OYgXYTlY7BERERERERERER0jPAjm/w6ghPFx2CJiIiIiIiIiIjoM5zchzgH4yIsH4MlIiIiIiIiIiIiqCcehh10i7BFRUW9vQlERERERERERETU153ERzkH3SJs+KfN+F0EREREREREREREpJ30h2FtJ6VLf1FUVBRewA60HDr6B4sFr0SbpnmcbYP+VpgbBuhssTojtAEvZ5ohHdosBvz7Dmcs6GCx69CFG0jC5At16PUMg8VeWwaKj+go0OmFHcxguw6taKfZHB7cwQHesr+9GhanJ47WYa1k6rDyYBPsYJOADqdf+SVY/F+7N+iw6aEOHcas3Ak7TMyN1+Gkr92nw+2HYQP58I0PdOjaVwqLk1KG6NBfe0iH9ijwLkTEFpOoQ6dvCywePvcLOtxc6dbh4TefhR2ybM069CQM12HIEg07tLfWg9RXC4sNI8Jpo8DTVkTEBB18fnAWdB5YCRvUP71ch+X7H4DF3x47XYfWKUN1ODrjfdhh+9pxOkyxgFBEzv7CJB1mn5uswxeq22CH+hXgYwo1gdHDFWiBHeAYGAh2wmIzBPZ8tBsMNTEuPP60eMER6K9aBTbM5sDbgIZ9V4ThrjME9pstGowSnS0VsEOwEew3qx+8CxGxOKJ06G/YpUNfCIyiIpK7f6sOP7SAD/SZV9bCDr6WBB1aN+IhpfYgOPfFBEdg8FAJ7CBrFuls+g4wYE5z7IcNgnZwsEUaOvxBPyiW4x1nRLpTSkT0n8BLUqRBCd7jRJz/DAjwtjDyOIxu66xgltvcgifxRnNlN17Qcryf3XHf3Ubs0HPgy4VCQVgc9KE5PGJWgfmeiKTOukCHVfvG4G2rBROVEPqUrRY85bM6wYRN0F2ARFiFaPY26DCw8U3YIRALZi/WEGibmDMbdohKytJhU1MjfjkDrCkFm/aB0AAzSRExasDcNXHSOTrMnDoTdtizAtx673wB31KVW+bocOMhMA+UCPcRjpwpOrR78AkWEwIT2mVtZ+ow3r4Edmi0gg22OcE4HBeKcOOTAM4vWysYlESkfiPYmXYH6DDXhof9D7eha4TDBYsNCzjNTXS7Fwrgu8hoD7gZyZ4Clrb8eESRtnZwh3Jk87H/H/qT9TDs4HoSNvwY7LSE+b27JURERERERERERNRnTU9eePQPJ+Vh2EG0CNv1MVgiIiIiIiIiIiKi/+ikrCgOokVYPgZLRERERERERERE3VVUdOzXFHTXIFqE5WOwREREREREREREdJzC30gQfrjzcxssi7Dh727gY7BERERERERERER0/IqLi0/wYdjBsgjLx2CJiP6PvfsOzPOsz8X/fda7tV5tWZL3imeGswMkAUIbEtogOQ0tNL+WrkOhQBdtz6Glp6e0h9IeejqAUzY0RTIQSEKWE7Kc5SzvvWTJlqytV+9+xu8PF+Hmez1BSuxYMtfnnziXb3+ffd/3c/v1KyIiIiIiIiKakbP1YdifiUVYfgyWiIiIiIiIiIiIXrc3+BFP+2ztx6zS2tp65v/29fW9ZnMjJA9AU8OaZsswponPuYdqOBZYJY9FK2GFcrQWhIUJHdruOKyQSsZ1uOf4CdjYGNyG0oLOItEqWCGaatXh+Phx0NQrwgpBfhSkPm58cvCADo3H/xHsWNOlsMJb7/htHT5/ErYV+db9OmtZtl6HtW15WCB+0fU6vPcL/65DO9MPK9RX1+kwiMdg42LvSzqMlAZ0aBR7YYVU/VKwuRjYBxE5sm+vDrOTW3XYamRhhfS8ZSBFT4fn4ifUsKKgQAQ/X6YBOopSGeybEcygQ4BsB/cSlgl2uPDIJ2HjZVtAh1Dzf/9Dh9v2PI839+QSHaZXL4aN178HXOjPjILe48g/PwQrRPZndNhcPoX2DJ8feN6jDjhpIpKqADs876JrdJhsXgArHNv5gg5bTLAX0do2WGHwIKgQcSKwcTEAo4+XmAdCHxYQLwuGQjsCun0R8S3UURiToGXICLhry1M6PLAFbK5Q+kW8D9XgQvvZHGwcGwE9f+QEGFAWlNOwQmDu02EpAcqG3VS+B4bsIMDXwwidexARnUNhcxTYKYW9tsTRdCtfBO8Xnu9Of3OzGdzdIOR0xhwwhuY9bwbbQx+UCjtpAZp5wj0Lf+lFzQ2wE7bpwApl9LIWusNhezFtsDI8isoEfg+Fu+Ytvgm2NU+BtyTxSqBqyCNjO2D+k6xeABsXM2DCBk9lNOSK1jY16HBsEEzL5y1eAytULlipw+yLYOIqIqVDYMpnGGUdFkfAXEtExE7orLALvGdNNn8YFuj3QP8TbDsEG5dHwNys3luuw0RNI67wEfAecWkLuCVEpCL5uA7dU+ByDPbht4CgeViHzlVgySL7zCCskPDAvZLbeQw2vv+uJ3T4zAnUg9XhKXHwcbC5/KdSsHEKve6ZJuh/wgYUvzCmw3IR3D/eMvyMD/aCNZ18HbipVta9c8/ePxKRzs7O1/2lBBfmIixcdd3QfoebwYtHREREREREREREROfIz8TXERARERERERERERG9EW/kx3NdmIuwwY+9ZuYpWQAAIABJREFUwW/MJSIiIiIiIiIiop9xG9rvOP2L173YeGEuwk6ZOi9TZ4qIiIiIiIiIiIjodXjdP57rAl+EfYM/toyIiIiIiIiIiIho6iOenZ2dr+OPX8iLsFPf0cCPwRIREREREREREdH5ciEvwvILYYmIiIiIiIiIiOgsen0/nssIguBc7M1sYBjG6V9cnL52Os2mV9PSYSD4HJqwsYEXvm20G2aiSYflUhZWcPMDOmyuma/D5TfcDivsc9bq8NTXfx02jlREUQyOIt6wClbIlUHjwsmnwbZiVbCCBL7OKpNp2HYyO6LDimhCh2s7/wBWONJ8qQ53fe87sHG070UdJuvadGgIOAoRcUtFHToJcCpqmtphheHeQzosDO2Hja0gB0LD1WE0ji9H0fV06JcmYWPDiuswXtUMWoadHzOlw0S6FeyDFYMV/JGDOkzZJdh45NQxsA+TfTosljKwQoBuV8u0ddjWshpWENR7jGQnYNtsDuSTLng6hiKgnxGRKsfR4f/+xw/Bxlfc+GUdLrzzuA4X3H8KVkilwKmwzbwOA78MK0SjlTpsbl0BG7cuB/1S45Vv0eGOcg2sMP7cdh22NYCTlo9UwwrD+/boMBKAQxaR8gBonM+B5yso4lvCKo3rMJMBA4eIlFywG74PnvEwpg9uVwOFEoT8fTAcWg084AYoD0y0wyauYFvg2rk+6APDJk4zmEwQEZ0nYa8tBppjxCIVsHFFE5ioZEbATCmf6Q3ZEdBlzuZeFJ43eNJEZM2qG3S4c89TOvS9QsgG3+j5CXnDn8GLfzyS1GFtw3LYuLf3JR0ab/iSWhaYHIqI64HRGW4sYuO3ADsFXjrGiuDFUEQieTAHM9DEI+qAFxwRqUovBGUblsHGmbFBHdropaOtHVeYjIG5vde8Xof1lfgevuitYJ6cHcGrEM9suk+HJ3aAUELm8D6ao+LPC7ozuKnsxjUwdwvgQMwYmPBXNuMbvvpdv6TD7TeBPlBEMiPf0OH4fvBiGDm+BFaoyoL7ZyLao8N39YPFHxF5/xfBC9E7X3wWNv7U9b+ow+gasLRV+i3wPi4iscvrdPiZP/gIbLxw9ws6NItg7PB9sDwiIhZadhO02hAUcZcboOUCI6R/9q3/7H9eGdkiIh0dHTNdh71gPwk79e0Mr70CS0RERERERERERDR9r+PHUF2wi7BEREREREREREREZ9H69DWnf8FPwv6n17EgTURERERERERERPRTzfSHUV2Yi7D8LgIiIiIiIiIiIiI6R2b6AdALcxGWiIiIiIiIiIiI6Kyb+kaCqY+BTscFuAjb3d3N7yIgIiIiIiIiIiKiWeICXISd+kYGfhcBERERERERERERnV2nPwy7adOm6f94Lvtc7s/5MfUx2ECCV/2WZUZ0e8vCJ8EwLB36watrioihNnSa7SR1iJuKiF/WmePldLhw/gpYoKLxnTqM1bfq8BVrNaxw9MF/12GNDXZMRMouOBTbjutwYvQkrOAXBnUYr5qvQ8fNwgqVS27QYdYFF05EooPbddi4YLkOA9+DFXrvuVuHNfl+2Lhx5Vodjg4OgM2JASv4fl6HC2vATTXYug5WyGx7SoexMjjtImI6MRBajg5dHxYQCzWOx1OwcTRVq8MgUa/D0ZFRWME7+ZAO060fBmVjVbBC5bxrdDju4x1uce7T4chEgw6LR5+EFRwL9D+LFm7QYeSyjbDCgd2HdOhPboaNF9XU6XB4Alz9ZOYArLDhnf+fDp+Zh8/PBz71eR1W7P4tECbBUyAillnQYeCDfiYojcMKbSvABW288mbYeMRM6/DFrWNgx8bAaReRqy8GVz+aAFf55b2TsIKgOzOxYA1sa6y4TIepE4dBUxMPaiMnQVfs7X8Uby7bA9LiMGhphPRgJugpDBTOSNjmImj00dMAESm54E4TkbJXAptD/TPeAyKiuSwIQP9sh/R3vlOhQ7N2PQjzYGAVEd9FI2NID49ev85CVwxfymZUdnHjMpgnr79Th/5J8EplDD0BKxgm2JEAnogQ+EBCzzCovHI+eJdZ+PO3wwon/wVMSLwyvvqmAT8HBvZtQcsqWOFwL3it89E97PkurFBtgkNOLMZzsOHdR3UYsUCFeBK8y4hIRTO4VaKteHO52IQOm6sv1aG59npY4cjX/kaHVZmiDi+7+S2wQt0qMJmsXfQCbPyP+YU6bDq4WIeOZGAFK47OG7pPgsljsELjwqt0mLHAXF1EskfB7LdtBTiZg3nwgiwiPegMRx8Aj4yI+K036rBqTZMOM6vwI5N9BryMxJ4FSxbbex6EFU58DzxKfRvBy7uI/Nqt4M784gPgoXvri3jhpXIxyP/2hrtg48zx9+qwoRbcP4Xj+LU3MMDDCEeZSBRf0EiiWoclF/cebgGvTnR1dU3zSwkutE/CTi0/T307AxEREREREREREdFZN/3vRL3QFmGnvouAiIiIiIiIiIiI6Fy4pO4//332NL+R4EJbhOWP5CIiIiIiIiIiIqI3xzQ/EnpBLcLyuwiIiIiIiIiIiIjoTTPNj4ReUIuw/C4CIiIiIiIiIiIimm0uqEVYIiIiIiIiIiIiojfBhvY7Tv+is7Pzpza+oBZhT3/6d+r4iYiIiIiIiIiIiM47+3zvwFlz5pKzaeDF5Ui0QoeBncAVvZLOLNPRYdTGp9GP1eqwNhmHjdNtS3XoVKRB2cveBSu8vPl5HWafflmHpaF78T64h8DmzAA2NsTQYYDOj5/vhxVqKup1mLPANcoWx2GF5NgRsGPxNti4du0tOrzq3Zfo8J+X4kOe+N6PdHjZ6sWwcWrd23TYf+/XdZiuA+dBRCoXLtFhvnaZDo/d9wVYoSYBHgTfAjeViAQlcJIjcXA57Ai+h5Ppdh26dgo2zmWzOpwcGtGhPwFuSxFx0G5kB8EtkViMvyR6vAzOT/PSRth46JI/1mHP334CbE48WCFVAe7MnnFwHvL3/T9Yoaq6Roe3fPSPcOPWJh3e/x9P6XD0ob+GFXY8v1mHg7cPwMb18z6tw9YNa3RYehl3mN7gSzoMSn06TFeDO01EatvB02GXMrDx5LFjOpzXukKHq27eACs8s2GHDp9+ap8O0/eCjlFEFkRiOrQt0LWKSHrdRTocmliow/Hj+JHJD4/p0Mjj3tVAI6BpRnTo+6CliBgGOhDYueIjliAArWsSYGAVkXIcPLn5LOhSxMU7LOKDfcB7PCvAUXg2CD9lM7j8s/TYiOa+sK4Ddnf5Ug42LvW9CNIqMIZalWA2KyLByDYU4zc4A/XPcJSBA0eYkN4nbEwC2WQezzEGNj+kw7IPjg4Mqz/ej+nuRMi1g+fn0qVXwgrpajC2tt50sw6PXA3mWiKSuec2HSYPfg02tqNRsA8JMMtdvfG3YYWer/yzDsvDO8G2HPzakqhp0eFggF9bJFKNQnS7RqtggWQVOLqhAr7+k+NgbpaJJHU4uPM43lzLxTpsXg5WG8oLlsMKR4fB/WMP/yZsPDz2NlD54nfosP5H4OVCRGLeUbC5CjDht2P4TXY8V9RhoXAANo7Ug/PTuwO86VsNoKWIeGKBfduDvxuzfgBM12uWflKHz2/G3yia+MGzOoxeCxY3gl3gKESkeAi8oTwX4DeUpuvBHbi4CBbNTrTgTumKF8HrcOexrbDxd/ybdGhLnQ4TwQwmjXBJ0LRA5yMiTgIsyFTH8Trhyb7dMD9tOl8Le0F9EpaIiIiIiIiIiIjozTH1L/K7u7tfu+WFswjL7yIgIiIiIiIiIiKiN19XF/5M9JQLZBF2Ol9/S0RERERERERERPTmu0AWYYmIiIiIiIiIiIjeZKf/Xf5P/VrYC2QRdjpff0tERERERERERER0Lrz218JeCIuwU0fIL4QlIiIiIiIiIiKiN99rfy3shbAI+1O/+JaIiIiIiIiIiIjo3Hntf6lvv2n7ce5MHWF58vjpXzh2FLb0TQeEXgk2Np0kSN2CzlKNy3EFE6xxz7vhdtj4hZ39Oiw+AT7G7D+/F1Zw/KwOo8Mv6DAWSeEKFghvffv7YOOhkVEdnsiC81My8eUIAhBO9uzQ4ZKF62CFqrXv0OHxR74EG9csB5fpnsEGHY5+7guwQlvS02GkuhE2PtYLzo9VPR80TVbACjkjrsOe7dtAAQfsmIg4EVDBsGtgYzNZpcNICpwfz8b3z1AB3PClSXBji4ifB+fHKPSBfTCKsELUNHRYHDmsQzeKr1G0slaHI2P1sHHxwHYdphN5HZqVV8IKEyP7dRhkx3UY8XOwwlXv+2sdRm9rgo3/1tmsw+IXXB3WBeBMikhu4pgOG5rx5oLKy3U42t+jQw/1EiKSLIJbQgR0Exe1L4EVrv7obTr8nyeHYePCpx/SYeUQeL727z8KK4x/Hlz9y5vW6HDZFXioNSqrdXjkRdzD7x8DD8Lo7hd16E+OwQrO8EEdRjxwB4qI74GjE/F1ZBj4b3MD2MWjCwozEUlFK3VYqsRXPzcIzlvgTugwHknACo4FZgjN6Xk67B89ASu4Pni+csVJ2Li+slmHNRVpHR4bOAQrFMrgGgVhZ1PAY46f/JmAGzNC6poGeBD8AI9fIfcPhLf3xo+O6GcMeGi8AHRrIuIWwNhqll9GVSN4ayboEAK/DNta6A0uQDscBPi1Dg9VM+hncJ8yPHkKtvUO3K3DiIAXosAI2wcw4Ib18CY6umVta3U4/4N/CivsHAcj455dYNpwMI4n9mNouo5fGETg2Wypb9XhSMNS+OczK8GUL/7EHh06IWPSUA7cbNmBp2BjowRmVnVVYIcbFy6DFZzWi8Dm9uHphFkGs5fhEfAwBmM7YQU/EtPhqf1glntwGNxpIuIPgjl8T/GTsHEqAFOdaGZIhxE0+RERMzuiQyMPbrZyyLShVAAnTQzQdYiIO34EtEXvX76B1zEk06szswyOQkT8wQEdDt/1lzqsMPF7VpUJulzvmbt0GBX84rP3wft1+P3Rj8LGL779/+jwr679NR3uzsP3BXmqDO7tf7cXwMbVSTD79TPgDcVAY4GIeAF4uzRQP1Mo4hefK5vBCoD/1l+FjXv/6eNgH368FLk+fe0rI7gnmXIhfBKWiIiIiIiIiIiI6Pzq7OwM+605vwg7dWzr09ee3z0hIiIiIiIiIiIi0ub8IiwRERERERERERHRefcaXws75xdhX/srb4mIiIiIiIiIiIjOqal/o9/dDX7Ck1wAi7BEREREREREREREs0FXVxfM5/Yi7NTSMr8QloiIiIiIiIiIiGanub0IG7a0TERERERERERERPQmC/vqVPtN3o9zJBKpPPN/Pa+I23llEBoWbGugIunmFTo0q+bDCkN9h3R4cvNTsHF5cJ8OkxFXh41tNbBCy4L1OhzYm9ChUxiDFa778O/rsHcF3tzeb4/r0Di+G2wuFocVxkdAhWo30OHS99wBK7it4MwfL9bCxq88f7cOi7sGdNjo5mGFaEUd2NzhHti44B7VYcwAd2ChEu/w8FFQ2Tz1ig5rm+fBCkGkSoe5DDjtIhK4BR1mR0Z0aPlHYQUX3VdeCT+MZgA2V90Ini+7qh1WyJzaD/ZhApw0J5KGFRa3XqLDBW9vg437fHCSW+xbdFjT9xKsIAtbdHay74gO5zXhCxo5dVCH33nyMth48MlRHdY7zTq0GnAFd+g5HRaGQU8lIt4EuK9MH/SuUfcUrCCGp7MV81bp8JKb3wULPHwU9B7j//BD2Lji8FYdBlG0w4lqWOHWX/lNULYjpcO2DAhF5IleX4e5H4KBQ0RM39GhdXKPDp18P6wQjSV1mGpaCRsbmV4dZnPgpiqUMrAC1JoGnTa4bCIiMpQZAjs2Ch58EVnQ0KrD2lSlDs020M+ISDGI6LDcDAZW46l/hxUWNjXqcHkFuHAiEr30ah0eGQGN93/1z2AFETBU2SbenBeA6USAT33YBQEMwwD7YEVh40gUXI5sdnD6leGuBSE7PIPDEDEEbY7oZwl+BkIfJDB++e7k9AsLfMbDNhaAGQKsjLuOMLBtSM8IuR7oWkUkkAmUgu2ZJv5ElD+T3QhQ4/4hMCUe+hoev4654JUhfnSzDr2nVsMK6Sh43WtsB2OoiEyOHNNhpljS4anv4iWM+AhoHIvHQNkCfvExB3fp0Ajw5Yja4AzXrrtJh+WWNbDCsZPg6cjH8BtKwe3T4QILvGc1t4e8pw+Dy5HNZEHTw1tghcqL3qHD+uMHYOPiUfCGkqhboEMLvRqISLQaNI6hGXhmGLw6iUg5g1/JMfTI+Ki/M8fBTFtExAdvsgHqGEXEjoI1BG8CVK51wKu3iIgFuhqrCObqTrweFtgzAqbro//xh7Bx43fB6/AnV/29Dicbj8IKcPBwsmAeKCK1114H0i3oTW0MzzBDLgfYh/qKJlig6jrwUv/EMJ5UF6ILdZjw/ssTekntDS8NPyoinZ2d+pth5/YnYflTuYiIiIiIiIiIiGiWm9uLsKdd3vTz53sXiIiIiIiIiIiIiLA5vAirP9ZLREREREREREREdB7Bf7s/hxdh+VO5iIiIiIiIiIiIaJa4pPaGsN+aw4uwRERERERERERERLNNZ2fnq5I5vAjLn8pFREREREREREREs98cXoQ9jT+Vi4iIiIiIiIiIiGYz+3zvwOs09Zle1yvo37UMC/4p0zBAaMdg44pUtQ6d+hU6HO4/Diu4E0fAvpXGYONUdb0OF190pQ6veP+7YYVnCuDo+nPzdDgvvw9WePZUhQ6fO3UMNvaP9eow2denw1gkAitYfkmHVU3gDI/5SVjhiaq8DidPHIKNE0MHdBhPg30IAhCKSKHo6dDzwWkXEfFBY1cmdTheLMICxtAuHSYrEmAf4uAqi8joyYOgbHEQb84AfyVjFk/qcH3HH8MKL977VZCOb4ONo3FwswVWVIf5YhlWcCrAUddUVukwXQceLhGZf+l6HZpNeHM1i8BTk75mlQ7bJ66HFeI5R4f5g+M6rGithBW++ukHdNjzubtg44ZMRoctl14O9mHeNbCCOX5Yh14p5P4pgp4NDjBByBOzaj64HDf92Sd1eLixDla498kHdWgeA0chIvEy6MGMYlaHK+rXwQpX3tKkwyPNu3U4vugbsMID+fk6vPbmD8LG/XvQ4xy4OrRLeEhqSi/U4YLrN8LGp3oHdDj+9LfBPhTBnSYibXULdLjytg/rcPfLoK8TkWD7d3S44opfwJu7+kYdFgR0KfuPgYFDRDI7H9NhLAJuieXvfD+ssOzqJTqMgDFNROSpl8HzsfsouH8CA3RrIpJMggqeiweUAD2hIoGOTDQWiEiAGsPMccA4JSKSAI/M0hoQishkFuxwvgjG0LKLh2wvAKNwKez8BOhIZgF82kUMCelJid4UcNJooPcv38fTKkEPnYHe1MIEgf8GK+CyM/mdIORJxE8o6lxn1PmEPfiwxHh+FKS78M+1Thjgtdf0R3SYLOD3rIWXf0CHtdf8CWy8s+ufdWi0LdZhXXMbrLD4rct0WOVu0OH9n/sIrFB2cygO6XIt8Crau/MpHU72gqUJESlOgPlz2QxZhXDBHOy2T4CTufdSPAfrv+R/6bBmwaWgacjShHtkiw6dJJi4ikgkAgbiOJiCSbmMD9lAHYVvg7dFuwpcehHxCuB2DdBKkYgEaP5soIcx8EPe01F3B9eaRCTw0XQ9Xgtahuyw54L5j+OA29KOxGGF3OSwDs0yOGkiEs+Cl475T2/VYSGBL0e5ZrkOnYo0bFxTW6PD8eVrdOj2PQkrWN4ESA30OIcMEbt3gBfGXAGcNBGJmeDtIAhCBjv0L/jn/CdhiYiIiIiIiIiIiGaDDe13nP5Fd/d/+QswLsISERERERERERERnU1dXV1n/u9cXYTlT+UiIiIiIiIiIiKiOWGuLsISERERERERERERzU6v+gjpnFyEnfqpXFNfskBEREREREREREQ0O83JRVgiIiIiIiIiIiKiuYKLsERERERERERERERn2dS/5hcR+zzux1nhmOgQ7MT0K0QqmmBuRWM6NCsbdVhZzMIKZs21OoyGnPJYHOzzgkXNOnzSdmGFxx59RoeJ4ZwOvbIDKwz/2+d1WE5UwsZ2Ma9DUzI6dA281u+bhg4HQAEZzlqwwtDD4OjsA3tg44iM6TAoVYAdm+yFFQwjQCE4ChHBaSQJNjfwHK5Q6NGhnVyjw/ET+2CFYGQ72rEybmyBG35N20IdltdfAitYW54FjYfBPohI2S2BcOigDp2KNlihpnW1DpddcbkOe/smYIW+AbAPbZYPG1+dBI3f4oGjM80BWKGUOq7DrctadLhHnocVnnNvBZs7eQQ2bkmDx9wYPalDvzgJKxgWqJCoAnegiPiFYR0GPuisIn4RVrju/XfqsGdhjQ6/+e1tsIJ5CHQfqYo0bCygA5PAA+m6lRfBAicEHN3nBk7osPTcIKzQcDF46J5fvxM2Tm4HA00sXqfDdP2NsMKKS1foMDdvGWzcMwnOW9kFXXEihseIhevfokN3wSodDu7HnZKZBKNztGkJbHx0Mq7Dk+Uo2FwPHiPieXBB3WPgZhuuugZWOHgS9B7bL38ZNt5/AA1Jz4DOvL2yHlawLPB0uBN4/BIB45eJRmfTioQUAEfnmKCXsOHETKSuAXR37T/3Adh46333g13Ioh4s2w8reMVRUMHF/XOAHmcjZCQ/RwJ0jcL2ATaG3uSjmJEZHTK9DiF3yXRvHnmtyzGDIrhyyNtB6I5Mbx+C4I3u2AzPzxstHL4xdHQz2hpq7Vh4lz1/BDR2wHBQUwleTkWkub1Vh3sGPdjYrAZDeZAAU5p57SAUkfaNYAQ83gRenXJ3/zKsED34dR0aNj4/+RJ45cydeEmHZt8uWMG0wYQkYuEli6XrwTRj6Vowz1k7AVYbROSfnJ/XoX0CzH8q0g2wQqZ/tw7LLn7lrEiC+WFQBO9f8TiY+opIPgPOsDsBhmzDwdNOp2qRDsvjR2Fj8Qs6C3wwHQ2CkHvYQFMdNFMKy8s59Opkp0IqgPfQIECnPaRbisardZiqBhMzEbEFHLXhgNu1HOCevGyD1z0vGMf7dmyvDvtz4MUnboHnKAwcZTJ5vA/lHWDaGWl9J2wcX/kuUHnHEGy8of2OrT13vSqck5+EfdX32hIRERERERERERHNWnNyEZaIiIiIiIiIiIhorpjDi7Ab2u8437tAREREREREREREBJz5r/nn3iJsd3f3+d4FIiIiIiIiIiIioumae4uwXV1d53sXiIiIiIiIiIiIiKZr7i3CEhEREREREREREc1a+mtUuQhLREREREREREREdPZ1dnae/oV9fvfjdTjzG21FxDVjoFGA/2zE8HVox6pg48rKuA7j89p06DY0wwpeuazDVcvw5qrrK3TYN1DU4ZP/8hisUH4S5FZtgw7zBtgxEYlnj+owNp6DjZ1IFITJtA5dF99mpdyADs38CR1mT+2HFZonjujQt/HRBSb4Kwd/ooDaerACFE81wtwtgfPmodvVyB+EFWLRlA7L5bwO/YmtsELgTYLN2eDCiYhfAjdb2QUns9QLyorI6ve+T4cvfOYh2Nj1xnUYLQzq0LPQMy5i5EHjgVSrDl/efTessGESnOGq6ibYeKmxW4fOPnB0xkHQUkSOvHxKhy21jg7/7UQvrDC4t0aHC01QQURqW5frMOOVdBgpj8IKnunqsL4W3/BDIyAs5sZ0uGbxSlhh/i9cosNPvHSPDhv+6SuwQnrBdTq0BByFiAg66oZq0Jk7V74FFrh3CzjzmbtfBmWPrIYV5j95qQ63PAwqiIj0gyEp5YMOYf7ydbBAsGKDDp96AG8uMwZu13QFGFAa0gtghWIlGC53bAOPbS47ASvUN67R4eAp0HWISP+eH4HKLpgNREN6+GhlrQ4LY2BIOvTkD2CF8V2VOizbvw4bO7sf1mFyBGyubjF4lkVkYhg0FmsINracpA5TDhgOAgvcaSJiOCCPREHZPHrwRSTugMnAtgyeFA1MgsuU9MAOWyaYPolIYIIKhoA7UEKnjedEMJOtmWjqIiIiho4s09Jh2QXd/rkTfmzgdywD7LAfgLm6hJw3wwDn4fTvgAohld+wsH14Y01naPr3lRGyF4YBbrawsiY687CpFTJLgber64cM2fiCzmC6Pn3h5wfkYbfrG2eboMOE10hCzlsdGrKrasA8WURG0YkfO7VHh1ZIpzReBDs8tv1B2LiltUWH5QiYlo+OgdcTEWnqBcPB+xq/rsO/XwhmIyJy0V70fmrP6KYCt7xvwFdLaUyBd2Qz5ILe+ivv1uHSpsd1uOAj+KVD6jrA5g49p0MvCcZxETFdMN2KePgt27bAfdWUjoCW89bCCge2oJe1MtgHO8C3hJNCN9VED2wMeh+RAA1JsKcSEcsGk6KwXtiKVeuwNAlm2kEZLI+IiGmBG97zwFuA44es89TM06Fdswg2LmfBW1IkCWa5qQQIRaQUgPOWGcFz1HIOXGjr8C4dOiHnJzDAuYfPlxvgq5QbPazDmsrtsHF+3QdAenw9CDPgKGTufhJWf6aXiIiIiIiIiIiIaBaaq4uwRERERERERERERHMCF2GJiIiIiIiIiIiIzr6pL1adY4uwU99lS0RERERERERERDQnzLFFWCIiIiIiIiIiIqK5hYuwREREREREREREROcQF2GJiIiIiIiIiIiIzqYN7Xec/sXpr1e1z+vOzNjUd9lOCTxfNwvcUfjHk7WLdFjb2AIbp1sX6PDoGNicG62EFa5bBU5v86/CtrI5e0qHW79Q1mFp/0FYod4c0KEzvE+HRrIVVghyR0AY5GFjw5kP9m3gJVDBwxVEAh35Bgit3Dj881Y8gqo6sLHnldC+ZXVom7hCsnqBDv0KEIpI+dQe0HjsgA5N04AV4om0Dt26tTo0ytthBTNX1GEsUQ8bl3ODOszlJ3X4novAbSkiX2pzdej9lQcbx2KWDpPpxToc6d8FK+QiDF9RAAAgAElEQVTdER3u21Srw8o9X4EVaq/+rA6LJ+OwcY1/tw5v/+o9Ovzh6PWwgsRX6MwaP65Dr7QBFlhw7JgOE1XgtItIuu6tYHN2gw7Hm5bACo4Nno5l194AG5/83jd06OdBV3zVNVfBCo82bdFh9qvP6DBlZWAFS8DmyoUJ2FgMcGeuW75eh89WgIFDRF74u/+jw4VHntXhz99xJ6zw8GCTDp094CqLiImu87z6Ch2uXNcOK/zHDjBGTD7TBRvXJQs6XH79+0GF4SFY4cgJ0POPn3pIhxXJJKxQuxhcDommYGNr9JAOEx64VaxKcNpFZKIfjIBOsVeHzfPwLbFwyQId7reisPGpAHQ1dYsv1WFecC9aRrHh4AlJxAHjWnXLMh1OjJyEFex4DdhcCsygSr3bYIX9Rw+Dxi/9CmycDMCTG6AZgotCERETzMGCAI9fhuCBGDad/m8EAdg3w8Al4NyjumoebByLgPtnLAsmS6VMH6wADxmeymmfmtdiGuBjH7aT0GGxBCYeIhJzwCEXyqCnkvCTDNvC1LHA5XB9OOCG3IEh8TlrCw7EROchik67iJgWmFSXyngO79ixkN2YVlkRMVGFHHobkpDb1TLBTRX2LPvo2hnotnRs3GlH0B2YyYG5qIhYBpjl+gHotZ2Q8xNP1oEKsKmIgd5x1r79Dh3mI2CeLCKnnn9Oh1YCdCl2FN8/bhn0rnUNYNopInayGqQp8OKzfRKcSRGxvvLqNQERGbwO3D+WDabfYTwfD7gBeu7gzVZb0QgrvPcP/kKHuQk8oV26YYEOn7v193SYP/k+WOGSPY/psBzP6dDv/xGssPKq23W46/kfwMb1jVfo8Lbf+4AOv/8cHoWjdXt1aIzv12FdQzOskAvAZNJAiz8iYrngHccrgsuRSKB7VcS1QYfg58dg43IEFIn4aBXLAy/vIuKjkdFAvUdQxC8+pYl+HeYsvCzgFUGXUjbAvtlV+MXZsEBe8vEaXTELzlvSBpszbdwheOjBNQ0wD/RRKCIlF5zhgcOPw8bmQfDSWrMGPDIhjzg/CUtERERERERERER0LnERloiIiIiIiIiIiOgc4iIsERERERERERER0Tk0Jxdhp77XloiIiIiIiIiIiGiWm5OLsERERERERERERERzBRdhiYiIiIiIiIiIiM6h/7II293d3dnZafxXnZ2d52vniIiIiIiIiIiIiOauTZs2iYg99f+dnZ2nI93OMIyurq7XXo191e92d3efpf38KQJvQofxaAVs3LJwtQ5T698GG798NKvD7HPf1GH7FTfDCgtXX67Dy09dCRv/7hcKOoz+6Nd02GolYIWEAyq4JVeHwdguWCEQD4QBCEXEmzysw2h6lQ5LY4dgBQnQvvllHRqmgffBBxX8ADeGDAM09kIOeWLkoA7NQh42DkrDIDUDuBOwwsjYMdB29DjYlqCyIhXxSlAhvQI2XrcG3JlXXrFOhwfeNg4rbPmzf9Xh2qAEG7e1rNThQByE0r8bVhieHNRhxd4v6zBw8AV98Zt/osO9pz4LG3/+yr/S4YnBDTpc9e2nYIWYeQrFUR0FJrp5RCrSSR1evPoq2PhQcokODz/7iA5rFq2FFS79wO/q8IsNj8LGlV8CD2NaQC9asR5dZZGv/88DOly3+SXQtAJf0PIAOPNODb7hnVSjDp/bD/rGyd+6EVZoj4Dnbs0Nd4IdEwdW6H+wX4eRF3Ow8aoUKPL+v/l1Hf7AwE/osc+BJ3RlazNsfOmtt+vwxDHw0GUi82CF3CgYIypq0jq0I+ApEJGSldLhoAMqiEgm84oOYwVwhsvjvbBCzB/T4YK2+TqsWnUprNDTC85P3/cfh40jRTDYldKtOhza+zysEB8Hw4Htj8LGVY2LdVhufasOx4YehhWc0ZMgLUZ05rtFWMHP9unQdvAYYRmoMhqdg8DHm0ONDWMG/wLMEDA6hw24sLFpgs1FHTyLS1eCTumit+O5d6SmQYeb774X7NgkeApE0O6KCDy6IOSQ0ezFDDnDiQh4nMvRGh1GPHxLrF39Nh3u2Imfr4ILpsTwGkVs3P801INHZnQU9B6FMu60PR/ermH3z3RTI+RfMcIzHI+BF6KqxqWwwlgenDQnE3L/xMG1M9D9YztxWMF1wBzV8vD4HrEssG826CXgQyciXnFSh7EI2LdodQuskKhv12HvdtxhVlbU6TCbHdFhbW0brFCqAvl4Bj8dy5rB/DD2tlt0+MwOPEZkitt0mK4A/Uxi/nJYYbBcpcPCyB7YeDKPno4smoOlmmCFpuuX6fDf7s3oMHotmA+LSHAPCKNODDYuTrtLuf32O2GFeb9RrcNjo+CmEpFDFWB949Ed94OmN/wmrODuB49MKgau0c2//GFYYee863XobbkPNn535zt1WL5prw6f+MYQrFDVAtYQqtEYse4m/Nqy7xA4acNJ/DgbaMHBzKFpeUUtrOBPgs1VNeAndHgATNgq68Ao4+XwO6ATAbeKWwDdmh0yuheLYIeLPT/CraPgdk06YOywUvj8DLrgURobfgFvzQP9koVG58C0dSgijgUa+2hC4pXBSZOQx9my8OYiMTDgjh3erEPTAuOUTC3Chq3ATtm4cWPYOmx3d3dXV9er/nhnZ+fGjRvP7qdo+ZlcIiIiIiIiIiIimnNMEenu7p5aQu3o6Ojq6gp+rKOjY6ppV1cXLLFx48bTf7zjx0Rk06ZNGzduPOe7T0RERERERERERDS7mfJfV1dPfy3smf879bubNm3Sn0U9nXR0dARB0P1jU6u3/OwqERERERERERER/Ywzz/wYLPysa2dn55mfh32V039Wf+j1dPLaX3FAREREREREREREdMEzz1x4Dfvg6tQaa9iiatgnZImIiIiIiIiIiIh+xv3kR4a9xsddz1xR5eoqERERERERERER0fSZ0/zGgNdYohWR7u7un5oQERERERERERER/azp7u6232CJjo6OTZs2bdy4saura+pDst3d3ae/weC1l27PCjveoMNoJAIbD5tNOtx+/yOwsZsb0WF1uk6HA9sfhRX+4oNP6jB+HOyDiFQvfbsOG5dv0KEZi8EKkz21OnT2o0X2YBRWgIyw3LB0WBzZC7YWeCE1Ah1ZJrgnjZC9cJy4DvPFCdgYFrEM9AgYJghFXK+oQz9/EjauSDXqMGGByoloAlboGTqiQ893dRh2fgrlvA4vroJtpeZDH9bht/eBlls+8FlYYdlmcPWT6ShsfCq6UIe5veh2NX1YAR51YIGbzTIdWKFsgH27JfIybNz8O2M6fH8GXA4zAm5sESk74HIY6NJ97Lf+BFawlyzW4cAkbCtb/+ZDOoy4ZR2OnXgWVnjk/kM6XOKCB19EvGhBhx/94B/qsHEjaCkiuXsO69C3wQX1PHAUImKjC+34Wdg4Nf9aHWbBIy4JeQFWmH8lGOBqlq3S4ZOb7oIVKrakQbgCdPsi8vabl+jwL2rAvh38xrdghdoMGDtWveVq2NipA4PdSA6E5UM/wJurBM9XOZfR4eCJXlhh6OguUMHH3V0i3aLDiFWtw5oErrD4snfrMIsqPH1sGFYobH1Kh06xHzaOO2A4yEXn6TAx9gqsYARgsPMD0CmJyKkT4EHwT4Bn3PBwn+InwNUPBrfqsK59PaxQyiZBGOAupTQ5CDZXBvdP0sFT2VIJHHLJRQ+5SCICB2Jwq2RD5himBWaeNal6HSYbwLMsIi3L1ujwsl9+F2x8dw5c6Ip7QFdjppfDCkEWzF5MdP8UyjlYwTTBM56M40lGumGRDrMT4Crf8SE8AlbecJ0O2/4NPDIi8sDD4KdcFNGkqK19HawQW/ceHUYPPaPDI3vBbF9EJEDnLSjBtnBSbZkgTEUrYIV1V92sw6pm0DG66TZY4dlHwdHZiWbY2M+DbjCZbtXh5CQehQ0Bs7tUwwrYGM6WomimXTTwW5JRBD2blQIns7oZH3Kp/WIdmhncg/l183UY9ILOPNOAn9CRozvQTuA3OGPlNTp88DOf02E5jfufpnbwhDpGuw6PnDwOK5QyPwQV6lfCxoWel3Root4jOAIGVhG5+zB4B1zaDiZm133pj2GF734aDFW3vAWcSRH5wWbw8bKIDbr9yovwGb4i+zUdxtI7YePPlsCywP033abDeDee0hgR0NWsWwcGlEMLb4AVXvkmeClLWng4cGtBV9Ndvl+HY/txh5A8Ct4iL7/jTh1+9yb8jI98fJsOG8bBKCMiixejzsoBN3yxhCdFDUvAhD8bcsO7W8DTkUIzbUvwskmAVidqbXCVix7ulKxx0Gm7GXw5CgPgdThloDn8NrySVnTAklfMw/PnYPIYSD2wb5W1YAFBRLwieKXKj4JZrg/fvUMWFmKRStjYd8CE1rZBD+aXxqd+vaH9jq09d4lIV1fXT2au0/zs6qs+Odvd3d3Z2Xl6HXZqyfV0m46ODn4eloiIiIiIiIiIiH7GvdFPwsoZ67Bnrs9yBZaIiIiIiIiIiIhIzsoirIh0d3d3d3d3df3nv/3ZuHHjTH9+lxHywWAiIiIiIiIiIiKiOe3sLMKKSGdn50wXXomIiIiIiIiIiIgubBs3bjxri7Bv0Lx54Jv1x8fHc7mffP2z7+Ofz0NEREREREREREQ0O3V2ds6WRdjeXvzDkc90+ptn34SdISIiIiIiIiIiIjpbzPO9A0REREREREREREQXstnySdjXzfdcHY6NDcDG4y98XYdWrB42dpwYSN0lOouUT8IK1T76aWO1qKxIw6lndRgMbtWh707AChEDLKlbEXSJk+DLH0TEzfaBfYBNRQIfnPkZsUywb3akUocGOjQRkWQTCIu7YFvTtEAYSekwCEIO2ivq7KqLroVtg/ZVOqxsXaTDHcfwmfQe+YwO00lwFNlSToci4gm4A1/Y8ShsXP7lnSgG3wEy34MFJBIb1eFkIeRn7h16AIQOukZhV8Mv69BAh+x5oKWIiDems4MHD8K2D3z+UzpM/9JDOhz/HCgrIjX553T4wdt/R4f1n7oIVija9+rwH17BHUJ29wd0WHHfdh2mM8/ACp5dAqkd9kMUwXVqX9Kqw8uHcP+cN4+hqmBzNuo6whSzeHPFQ4/p0Ew06jCRbIAVIvlTOnzcvkyHbt/LsEKyElS2nn0SNr47/dc6nPjI53XYYjuwQucH79Bh9cqVsPGeEVAkGQV94M/9ASgrIgd3gQfhwG5wOVKHPw0rRA1wU+UDPBwUTuzVYWLZu3QYaVkAKzw/Xq3DE4+Af39TMfw8rFARRak7DhubcTAcmKPg6lem0rDCZB50mEkHDGoiUl3dosOe/j069AP81U9BFvyLpXSqTocV8y+FFUrDR3TYt+8J2NjPD+kwGUvq0Gq6BlZwB8DRGd5x2Hj+mnfocGQMXLvJAw/DCnUV4HF22i7X4aiL54FXLwAVHloAJmYiMl4AI/G+L/62DuPvxs9XY9sVOixmwWkPhuH0QFIJcGc2rcCTInsJyNe2RHSY/V1wU4nIxRX36HDHBtyDnWwBJ3NBBbigbgL38LE4uEzuez4Gwu1PwwqGgLmHGTKhTcTByUyim2rpJdfBCo13vE+HveAEy+Zn9+F9yIDpaDqNL0c0UaVDPw560dLwbry5eWt0mD2FZgIi7vhRHWYmwCgDuw4RMR3QexQrwAtRvognjaPHCzqMF9FMSeTkHjDlMwsndDg+cBhWML1JHV65aCFs3Lfy53SYe+LPdVjp41eGyGW/oMP+/TvAjp3CI6CgSVF5+CXY1grQu48Nxq9IyGuvOwZmCI21CR1+Z/MjsMKfHgHv74/smQ8b+4/ercPrLwcDx/f/EUzMRORLB/9Kh//we+C0i8i8r35Yh/Gv/6IOl1biVYhoqlmH24+BEXDxQ1+DFVb8+m/o8OjH/h9sPPgcuOGfGnpBh/N3Z2CFSAJc6Cd/8GUdZr+LO+2GNtClbLgOjMIictUNYOzw+sGA+8CWQVghNwZeeyM5cMgi0tpSo8PAB5PqiTx+z1qzBszi4s0gfPS+F2GF8iR4ZMqjuMtduAoM2dUX36jD/s0/hBWSybgOjchS2HiyB/QesSgYUOwUWvwRcdJgja5soHF8EHRrIhJzwIuPhxamRKQwDs6bYYGjsOL4dv3JVGCaP1aro6NjOs2IiIiIiIiIiIiISKb/dQT8MlYiIiIiIiIiIiKiadrac9fUr82ZfrJ148aNZ3t/iIiIiIiIiIiIiC5YP/kk7Gt81vXMbyqY5rcWEBEREREREREREZGImN3d3VP/81MXWPmFsEREREREREREREQzYsoZS6ubNm06c032tO7u7qkPyfK7CIiIiIiIiIiIiIhmxBSRMxdeN27c+KrPxk4tvHZ0dPC7CIiIiIiIiIiIiIhmxD79n66urqnFVvhx146ODv0h2dkgKGdAKD5u7Od0aBYHYGPbqtNhNBrVYaz952CFkzse1qEVqcab806CMNUKKjgNsEK+f6sOPd/WoWGYOgxjzOh3DNg8CKkA8rJbAFUDF/5500qhEFwjEYlalg4jdgTsgxWHFZa0rdTh2g//IWz87AtDOjwWbdLh3h1fhhVqbXB+KtbcpsOxl74DKwg6b0HI1bB9cAfCtpaJSxgGOMN+4OHtSV5HUSetQ9fHj7OUxnUWhN5sEGiczU3CplfHJnTYd/z/6vB48nJYIZ0DN5tbKuvwf39jPqzwrFfUYfAEPsOp72/WYU1sWIe+CfZBQjqKsA6hIgZ6tlJDrQ6LL+yEFcwD4HIEFrj60UQ9rFDMj+rQMh28OdQh2A64RiUD9DMisvfAQR1OPP85HVbbWVjBDsZA40p8dH2PfEOHjVEwfrXWgOdIRC699TIdZsCDKCLS74BLfclicNJS1+MxtKYadHdXtFfpsO1OcGgi4h3v1+GXv/gobnwATFFGdtylw+F9eAwtO406rMz16tCSQVjBL4HQNMEoLCJ+9pgO022X6tBN4A5Bjj+ps/qL3grbZitWgHT0izoziuC0i0gQgI4iEknoMB7Ho/DQyl/QYeHgEdg4EoD7Kl8C/XPu2BOwgqAOc349PpmR1Tfp8NQLu3RopY7CCuM26CjKR7frsCYNHg0ROWDfqsOev8P3z5GPfVeHo0+DHiydAKGI5AZe0aHhVOhw+bxlsEKqZbEO+ybBLE5EYsfAydx9GFzQ5fI2WKH2j8BwsPZP3w0bi3GLzhZd80s63Lnle7BA3dKLdXh0L3hsLRdPG3w0i3OsGGycqlukw3IEdOa7du+DFXZ85ls6zC4GR2H3HYcV2q96lw57n38ENm5pBuN7VQt4vvr3PQ0r+H17dOh5eEpjBKB7rUDDpVcBdkxExnue0WHgghfD0kQfrGAnWnRYTuOnwx97XodGGQwoRsgspaFtvQ5H5uEZ5t5//e86rKoAz76RA/ewiGQOgQ4hlQJTO/Oaj8EKo1u7QOPxHbCx74PJh+GCUQa+XIhIgEbc4WHwLvNLOTDXEpGbAnChUys/ARu7m0BHsa0XnOGe33kbrJD4/l/r8Odzfw4bD1i/rcP5FuhqTAN3ueU8OD+t7RfpsOot74UVnn0aLCwkDPye9fS2EyC9C3QI0VhIhyDg2fdy4IJWGiOwwrwoeEJvvH0DbLzoyq/p8O7n/lKHhzb9E6zwe7//Dh3uNfEagnUS3PAv7gWzlMXeUVih+r2rdfhvrxwCTXvxtCqF1sHsIn468lnw5jJ4DCy7FUv4lkig96ygYiFsbPSDcc3zwZu+7+JXKonW6MxEnbZpH4AFIkmw9Jcvo5m9iINee/FKCPzzUz+Yq7Ozs6urK+wrX2fJCiy/DIGIiIiIiIiIiIjmnJ980Kmzs7O7u/vMpdiOjo6Ojo6urq7ZsAIr0/i5YURERERERERERESzzav/lVNnZyfXOomIiIiIiIiIiIjOlhl8N+jssbUHfMsbERERERERERER0axy+lsH5uQiLBEREREREREREdFcwUVYIiIiIiIiIiIionNoji3CTv3QMCIiIiIiIiIiIqI54dU/mGvOCfySDg3DgI1tK6pD13Nh42L2lA4To3t1OOo0wgp+fhik3ghsbBhgQdwqDuow2nQjrODmBnRYyhzTYRDAAmIIOm/4XOLfMAxLh76Pz7AX+CANCjpzTHyjermTOkwmamDj6uaLdFgKwGn3MujCiTS2LdThQ1IFG+9+brMOA3TSYpmjsEJl6wYdDgznQFMrCSuIO4ZzxHHA0xGJp3XohWyuMH54+puzTHCruC64+sEb/rsifGOLBAKehAO94BkXkcEv/4sOexbfpsPIBK4QiYLd2Fd7sQ4P/90/wgqxgeM6jBvoORJpMg7o0Hc9HYZ1mLCn8NFJE5FMYVyH7XFw7f76F+6EFbxf+agOSwfrdGgZuEMI8A5jgQ9OhZcF/bNf7oUVzFitDqtL4BrFKppgBSuS0qFbsQg2jo6/osNE86U6vO0d4KYSkb6LwIByV/6LsPHhnrU6vPOS63X4PxywYyLylWs26XDP0Cd02FizH1a4e/RRHY7+ER5QmuuX6tAz4jp0+5+CFcx0BahQ6NGhkwC3pYT0YL6LOm0R8fI6Gx88CCrYeNoQFEd1ONCH++FMAJ5QszwByoY8NHCWks1P6nD0RXDhRGQs94QO40XwyIhIgLolDz224oNDO10D7ENmCDY9/iC4XUvjJ3TolMBzJCKlErhMAbr6mWI/rPDSd76F6mZg4+rcL+tw4NbHwOauBy1FZNXu+3W4uL1dh4tufS+scGIYXI7ys4/Dxg033KzDHbvB0Z3Y/CVY4fMfv1KHRyrBHSgig/86X4fmyXfr0NvyPVghVgvm9kN7DumwEj0aYRwrAnMXzaxKBXB0oSP2xFEd2ntBh7lu/SWwwuFCGezY6BHYuPYyMEbsr2zTYXESP6GWiaYTLugYRaSyHtyZTs0CHY6MgxdDEREP9M9JC9zDhSw+ZLcIeg9vAvdgjgU2Z8bBbemjNzURcSrBHXi4Hx9dIrtdh8nG63QYr14MK5waABXEA5srHW+GFcwCeHGWAO9wBL2SGzYYskslME5JyNx1IgeGxXkpPG3oy31Fh4lXwORZRNxr/1SHP/oX8CgtuuT3YYXcrm/qMNn1bdi4vvI3QONKMIYa4sAKbgm8A/b37NLh2P33wQrFJJjqJODYLHJi18M6XJzpA00d8AIoIgLHd4GvLfiCDh7dqsN/+IMvw8YDl63WYf8Vv6bD276Nb/j7jJd0ePD5NbDxjW8F+7w+A/rAjI+f0E0/BP3P5Asv6zCWDZkUFfbprDYKeioRKY6C2e+pgR/qMF4CMyURKcfQGkuAR8BIFejurBK4txPJalhhHA2XZgw0jteBFSER8W30KKEXwzCeB8ZQ/cBs3LhR5twnYYmIiIiIiIiIiIhmua09d53+RWdnp3ARloiIiIiIiIiIiOic4iIsERERERERERER0TnERVgiIiIiIiIiIiKic2iOLcJ2d3ef710gIiIiIiIiIiIi+uk6OjpO/2KOLcJOmfpqWyIiIiIiIiIiIqLZbK4uwhIRERERERERERHNCfb53oEZ6+jo2LRp09T/BhLoNraBj8swIyD1XdjYNkDo+r4OCz1PwQqmPwH2ISjDxgEoLCV3ErQc3A0rRBou1qFXBpvzCidgBcMAx+wH4AyLiIkaT79sWIV4tEqHgR2DFfxyQYexVD3ejeoFOnQMB2zOi8MKB4716vDoF+6Bjc2+HWBzDrgD7WAIVsiMgKvvBf06NKyQB9kHmzMMC7Z1PXCrBAVwDwc2viVC/lLHw7sG73ivGFIZgrsx3dtSRAzUOIMOWUQyu+7VYcP+VTpMeKdghVgM3FcvP/aEDlNju2CFWne/DgMDXw7DAUdnoWvko24tDDxpEtJRfPkfvqHDf/4fN8EK9/z+czr8wFO36nDeBHi4RER8cP8EJXwHGujZF7MEqrr4lmioqtFhoXKdDicGD8IKVimrw7IF+kARsQQcXUNjkw73NV0KKzz0SdCl7B+ohI3tQ2CfG+Q6HUbK4CqLSO6VzTrctfKoDn/wylWwQnLXt8DmfhWUFZGaZx/S4fxFi3SYyV4EK2x/9mEdBgaYIbhhPRXqXQPY14V0VeX8IGgZgFBExAQ1sqfw02EGYJjwPXxvQ3AkzxbGdBgU8T7Ey2hKY4Y9oWh7AQpDe33wG2O5Edw2+4jObAHXzjdm0GFChWIe5saxH4AQTYpExPvOVh02Dnxchy2XgMmhiKTef4UOex8H1yhTCfo6EXm+MqPDdznvhI0jETD61K8FPVhidDGs8NVdbTocfvYTsHHLVXfqsPW27+nwwPffDSv09IFTUdwGxikJuYexkNvV80BXY8XSIEQPvohEqsDJjMfAPNCrB2dSRAZ/CO7Aan8cNu7ZtV2HuRh4vhIJ9PIlYgbgkE0HDc0ixQJ4atyRkzoMCmAcF5H0vPU6rGgHw+XJw9tgBX/0AEhze2Fjp2q+Dl0PzTFC3rP6j4IzXDKOwcbJ2oU6jKfA/ePWLIcV3L7v6tAScNqtYTxHDdBLgBEyR7UTjTosueD8hI2hNno3LJRzOrz3m+DBF5E/q/1zHX5qyXtg4+jXv6JD90Xw0Ll118IKrXXg/XTFZWBaJSKjdZfocOe3HtehYeBP1DkWeJTKOfCGkt0G5loiYldeo8PACnmty/aAfYNvnD6uYJvolRwdnRcyBytMDoB92PVN2LhqJwiXDH9Wh6M/F/JiaD+jw9XLwZMoIje3g5P8q9eja/eHS2GFwvEjOrSHQR9YLSAUkZpqMOGvXH07bNy7/QEdVo2BGXhJcA9fMEEPH7Vw42gNGJUiBuglimYCVigOvgDKoj4wiIBQREpFONjh58t0wG545WEdGlYUV4ApEREREREREREREb0O+ptUuQhLREREREREREREdPZ1d3ef/gUXYYmIiIiIiIiIiIjOobm3CDu1fkxEREREREREREQ0+829RVgiIiIiIiIiIiKiWa6jo5T0eAoAACAASURBVGPq13N4EVZ/wS0RERERERERERHRbDMnF2HPXEUmIiIiIiIiIiIims3s870Db5RhgDAaScLGvhnRoRf4sLFtWToseaCxUTgBK5hmoEMn1QYbFyZAEdfLgc2N7IYVXA9sTuwYqGDg626Y4JCTNjhpImJbUR1OFjM6tFBZEYlGUqBsqlGHZQ8WEMMu6bDkurBxMNavw0jjatAyWoAVBocHdBg98U3YOFGRBo2rluiwFF0AK+SHwIUOSuAMG3YcVjDQNTIjFbCxVxzXYbk8CZqWwW15eu/APgh6RHFbCSTkSmOgcsjGzgLLBE9NsrRHh4GBjk1kPI/2bn+XziIG7pRMB+yDaeDnq+yDpyMIZnKNZgJ2xY+89CMdLtuahxVaP7JYh/HV4AmVx5+FFSKpVh1GUS8qIq2183SYyYPny/XwI7P6pvfp8LEHH9ZhUMrCCq6ArsYUfEENAT1bMgIu6Eu9Dt7c139Hh0sFHHKYwX8HJ7PeXQUbl7bX69B4ABzdooHLYQVnNTjDyU+AnkpEKl/+mA69LNjckcePwwpuDnzjvI2eLx92jCKGAc887hAC2IOh58iAqYiBOqXAL8PGvg/22TDA38QHIZOiIAC74QVwc/ga2TY4P66Pu33YWWGhDeF5C2ltgOcLzl58dB5CTfsgRCQwwZkPymOwMRxnUj/6Sx0uS4FHQ0Rya94DNueDui/eh6edyaVgQnvgliJsvHKsUofb7F4dtjwIOmcRKWwCA27z84dh4/c+Ah7zt1z/fR1+87OfhhWSn9ivw/qxx3RooH5YRMwAPF/oBIuIeAXw1PhGQoeBAyb2IhKUwD0cSVbrsGcHOJMiEsuN6NB0wExSRCZ7wUDchm6qmmtAKCK7ngSXI5rAb3BeGcwcYlUtOqwI+XxRIrVch4MT4KErFPF7hBmAzspAb4siUkbTdUHvoQEqKyKl8QMgDel/jLplOsyMD+twApYVMT0wRpgJ8C7jGWGdNshNC7+hlMpg/hP44MzbDnhblJARMGKBCsf3PgYrNPwheDH88J/8d9i4cBgUaTLW6HDBJZfBCu/58FU63FmN52DP7wSXw/rBeh3GC6CnEpGGFjA3g49z3+EXYYXUEJjQxmOgUxKRgovendF0wkFLEyJiOuDZL5fQSoiAFxwRiUdBhaoavPASj4I70+t9RIf2vX8EKxRvAZ1SpuFB2PiuJ/5Vh/3PXanDRWXwLItIavAVHUbyYAQ0HdwJxmveqcNcgJ/Qi275XdC4B4wdezd/Flaw8mjsmDwJG0crwauWkazVYab/FKxgoq7YRfePW8QvZVKc0JkTDbldLTClcQujuPKPnfmjrebkJ2GJiIiIiIiIiIiIZiH4HapzchF248aN53sXiIiIiIiIiIiIiKZlTi7CdnZ2nu9dICIiIiIiIiIiIsJe9UOt5uQi7BT44V4iIiIiIiIiIiKi2WOuLsK+ai2ZiIiIiIiIiIiIaHaaq4uwRERERERERERERLPK1D/c7+7uPjPnIiwRERERERERERHROWSf7x14o5xojQ6jFQ2wsYeO150cgI19A6xQu/lRHQZ+AVaIxtI6LBsx2NgwwL5ZVlSHkUgKVsiN7gL7Frg6rK1fASsU8uM6rEq3w8Zmqk6Hk4ee0aFtBLBCrLJFh54Z0WHZxWfYCNDfIngebjzeA/YthW4VJwErmDbI21bdCBsn69t0ODqW1WGQz8EKVrxWh7n+bTr0cv2wQuCDq2+gMywihumACl4ZFoYVQnJjJk1x4zdT2B546GRapqXDIKSGH4A707JABUGdj4h46HF2fdgW78Q5PMPoivroyf3jD/0ZLPAbsk+H2d8HdWt2rMO7UDiow2Vv+1XY+O3ve4cOn37gZR0mDz0HKyy++a06fPThLWDH/DysEE+CXrTkFWFjB90qeYmDzR3cCiu0X36rDlesXw0b9+w7oMNt/X06XPXRR2EFQT2/GwUj4G9+4S9hgeMv7tThKy9sgI0fXvaYDrM7duvQ3oafmVY0Oht2UodBEYyVIuIH4NqFPXSwDwxQGoR0uQ6q7Fu4hxe/hDYHKs+wlwCNTRP3YK4PBpRUtDKkMto31DfCflhEJtCUJuxkws35fkj3em7AM28Y+HJUp+p1eFXnf9Nh2amAFRYOjoDNXQUmHi998H/BCu2XX6XD0etBxygiJ9bep8OeBx7TYTB6A6xQvw10d6kmMNcSkdZ20Lvevv/jOvzXdf8DVvjQjb8N9mE7mLgmglOwQslFD52J37zKJTA/LGdBD+ZUgH0QEdMFc4xCdlKHfhF07yJSWVWtQ3eoFzZevvIyHc5719t0uOME7hD87Bd0GK9aBhtH4lU6dBqX6hCdBhGRgSM7dJg/+ZQOrfxRWME3QS9hW2DyLCIGmvKJATqreBy8yYqIFQFPbmbsCGycHTkEtjYO3g4MdKeJiNhg37wAzOIM9HIqIoEHXmfckDc4QTns4e0YPj+p6lYd1ret1GFmFD+hJ/c9psOlv7cfNp5YeLMOm65crMNkHX7G/6YZTCZP/gjcgSKSeKhRh42N4OjMgWFYoWYV6Eh7jw+CpsZ2WMGJgtde18A3vO+DrsZBt4qNlkdExEOV4XtozMKDWlUjWN9Iol5CRIxKcP/Ei2BRaGEM9ylfzYJ96/9voJ8RkdT2D+rw2r//qA6dNF6F6NsDxtDABLOUAK0piUj/nh/qcEUF3tz/z959x+dRnWnjv2fm6erFKrYly70XsEU1HUJLAslaJiYBUnZDspuym333DZtsypuekMqmLCEkBJIQZEMCoQcwYDA2NmAb997Vu/T0mfn9oXye1Y/7GiJhq1/fv8Tlw/3MM+WcM8fjUfjKS3To21ulw7JtYMNEpKcLnGwBB8+fiyaCce3I0WbQNIrOYRHDD2YI6R4wz5EU3oZwCJyuoVxwJYpI2gLLcYlu3NVAo/VJ2Lc80EtEREREREREREQ0EuhfZzVaF2EzXj35l+HeBCIiIiIiIiIiIiJPo3gRVq8oExEREREREREREY00o3gRloiIiIiIiIiIiGiEePXQPb0/6DepjuJFWL4WloiIiIiIiIiIiEa+UbwIm8HXwhIREREREREREdFIAN+hOroXYflaWCIiIiIiIiIiIhrhfMO9AaeHv3hh3/+0QkHYzJGwDo1EFDd20yjt0Zlrx2CFdLJbh7btwMauE9dhTrhAh1kls2AF6QEfl+93dWhOmIcrNO3XWW5pFf60svN0aNTX6dDvtMEKZtYE0DiQpcPOpnWwQii3VIeBnImwcTC7RId2AhxQO9oJK1jBXB0m3BBsHDXKddgZ3QfKJm1YIW0Wgm2LTANN0ZkmIm4KfBEn1YUbu2AzDDFgYw8DaNz/puAMPi1bMEBwVzguvpxPtcJAvvPgfeXTAG3cuhdehm3PXfx1HX7tve/R4Y3/dCusUPHN53S4+PzFsHH0ikM6fGSepcObH/4QrLCzEowdk677lA5P/GYTrJBy0Q4ywDaIiM9O6DAcBv1P8YWXwgptR5rANiyrhI2twBQddre/oEN3QgWskBcBA/HKj31UhzNW4FPirxdM0uH2FQ/AxoG9r4Gwcr4O3aM7cQW7QYdmFujJ3RQYOETEdZIw99Df69w08N+X+4M5OjTSYC4hImYIjF+2A7r9tJOCFZJp8O0MA5zDfn82rGChbZu68DLYOB4DO9kXACd8PIk3uGPH0zo0TXx92ehbD3AEPFXwhPDahlkzluhwwiUX6TB3Nv64ZTOe12Ht5k/oMNEN5nsi0toK+sDEqq/Bxk/e92Eduj3LdXjDzZfACk17j+rweP7FsLG/DEwFb/wdOKn+8LU5sEJw9nd02JZ/uQ4r8vEc7OSeZ3RomvjOy/WD2a8kwITN7j4OKwjqf1wrosOAiT5LJNEB9k/AxHPUrBLQP+8/DE6JQ+lWWKFqDjhdQxG8ba0nwR1K9OiboGkpuDREJBYH/Y8v3aJDF3cSEvCBu0iveaCdBDPw4iwwsY9MPBNWaGxGQ5J5EjZ24NFPd+jQMHGX4jjgtteIg2mDeAxJsLPKyQFjqHiMPj094CsHXNzDl846F5SdcYEOG9Y+Biu4Bjh2bgDfJeV379Bh2/PgDrfuUXzCJxLgDJwUDMDG/rnTQRgF+yc7Jx9WONYNTtfGI3t0GEqgoyxiFoHBI9UNtsGL6QNDdsrBkx/XAKeE6QMdQiiShyvkTtVhl4snJMkkqDxjIlhjuXfLBlih85/BTceiKNjDInLJ+efr8OD5T+jwsU3bYIWJUbB/wDqRx7Usgp+9tBpB1yoi2YfB6WresluHPTvAjY+ItPzl2zqcs6AaNu6cBNamuveBPWzE8RVqOOAuyUB9YCQbTJ5FZMJkcPQ7u/A6oW2Bfe/Pmdz3P1/e9o3eH+A7VEf3k7ArV64c7k0gIiIiIiIiIiIiejujexG2pqam94eXt31reLeEiIiIiIiIiIiIxjmvt6eO7kVY4WthiYiIiIiIiIiIaGTw+of7o34RloiIiIiIiIiIiGgYZV4Im/mH+28x6hdh+VpYIiIiIiIiIiIiGnZv80/2R/0iLF8LS0RERERERERERCPZqF+EFb4WloiIiIiIiIiIiIbb2/yTfd9QbsdgS7Yf6v0hNHEpbODYjg79eTNg43TPcR2GI0U6tOO5sIIbb9NhMIQb+wJBHRYUTgRlC6bCCkZ0hw4jVWBXRFN48T1Ueb4OW9rBfhCR+K4XdZhdOk+Hye5GWCFgpHRozbtGh+6xvbBCoqdFh74g3sNix0GYVaGzVMtuWCDVfUiH8YZN+OP2Pq8zs3A+2K5oPSzgdBwAqQHOYV8O+BYikmqu06EViOCPc9IgtBNgE8SAFQbJqX+YO7QfRxlwZ67f8QJsXPi59+mwteRBHc6++euwgv8lkB/buh02Pv70e0CFyV/R4dqP5cMK7U1RHTZ++AwdTt7/BVjB/uttOiyaCHoJEYnH2nXY/OZfdXggNgFWyHa7dTh7YQlsnDi3XIfB17J1aNtdsEJPDHQpu17aqMOXLr4FVvhI6Xmgwo2PwMZTV4NvVx+aosP4MbANIuK4oLuTKBi/XNeGFSDXowcyDHB9+MyADrNDYLeLSO7EhTqsmg1GYREpiPh12Hz8mA73H8QjYFPTPh0GTDCNDOZOhhVKA+Ar51/6QfxxDeD6SlngW+zdvQdWCMhLILVgWxEHTEhGsubWJh0+WguO3SdunQMrtE97Uoff+tVsHVZkFcMKoSDYm1VzcA92zbPg3F7+fy8CH2f8Gla4YEeBDm9Zswg2Drz/OR3+sQP0jakVeFIdvQA0ft8l5+hw1tmzYIVHPvO8DuGFLyI+C8zM84rB7C7tce9mBUFH0d4GZpjJnoOwgiTBpHrGhR+BbU8aVTo8+uAPdXjWyk/BCrlf+KwOX/3VBtg45nbq0N8IOiXpBC1FJJgAnbnPj3oEA5xpImKj/tlNoZsLkckTF+hw4sILdNjYhQcUuwHM4Q0fnsObNjiv/CY4qRwHf1zaSerQdcE47jWrzg3l6TBYtgQ2bqsHx84wwBmYtHHnfGL3KzrsagAbF/CDW2wRcQLgpt5NNePG7eAuOyggDAfx+WPml4EwC0/YYgfBVHnWUnCffvjNXbjC+rvAtjlgaULQwCoiCXQ77BoeUxo05U8kOnRopsGZJiIOuk+3fGEddpt4IO889CrYMH8O/jg/OPpb94K7bLcbf9xUC1yhEsGn6ytvggnJsTJw7Ba5DbCCEQHbZrtg2ywLn/AT8ifp0DcLdEoiMjEXdRRZ39PZLy4E9wsiUvU7MC3vcvCE9vhGMDO30jEdug6aq4tYbo8OC8rA+F4yZSas0B6q0mFHHbjPEpGgHxymZPvflm42Hb2/9wevF8LK2HgSlq+FJSIiIiIiIiIiomH09v9YfywswmbWmDOrzkREREREREREREQjxFhYhBW+FpaIiIiIiIiIiIiGz+rVq9/mT8fIIiwRERERERERERHREOv9p/l/9wnRMbIIm1lp5hsJiIiIiIiIiIiIaEQZI4uwwjcSEBERERERERER0XBYuXLl2zcYO4uwREREREREREREREMm84/ya2pq3r6lb/A3ZoisXLlyzZo1IrLp6P1XzroSN4p1gtC1YVsjUqxDyx/QYTB3IqzgxlpAWTcNG0eKF+gwewKo3BLzwwpOpFKH6VQKNPUVwAod3UkdhiOlsHG4KB9UqD+iQxvudpGYP1uHqV2v6NCfVwUrpFvadBjyW7CxPxsc0M72Zh0aTo9HhUId2nH8Nxmu64K0bYvOciadAyvEwuDjrJZNOgylGmCFTn9Ih+l0AjYWQRs8kHZGP/9/7yK4guER47KocH+/GQ0NfDzys8AJP+8IOF1Tgt90vvGnl+nwysPXwcZP/uO3dNiBelfbh3pRkZJPfkaHwUt+psODV8yFFc57DfTwZUvfBRsf2L1Ph60tu3RY0LQeVjj3/eBvZactCcPGG4u36bD8K5foMPXTXFjhyPO/AGW3bdZh6KNHYYWv3fO4Dh/56D2w8fL0uTrM+hJoXGDVwwqOAc5MJx1FbQfUC+LGIV9EhxUT5+hw6XkXwAoTFs0H6VJ8su2cACYk1npw0RU9+gSsULD3OR0WhsH50xAugxWObgMH9NDd34aNZywDl/OejeDcDjaDk0pEHF9chza+mmWAI9iggFvgeMxRDx9/U4dnzQAzqGNzy2GFT/2iVofBjTfrMLcUH9AJi8FFN+uiabDx5MvARGVJwxd0+KPf/wFWsIpn6dBeACZFInL3BvCtKw6hw5/qghVmhG8E4fe36/COnU/CClUuOKS5WWDyLCJ5c5fr0A6BKzTa1gQrpMPgK9txcEqYUdAbiMjkisU6nFAGJs8iYneBzZg2F1RI2fjiembdXh327APzZBEpantdh5ECMIbaLp7D500/W4ft9eDbJRq3wgpOHHzliQWTYOOqSz+gw7asKh0e2bobVjBNMEaYaGIvIqFAUIfBvMk67Go5ACv40cWRdkDquA6sYKO8vQmP7060Tocuukd2HXxb19MFTmO3/i4Qzv0IrOB17UOugb+1ZidbYe4kwE2rtOOjP3/Z+3SYXnSFDqMvPworBGywhx0bXx2QZYE9bzt4SOo/x471v7GN5mB21zHY2ECjqIlWG0TEDIKj7/rAlGZCEFdwu0/qMDsHD5dZ8Ar1d+vQMvNghUQK3BD5LLAwFcrFSze+XDBGxKL4cDx09zM63PPAP+iwaALuA8sWbtBhexL3YIaAbxcUsG1WGK+D5eVN1WFWJZgnn+jESzeppkM6zJ+yEDY20mDbek7+bULSn3+gP3aehP27681EREREREREREREQ2/sLMIKXwtLREREREREREREQyLzLoLVq/E/2exrTC3CZt6A+9QzHx7WDSEiIiIiIiIiIiL6mzG1CMs3EhAREREREREREdGQ6ec/zR9Ti7DCNxIQERERERERERHRIHv8ket7f8j80/y3N9YWYflGAiIiIiIiIiIiIhoa/fyn+WNtEZZvJCAiIiIiIiIiIqIh0P9/lO8b1O0YFitWrFizZo2IZE078y1/1H7imG4flBSs47Qd0mE4AFrmFEyAFdLhpTqMNRyEja1AEDS28nXYlrZhhXjrUR3aE6t02CgFuMKBB3XolM2Gja1YHHxcOqlDw8SnWSrRo8NQjqHDZHY53oZ4HQh9YE+KSMqxdJhOxHRoCNgGEXFNVDlYBBs7neD8MSywDd0nNsEKVhgcpgnVt+iwy8mFFWTnn3Xm79iBGwvYtqQN9o+4Lvz/cerBMMBOdlFlA22YiLgG+jskvG34Gsdl+9/UEz5/TrXp6eDx7by+NNi607HBuMbhpv0g/Nx1Ouwu/BiscN1roMOce7ASN/4K6Ird7Vt0uGXbcVihGf3uy9IXztNh6o4ErFDw7m/o0Pwh6EVFZJoNev5dHaCfmX3GMljhrGtAZ/56BRgWReTs1iodVp8FjtFt38FXaPJ8UCG3a7MOp1bNgRXOfbFTh+vOwD1YR+dOHU6yO3TomvhwmCb4Io7rwMb9N91jDF2ybLkOJ19xuQ5zryiFFf6zDgz6E/8EvrKItK5s1WHXpS/pMFU2E1aYtQGcrsEkOEZmfSOsUBVv0+GiZW+dqvWKX36NDte/slWHBWYaVhiQIe6KT53PAjOrwtISHf7oKD4cTetB77pg7xs6tHJDsMLuP27Q4clXL4SNO15+lw4/KTN0mBbcw1ekb9LhWbeBc1hEwuYfdfijvVU6vCnvH2GFuaEGHf7qYJYOnR0PwQrNk9+jQ1/rk7BxIAXOwbYoGA566sGGiUjABw700nkVOvQLnlTnzl6iwxNnglBE3lwDOvPcrmYdmptfhRUMNC0vz47gbcsHHWa0/aQOrRTolESkKwrG0Ghniw7NNK4QCoBts7PLYONtr+3SYWsKTDysdnxjWDDjAh2mDuMJbV5ung6TfnS7F/e47U12gbAL3cvA6bdIPAVuDN00qCAiYvR3up208ZBtRMHRdw1wlFN7QG8gIo6Ayl73gP3nekyqXfSVc0Jg4ioiLd3gixx74mEdhgTdqYkYPtRv2+DW2+cLwwoO3BVOFDb2cKo3RB470+s+FOSuDU5LEXHR+WMEweGwrG5YIatwqg7LFl8LG4crwES3p6lehx1HtsEKOeiWPCsfrEHZgparRHImgg0uqAKhiEgd+NbJunYdFl9xNiyw7419Oszd9TxsvPDqG3R44FC2DgsNPCWOFBTqMNkDurWi3BxYIYXuAnLL8SpfZ+L/Nwd78M5FvT+sRveG0Fh7Elb6vJHgoV8uGt4tISIiIiIiIiIiojFpQL+bagwuwvKNBERERERERERERDRyjMFFWBngOjQRERERERERERFRf7yDdxHIWF2E5RsJiIiIiIiIiIiIaJAM9BnQsbkIW1NTw4dhiYiIiIiIiIiIaDBkngHtp7G5CEtERERERERERER0emXeRTDQ30o1ZhdhMy9l4BsJiIiIiIiIiIiI6HR5B/8E33BddzA2ZSSoqalZs2aNiFRXrupNjLkf0s0iPrwSXVhSpMOcLAs09QVhhZ6kocNoVww2jjaf1GG8vUmHna31sEKga7cOLbdLh6lABazgix4EqWHDxrlVl+qwK5oCBZJt+OPQnjdNsNN8kQmwggHaSiQSgY3b2zp0mIp36tDpAcdCRExJgNTKwtvmREGY7tFhOtkNK4jhA9sQyAGbkFMJCwTzp4IKHn/z0n38VR3aPcd0GPaHYIVkGuwfV3APU5RdrMMZFXN0OLF8IqzQ0tqiw2gU7OGy0nJYYfY5Z+qw7RD4yiKyexe4vnYe2g42rLsRVjh1hoAz3msP97+CZYEzTURcx9Gh44Jw8MDvZnh843ThhTpc+p9fh41/Pf+XOvzIka/oML7+RVhh8fx8Ha6+DfxF6NJb/htWyL39WR0+05CEjQ88mafD2bf9WYdfvvf3sILvMhCWBl6GjYukQIcVx/fp8Mnm78IKt9/xiA7fXdWqw2BBIazgr6rS4dcmb4ONm+65T4ez763TYcBogBUMNPp4zJHwKViaN0mH53z0i7Dx9HeBvyHe1w0q/9x5ClYw/gzG9/L4TNi4shBsmzEPjK37T+6BFaZ3gk57waywDhNFeBQ+2gxCN4l35ob9T+owcO9fdFjo7IAVXAGzF9gHjmRePbzPBP12MFKiw8PpGbhCHByPQncXaOoxRpgmmv0GwTaISNIEHWZw2iU6TJXgIXvRbDCl6fo3MDSLyNrnntbhtI7/o8PffGQvrFC7f54OH7sN9D9Hs0HHKCJFh8GFMNsEE3sRSVnZOmw6eUKHEQGTHxG5/mMf06FxA5jw//7f0VEWMfeDeWBPNj4cYSetw4ICcOuUjIP5sIjYKTBpLCwEI52IxMHthUSPv6lDfxLfJfUkwKXktoPeI5yLv3KsE8wPTcsPG+MLwQeOcpbHbUvxrHNBgYLJsHHnMXAhNDeAk81p3QoruD3gZHMFTEjyI3jI7oqB+yzHo8t1XdA/w3DwGAa6Ixq8hRG0Jyx0rycijoUuBDwDR9eGiDjg2DkOuOjwfhjg/AcapAHXawtMuC5gBmBjx47r0PKDK9QM4UHNjYEZ5oTZ18LGxee8V4dNMdB7THf3wwrlJWDbGrrBwlTEBosbIlIwbZoOj0zEawhbHgXDhNkGpg0NJloeEYnsAANK1Sxwpy8iHUVzdZg6BDqrWZeCBSgRMcNgOmoHwNGvrwOHXkT8KbBG192Nx6+eJ/5LRDYdvb/3P2tra/kk7P/KvJohs4OIiIiIiIiIiIiI3rEVK1YMdAVWxvYiLH89FxEREREREREREQ27sbwIS0RERERERERERHTqMv/UPvObqAZkjC/CZnYK30hAREREREREREREp+Id/7N7/Dbo0c6AL2YmIiIiIiIiIiIiGqDM852Z30E1UGP8Sdi++DAsERERERERERERvWPv4Fdy9RqbT8JOmjSp73+2tLTE4/Hh2hgiIiIiIiIiIiIapZ6/c3rvD+/4XQQyVhdhjx8/3vc/V69e3fuosGFaurHTfgQWCU8I6DBUMkeHJ1sdWKGtrRF8XDIBG/e0tujQ7TihQ3/XAVjBTDaDj3NjOrSSHbCCGGD/iJOEbWNNO3ToukEQRutghZTp6jCUO1mHvryJsIL4s3QWTeINNl2w5w27GzRNd8EKDsyNNtg4u6BKh76cWTrsbjmMPy7aoENLbB3aXUdhhViiHWxD7nTYOFw4Q4dpE3xcCH01EUm1gEtpRn4ubDx1+dU6nH/1xTr0LQMnlYhMrQO50RTVYcmUCKwQmAGur7CBP67usVU6nPx78CruigOvwAqpdEqHzR2gl2jpaoIV0g6o4PX2FUNAbqJr3PTjY2Tb4FJyUz2wsQjoBuE2DBDoJXw+0DmLiLSs01njtz8I25b81y06TARAeOePt8AKtoDzp+rVH+uwc+1dsMLz7wVXQXdJGjYOJ0FnteL3T+mwQq27LAAAIABJREFUYDnuA6f41+ow1LYBNi55bLMOU3tBV3PxSdDPiEjlXY/ocJ97rQ7X1xfBCifv7NTh/J1LYOP1W5/QYTi9U4dOcACnJby8XHBW9ubgKjiwFWyDiLw+b74Ot728XofWM7thhYmLLtDh7FlTYePZV4HhclsEjDIXHALjlIicWQr2RVsK7Iva58GlISIdDz2pQ3/UY0LSASZFhSaYTrgOnoPJaeh/hp9XL2qjk62nG+yfUgccZRFxDXDsLJ8ffJaDOyXXBUOSxI6DUKSiqkKHRcsW6zAZzoMVFi0AQ/mPe0AvISJ5xo06fPDDr+nQ+DroOkTk5htf1OEfsr+rw8hTYD4sIlPmgFuGwuXvh403PfygDiea9Tr8wDXvghVm3gpmdytfv0OH6bWgrIhMCYEZVKQT3yWFCqfosKcFPPKSFcBXqJldrsMoHr4kywJz+JmLZ+qwqwdsmIjsXP8oSB2wwSnHo4t3wDaEIoWwbTivAKTZ4Cow/GFYIWqCyj2t+C7SMsFVE4hv1GEczSRFpGIC2LaSqQt1eKQF3TqJOIfA+CUuPqKuC+4vTsOkERbwHLLBHwzKtLW3MvqDNOxFRcQGIyAsYcCbd689jOY0cOriVTkSwLdU0SS4OxikPexVwYX73mMdA55sjg2uL7fnJKzgt0CFaDdeFuiqBwPx2e+u1mHyrBxYYeeRENiGDnDT2oDuyERk3S5wjDqfxPc4xtFjOkyc3K/DUMpjFA6DndncDkYZEUkeBCNgTmGpDluPgfUuEWnLAV1u88FdoGwcnxLZ0+bpMN6AJ7S93tmv5Oo1Ll5HkHlOeOMTVw3vlhAREREREREREdGocyqPwco4WYSVU95NRERERERERERENN5s+POFvT+841/J1Wu8LMJmnhbmw7BERERERERERETUfytWrHjHv5Kr13hZhBU+DEtERERERERERET9droeg5VxtQh76juLiIiIiIiIiIiIxptTfAxWxtUiLH89FxEREREREREREQ3Iafnn9eNoEVb4RgIiIiIiIiIiIiLqh8y7CDK/a+pU+E69xCiyevVqwzBEZOMTV1VXruoNA+f+K2wctcDOifVYOmzuaIcVjLYGHSZtGzZOtNfpMJho0qGVaoYVHLtLh6YJ1tktEx932zB06Bc/bGzF6nWYNsJgw1JtsIJjuDpMtEV1aHhssJU3VYfBvHLYOBgM6TBnQqUOm3Z77OFkK9gGdJ6IiKS6deYPgG2IFM2EBZKBLB2GfeAYpVNxWKG7C5w/gr6FiISnXa7DeGCpDlPxFlghJ5Kjw8nvugk2nnvRQh36KkCFhsJXYIUlpS/o8K92oQ7r3Gmwwqr0YR2evwec2CKy4PI/6/An59+iw4V78JtP2naC82pt7RM6dN74I6wg0qmjSCAbNnXNgA6jMXDsLHSuiohrgHMbdRIiIi64mk8DQ8DnpewkbGz5wAbXt5+Ajad85ns69BWW6bDqxutghbNPBnWYc+eXdfhv//J5WCH797frMOTHXW4oF1wdU76ySoduGJQVkX3bfqfDVxrBSSUiO2OgK75hCdiG4qc6YIWCi8GueP8nn9ThkmoweInIGcs+qcOSXxTDxtkH0jp0/OBUsdCJLSJpB1TwWeA68vvBSCci3XHwRRJbn4aNO+rANZNub9ThNPckrJDdAz4u20jAxscKQT5hIuhdz52TDyssMLfp8DPt4DzpeORSWKGsAPTPqbbNsHFWdIcOzTDYNjvt0SuJg0KvxqMOOH8M1EF7nO9ioucw0h69K94CG5xUfgv3YNHWwzostcHspegMPGSb6MRceGw5bLwqB8ygqnrAvvjxz0DHKCLZvwVDdvITYHxPPYz/WWJuGNwy7N55CDYuNcBQ9YkffEuH8y7HD9DcdPzbOuy8FfTPs+2jsIKVAkc/XLAENo41gis0lDdJh0beYliho/6gDifPWgAbX3bDRTpsKwIn2x+/sxZWCKD5T9AHenhD8J1apBTsilAkFzb254P7i+a6Azq0bdhTidkGzsC8ykWw8fTLwf7Z99eUDgsPPwYrVN/yOR2+cgjsn/odP4YVLAecP64LtsELnEgOrMseyFx0kAaDAZWFnbZX7qBv57r4dIXzZxdN1n0ed9nhHHA5J1zQrYmImwC3EvjLnfL9gmcBfCsykM9z0OlqgMmhiBhGRIfxHnyPLB1HdHag+xwdPnrwUVhg+ktgZmVPAwsL8gqYSYpIohsMB+F6vOhhd4PlgnD3Xh1GInjQzyqYpcPOOL5lKMwG41oyDbqUk6/iHizqA1MEXxys0eVMmQ0r+NGksev1X7wlOV3PdI6vJ2GFD8MSERERERERERHR29p09P7eH07LY7AyDhdhM7+eK7MriYiIiIiIiIiIiN7iND7NOe4WYWtqavgwLBEREREREREREUGn/TFYGYeLsMKHYYmIiIiIiIiIiOhtnd7nOMfjIiwfhiUiIiIiIiIiIiJtMB6DlfG5CCt9diIfhiUiIiIiIiIiIqK+TvsTnON0EVYGYVcSERERERERERHR6JV5XjPzOtPTxXd6y40iq1evNgxDRJ554OzzbtikG3TXNevQPXJch05+CfyIQE6BDitz8D4/cGi9Dq1Uiw4Nyw8riO3qzO8L69D1qJBjgW0LZk2AjbuTCZQ2go8zDVjBEJC7rq3DaMtOWCHQfUKHodzrYeO84mLQePpiHbY0t8EK0rhOZ06qE7a1U3EdGskeHWaVLYEVYj1gM8KT5ukwbeM9nDj+ug7NVDtsbKQ6dGi7WaCplQ0ruDl5OoxF0Xkisi+Yo8PH28EJ3/HMJFihYGlKhzOb7waflXcZrFA+CVzO77Ec2Hjq76M6/Mn0b+lw77mlsMIdZy7SYduJK3Xo2/88rDAlPFGHRl4ZbHy8pRWkMRA6dhJWcAUfOwhezoPE67McB/QeXlwfOH8WT6zQYdAGB05Emu78tA4DLzyrwyML0XUkMhd1uQFpgo2LTEuHj33vZR0+ee2ZsELHC+CEN+rwkBTaXaTDtReAypf/y0dhhao3wCVzzgtbdZh4FR/Q9y36Pzr8S/obsHGFcxJsw1m36PDQpntgBb8V0KFlBXVohvGwmEh06zDashc2NjtBd1cSBJV9eeBYiEj0yEYdHmwHw6KI5Pn+QYf73zdLh7NmPQor+Nr/osObLXAd/e7fz4EVsjdeo8OuP0yBjc3X7tOh3XUYNh6PwIxPYNfowpYijoDBDveuHr07rJyywSkhIrHuBh127gDTqglXgHmOiJxYeFiHnyrAJ/ylAmbg7n1f1qHPwl3umx3g69VtWabDObm4h+8xcnUYatoPG3/iP/9Fhxe8C3RrBc+Abk1Etvxgug4XHgFTPl8ETFBFJCsC5hjJBJi4iojbfRCkIdCLdhzbDisYXbt1WH3TtbDx/iVgsv3bp17SoW8bGGVEpCIE5q4umvIZqNsXjzuUYNFU2LjHAjcddvfzqCyedoZ9YDI5B8/4JGc5+HbmwbN0WDyjClZY21quw11P3KHDsm5w4ETENcC1b5n4eS8HfWsX9SkeHRg2lHPR08Krf3bR94bfzfX4yrACBCc/IpKQkA7T3Uc9yqCPcwflcHgXPeWPG0iBZBqc8EY36LRF5Nh20Fl1H6jX4ZTz8E2rzAKrNx1/eU2H4Sj+GuFsMCQlomDiKiJW8x4dRsJgG7KLwdAjIikfWBYoqASjjIh0NdbpMB0D45eN1rtEJKsL7Iqyipk6tAoKYYXmNjAt77VixYqamhqvP31nxu+TsMKHYYmIiIiIiIiIiEhERF66/29/7XraH4OVcb4Im3kz7PoHqod3S4iIiIiIiIiIiGjYDcZjsDLOF2GFD8MSERERERERERGNe4P6GKxwEZYPwxIREREREREREZEM2mOwwkVY4cOwRERERERERERE49hgPwYrXIQVPgxLREREREREREQ07g3eY7DCRdhefBiWiIiIiIiIiIhoHMo8Bpt5UnMw+Aav9CiyevVqwzBEZP0D1dWVq3rD7uxluqXVsQeEpgvL5k0Hj9YWXf1R2DgamgAqv1mrw5ajb8AKTsrSYdqO69DnC8EKVhbYhoI5F8HGbTs26dAIJEBZOwgruOkeHfrR3wsk7RSskIg1gcZNu2HjVNYZOowY4Nj5FlyKK2xN6tDq2AIbp5PtoEJ3vQ7tBNhpIuL48nXY1nBMh4GyhbCCNQGcw27rVtg4aYNdn2wBO9PnD8AKsVCpDre98jxsnNvk6LAuD+wKd9NBWCEw/3IdPj5rpg5T/lZY4V8LwIG+5z33wcZPZh3V4ct/OKzDac9lwQrfP/cFHV538e06PJn/CKxgHQJnYPeRvbBxqh1coaYfnFROCpyrImIYoEtxXXDgRAR2ggZsOjK46NrffwLszI0P4Cv0PWeBS+mxV9OgaTIHVgg64KSKRLJh45auRh02PvRFHVbVhmEF07V1aFv4ck77QWcV+B04h5/+88fxx1VN1eHd/wXGr08cuR9WSPaADXZuKIKNZ70MxtayqZN06KbA0CMiXYc36rCzC+wHSeNTQky/zsJhvMHBnHIdOj7Qe6RtsB9EJNUFJiSpdtxhOn+q0+G09g/r8MfXXg0rrDs7qsPvCNi2i+QuWOFi83EdWh1LYOOiCOjMg62wu8OdkjGie6BBgr6ygZ+3MFC37cKd6eJZLty/hsfH2ah5+57ndHjo4fNgBXNOgQ6XhV+DjR86904dbllwQIfpK8BlKyLPGODcXvgAuG8qXZgHK5g26Ciu/OBVsHFkeaEOi154rw4r7gWDu4jk77pChz7/izoM+vEY4aL+J+DHt4qRwgoddnWd1KHlb4MV5paU6NBfAGYpInLP2md16HwHDChTkzthBV8YnD92HGyba+IePpQDjpEvGIGNy6um67Cq4lYd1u3CB3TyfHAXWTpvGmz8QE+HDtMu+HZ7N70JKziH7tFhWXKbDgNhfP5Yvlwd+gzcD9tpcH+aQrd7aQdNq0QcB1yhI2Eu6uKtGCjYmfcz690O8Cdwy2IpMLiLiLSDAdc0vR7gG5zdfOpVPY4GPlUGcgLBGyIXLU2IiERbdBY2wX1ESd6HYIFdf31eh2YD+jh0cYlIV+FEsA17HoKNg1loscgPJrQdrQ2wgj8Mblo7bbwGZTfu12EgBIakvBx821I47WLwcTHQsnXvLljBaljb9z8H+xlNPgn7N3wYloiIiIiIiIiIaFzZdPR+EVmxYsWgPgYrXITNWL16de86bO+uJyIiIiIiIiIiojEssww4eL+PK4OLsP8rs7u5DktERERERERERDQeDOrv48rgIuz/qqmp4UsJiIiIiIiIiIiIxryhfAxWuAj7FnwYloiIiIiIiIiIaJwYmsdghYuwb8GHYYmIiIiIiIiIiMa21zd9vPeHwf59XBlchH2rzK7ftfPfh3dLiIiIiIiIiIiIaJAM5bOYhuu6Q/Zho0VNTc2aNWtEpLpy1Vv/zADL1sFkC6zTnejS4dwl74aNe265TYfTJzs69O/thhWe+frHdejETujQtCxYISuYq8Oc2dfAxidabR1ah2t16Fr4HCvKKQPbUDRFhy0tx2GFWHe9Dg3BH5edVaLDsks/o8O9HbCA+FvrdJgXBMdIRIzOgzps3PukDiP5U2GFqDUZlG3fBkKfH1bwF8zWYTAPlBURp/OQDq1ARIfpWBusEGs7AMqmYrCx2GmdmQ44M10D7+HA5HPAts24Vof1/nZYId0FrlBpRqFI96WGDs2CO3V43ZmtsMK3toPD9FQc7Mwvlk6DFTqP3qDDnI0TYOPsXbt0mB9/EzR18TFy3RQKPU54Aftn1HFR7+G3ArhxFAwHiUfBq2z233k3rDD/0b/q0AzjHixpg8MBd7rXoB4KF4EKufhks21Qxo41gI/racaf5yRAhdkf0eHBVfjvgxdf/Hsdzp5VDht37f2hDi9MFOow2Y330DM/f1aH9S/crkPDxBX8ftBhRvImwcZpF00nwjk6tA0frGCnUS/qD8PGxRVgOHDK5uuwLQB2mojM/yqY6nwp9Ssdrv75vbDCZ1sX6jDnxffAxsUp0GFmN4Jj5Nq4yx0bndLAoDmqgULx6ihcMLXzulMY0P41DNDc8Ofp0Il34k2bdJUO459VE3UREXnXZnDCP1gNLsb6nctghZk/Bz1YVhnqRe0orFAx5wIdLv74rbDxM2eBIXv9N8GtQcmji2GF8jw0VDWAS8bvx4NauARUrjwT7HYRaT4GZrmWC3aaiWb7IlIoYP5zdNlNsPGOp8HYOqWrSYeVVRWwwoEX79JhIAB2RU75Ilghf+IcHZZMB6GIzLzibB3uaQIXY+sL62CF4tngHN7chS/GvevA01vh/eDuqTwB7iNExDXBscuNgBvDUC4ehXPQ/jH8Idi4q+GwDmPt4Ka1B93riYhtJ2E+SOB+h32gV5dr4tyjJ8ZbAT7Qa1oOczjL9RwrBzTF7L+BjcwDao027pQ32DA9DqgJeg/HBteRiPisoA5TSdRh2njK55roQBvwK+OdBit43WWbvmz0ceAru0m8LGD48kEYLsbblgTjfnFplQ4Dc6+HFeobwHBgNe/UodPx1jDzGtKhXBflk7BA5mFYvhmWiIiIiIiIiIhozMgs99XWgkcJBw8XYbHMYeA6LBERERERERER0VgyZL+PK4OLsBh/QxcREREREREREdFYknnacuXKlUP80VyE9ZQ5GHwYloiIiIiIiIiIaGwY+sdghYuwb4MPwxIREREREREREY0NmecsM78OaihxEfbt8GFYIiIiIiIiIiKi0S6zuDdcz1xyEfbt9H0YluuwREREREREREREo9eKFSuG5TFYETFc1x2WDx5Fampq1qxZIyLVlau+9Muf6gZe+/DoruM6fOLnt8PGiWSPDi/7f/eApqu2wwr//WewpJ792d+CMLkDVjBMQ4eO68DGphsCjSWBysICMnXiQh3e8NUv6fDXv9kIK3TtfhRsWKoTf14qqrNg1gQdxvLAhomImVWqw+LJU2DjYDFoXL9lvQ473rwLf5wV1qFrp0AoNqwQCObqMKt8KWycPaVah0kbnBLicUpIKqazzuNbcdvGV3VYVjQVNJ0wG1ZoPAQqpKOtOjRSeP+kLbB/4FUgIlYSnVeuD7T8wB2wQuP1X9DhdUee1eEvmq6DFXJuB9tWZZyAjd0AuPAMf0CHdqodVoAMwftnLPMYJL/4ua/q8NrbwElV/rPPwQrFXwS9RHawHjbu/543TNznGiY4+q6Ac1hE3BQYkly4L4wBzCJMG34crnDhz9fqcO6NX4aNpwgYkiIuOBxPOXhP3v2jeTrM+cnjOsyTI7BCdt4kHboW2DARCYdADx+pAP1zYxO+QmPNB3Xoi+Ntm372+3R4qA0cjuT238EKV98D8r/mX6PDTb8Au11EgnXzdZizzw8bF3cd0GEodUiHjgsmHjLWO6v+X3WG4bUfQO4KGN8HtB+9psQhPzjhjZwqHVpuElaINoNz27Qt2LirCgyjn33m1yD8KZ7yzfopmNIEjEYduobHpAhZeO1/wnzP4vN02LEZTPjnzT8DVtj78AM6DOwHdwGuiTd49qQFOrRu+C5svOfhWh0WTgCT6qgDhh4RSR/fpMMOoxA2Lp9YocMz332xDh984kVYofDlH4JwQqUOc6dfACtMmrdIh1MvwZPqbQVpHdYfB7ui5znQ14lI/TP36TCvEdxHiIhjgY9zfCCcUIhm2iKhbLDnS8rB/smfgqflqaLpOjzRhvuPjkO7dJisB7cM8YbXYIVkvE2Hp97te3WtsK7fB8b3UCgPVoBXnZ2K48ao306hxq6DO0zXBfc+I2FYHLyFp4ENVWhDfBaakPjxAbUTYG7muuCiExGfCaZbkVzQrSUMPGlMdoCOwkAfZ3qsvNjolDgdK4EeOx4Vtiw8ZAeLQe8aj3aDD0s0wAqXfujzOqy+YI4Ob//Mv2aeraytrR36t8H24pOwfx9fSkBERERERERERDSqDcvv48rgIuzf1/elBO+9qmh4N4aIiIiIiIiIiIj6aXh/H1cGF2H7ZXgPEhEREREREREREQ3Uyuv/9iK42lrwRp2hxEXY/socKj4MS0RERERERERENFoM74sIenERtr/6vpSAiIiIiIiIiIiIRrLMY7Aj4d+4cxF2ADIHjA/DEhERERERERERjVgj50UEvbgIOzB8KQEREREREREREdGoMBJeRNDLN9wbMMr0vpRgzZo1IvL1j3+qN1y3/9Owcdtlh3W484PfgI1zf3BSh8fu/p4Ozy7/Mqxw1vW36/C5P87V4fS1R2EF1+jUoSEGbOwYcZhrpmHBPD87R4fZc8t1uPOX+G8L8t9ztg6nTMTr48mmXToszArosLHuAKxgmDEddte7sHFOQbYOI+ddp8O8ilmwQt2Ld6CNANdsquswrACPXAztBxFJJqKgQqgENA0VwAr+CMh9xQtg44KiUh3OqijUYVb5ZFihYxbYb34fONnWr30SVsiywHllGPhk86Oz2Iq16LBxza2wQtEDoMT+fwcX/tevnA8rfDHxLh32/LoKNs6y9+vQtZOwMeR17Y83rsdu2PDSRh2uTVygw+nGTlhhf+AMHea4jbCxYYLtcF0HhA4IRcRxQA/mBX4c3hNeOwhug5XWYWXxNNg4/tj9Ony94Guwse/KP+lwumzQ4XktT8MK33eX6zBtFeswJ4G7/WSiB2xYdi5sHHcjOmzavVWHjkcPbzqg055QijvM7hQYO3q6OnRYUTYFVmjc2KzD3bv/QYeRv7wOK8xJrtOh40/Bxq5pg8YG2PPjs6fq/3eGvcSA4NPdE960RBpMGkM9YAR0S8DUTkSkC/SNjg0uOhGJHF+jw+9f/o86LPxnPOCmF4PxPbAVTMyyQmA2KyLzpi/VoX/5FbBx2643dbig5nwdbv4F+GoiUhxvAqkJpzT4lGhqbwDhvT+GjX0mOC/aWraAltkTYQW7HUxHp08FO01EcqeBfunxn9+lw8KTj8MKgaBfhy46Xa0cMBcVkY4s0Ls+fwRPGt+ceEyHjpvQoS/VBitY+eDj7HbcYeZmg20uqlyiw7xKfMKXzV+ow9KZk3S4dT/4FiKy4/U9Oow21+GPKwb3F+Wzq3W4vxHPoETadQQ7qwGNEF6NA/6wDsOFM3RoB/F9aKoHHGhHWmFjJwV7NvT9PG5bxAVjKG7Yz3bvpEy/Z5ID2YyBDfkerQ00d03b4PoyHHyF4j3v8TXSDpj9drYdhluGPw19E9jU7veh9yrb+wcgQ0s6ruPxcWj32Gg/iIg/BjqKaz7wTzo8/6bLYIXyBaCjuGnKv/b+sOno324oRsKLCHrxSdgBW7lyZe8PmcNJREREREREREREI0FmyW5E/XonLsIOWN/f0MV1WCIiIiIiIiIiopFmxYoVI+cxWOEi7DuzevXqEbWUTkRERERERERERJknJjP/ln2E4CLsO8SXEhAREREREREREY0cfV9EMEJ+H1cGF2HfoZqamtra2t6fQ4HzhndjiIiIiIiIiIiISEbeiwh6cRH2nev7cliuwxIREREREREREQ2XOcai3h9G2osIenER9pTw5bBERERERERERETDK7MCOwJfRNDLN9wbMOqtXLlyzZo1IhIKnFdduarvH9027aRuP3vvB2EdY0ZAh/9zRbYO16/aBitcvR68nfbZFd/W4eGX58AKU1Ov6dD0GbCx49g6dFFLG7UUkWMnD+hw52Pg25nmZFihqxSEByQCG589ba4Op158sQ4PP38YVrC3PKxDy26GjQ9vfEaHxWddp8PCRfNgBWvqL0DZ+7+pQ9OshxXSLjggbrwNNg66aR3mF5TosLXpTVghkDcJVCipgo2LShfpsOz9F+kwUQE2TEQirqPDeBO4jo4fS8IKE176mQ7LF10JG8+pPkeHeaXFOqzfCq4jEdm3/hEdnrgDfNy9P14GK2Rfc7YOuxZmwcb+/bk6DPrAznRb3oAVxETXPjqpxjr8lV/Ztk6H1Z+v1uGWk3j4PyOxS4dWNjiHRSSZTnhuYP8YgjtzDH3pAR17+GGmAf7qt7B8Oqzgm3+xDi9ItcLGs00w0CQSLTrc8yauIEnQmRtRNKA4nbhAFHRKqVQcNnbNMPi4dEyHvgC4lkVEkh0663DzYNvoRjBDKChboMPJl9wIK7y+7nUd5q9/QYdFxjFYIR3CnTkET9eBncMkIt47DV7Og7h/0efFEuAcNo6vhQXCBdN0GO84AhtPnrpUh9PnzNfhwVfyYYW4ATqK3CnLdVjggG8hIrsOgksm+h94jnHJ9Z/R4WPHQbfv7t0JK5RWX6jDfBPsn93H8SyutadJh77uZ2HjQLhAh0svv0mHoXAQVojFwbR8YTW+Q9mXPVOH1WhCu/2RJ2GFpI3G0BjqRbe+BCs4WzfoMP+sD8HG7pFuHXbtA4N+YDvY7SJS4jTqMBgBu11ESmaAOWpkEri/sCI5sEJ00Wwdfq8NfGX7PjD5EZGJ9eDKnVRaBhvP/cB/63D9dnA743aD/SAi/iAYQ1PpKGp7Gjq2RApUTjXtA03Ng7CCGSrSod1dBxu7ktKhZYH5oSFg4iEi+N4bOU3d/qmW6f//7z0XhTNXXNjj40Dsunhfeuz5gXzcgDbtlLlo/5iGBRsHAmANKpHsOsVtOHPBZTBf9NnbdJh3KZg0XmC9CiucOwV0KSPzRQS9+CTsqer7UgL+ki4iIiIiIiIiIqKhlFmRG7ErsMJF2NOCLyUgIiIiIiIiIiIaepkV2Nra2uHdkrfHRdjTI7PQzodhiYiIiIiIiIiIhkBmIW7Evgo2g4uwp01muZ3rsERERERERERERENjJL8KNoOLsKdN35fDEhERERERERER0eDJPAe5cuXK4d2S/uAi7OmUeTksH4YlIiIiIiIiIiIaJKPoRQS9uAh7mvHlsERERERERERERIPHl3te7w+j4kUEvXzDvQFjUG1tbe9T0P/w/AvVlatQJqp1AAAgAElEQVTe8qdLw/j/unuWX4fOgRt0uPvKQljBOue9Ovzqr5/Q4Q/W7oQVUucd1KHPaYGNjX6HXnFTV70O3/jd/+jwgsv+DVZ4uvGYDs2mBti4e9FMHe6dUKDDk4cehRVyojEdBqKNsHGya78OndbtOpz2sf8HKxyeN1mH0errdBh8CnyWiFjpDh0aHofDTsdB41irDrNmXAkrBNrBeRXKL4aNDxzr0uHh7/1Wh0tvBFeBiOReCL7IU8vu0mGsPgEruAboANMn34CNK+Z8QIezr52ow5Mfq4AVzKc+qMPm/7hRh8VGN6wQfBz8nkfDtmFjF/XutpEGLb2uW9fFfzDOeF0yPQlwDr/64Pd1OKsnC1ZIB8FFZ4NDNFLAHeEKPk9CAfCtY8keHbacxD3YvKyoDiMLwUUnImvjc3X4vuZfgpZuEFYoKt2iw/TSd+vQ3fAqrCA2OKAOCkVEzEA/Q6d9NyxgWOAijzWAbyEivsgEkKbAGLF75wlYofkI6OGLDDAKuxbulLwuJRpUXv34UB8MA3ygibYiGMqFBVJJMAfz+n6pBGiclwemfL7dR2CFZVNydDhz1ed0+PSzh2CF6JY/67B8ajZsvLsJ9Ev+7z6kw6suOwdWKLpyuQ4ffxR8nHnk/8IKhg/sTL8f9VQi16z4qA5LvnCZDrc8h0fAs6eAcOuSl2Hjp391UocnloEZ+Iw1+JSwwuCLJNAsV2LtsILhAzuz6bkfw8b+pKPDCrdNh74Q3sOh4nk6DPtAKCL2ZHD0tzeBWYq7dw2sUHAI3D3NnQFONrMsD1bwRRbqsCgPNz6wrU6H/gNglMkvmwYr9HSAUyKN+hnPThAZ0MTXcdCtk4sfcbN70Nhq4OEyJwzungxfSIdd3eBuemzzHrwGMKzBAw3/f9MESzQiYjspVGFIh9b+fwsR8Vngi0Ry8U2rT0APlk6BObztek35wIWwfc8rsPESdDMbyvurDs+twj1Yr1HxIoJefBL29OPLYYmIiIiIiIiIiAZD5l+f19bWjooXEfTiIuyg4MthiYiIiIiIiIiITq9R9yrYDC7CDpbM49BchyUiIiIiIiIiIjpdRtGrYDO4CDtYampqamv/9gJHrsMSERERERERERGdit4VttG4AitchB1UfV8Oy3VYIiIiIiIiIiKidyaztjaKfhlXX1yEHVyZl8MK12GJiIiIiIiIiIgGbpT+Mq6+uAg76Ebp8jwREREREREREdGwG72/jKsvw3Xd4d6GsW/16tWZpdjqylWwzdYmnw5LLUeHYSsNK/hBAbl4yXwdTv7jP8MK3339HvBxH+uAjct61oLUNEB4yudYdqQI5u1WlQ6trgOwsS8rrMNA8Zk6jBXOhRWseJcO0/VbYWOz400dOk63DicVToEVqj70TR3ujOXqcO+Lf4YVSnfeCzYsgP/qxXbweaVZVgjmZWd/QoctnQnY2GeBzQgkm3Q4e8EcWCHyvst0+MvY73QY274ZVqjYeb0O/8ndCxuff8U5OnQ+VKnD6pM/ghV+sPl/dPin1zfpcLkvCSu8fMetYBuMFGwsxqled4agy5neHu4CB3AsRvJudwV8kaAPdwiBXHB1xOKgD5xZVAwrLP/K7TqsvwT0EiKSzHoZND72Sx0Wbt4JK/yxrUCHrXUf0WHxgxFYoaQRDIuBoB82TqfBleumozp07BisYJho1HfAtKG3NUxBZICxUjxGctcFMwQDf9ZpmAzQKIY6NtOwQGrh6wuWsFN4jjqjDMwcym/+hg4DIXyFFk0G061H3mjVYdc9X4UVQk6DDn25eMqXToM5WNXSa3SYKAMTexHZtgdMJwJbQaeUncATVzhtWDDlDNj26m9+W4d3nblDh4uOLoYVThwL6PDVA6/CxoHnQM9fGsrXYXLvs7CCXYdy1FcZ8LQUcV3U2rFhYxHQFbtoDxsG6sk9ctdjrm7lgRM+t7Jah1PPBKGIBM9cqMPXfODj4rUbYIVzp4CxIzgJzARE5KVXwGS7bOESHTZtXAcrpDeBybbjgjHUc1oFY49hCs5/cGUDfxxsXJxbDhsXzLtChwd3PK/DVMdh/HGDM5f0GsVH7szVg2mCy9mygjpMpfGdrOuCa3+I5/DwtAygbyEi+ZPBoodVNA82bjv2hg5z4id12JMAE3sRKSuYqMMTk98HG9dtBksZpTl49juqXwWbwSdhhwJfDktERERERERERDRQo/1VsBlchB0ifDksERERERERERFR/42BV8FmcBF26PR9ZJrrsERERERERERERF7G0gqscBF2iNXW1g73JhAREREREREREY1oY+OXcfXFRdghVVNTk1mH5cOwREREREREREREb9F3BXZU/zKuvrgIO9T4S7qIiIiIiIiIiIje3lhagRUuwg4L/pIuIiIiIiIiIiIiLbNWtnLlyuHdktPLcF13uLdhnKqpqVmzZk3vz9WVq9Jdx3WbwpwiHQb9IViwrh1UMA1Lh6v+5Wuwwhsfn6zDp14+BBsXfvK3Ooy4B3VoiAErQPB0NDwLgD8wxOdR2UaVwf7x+/Aezqr+rA5bjuyEjc26F8E22E3g4yw/rDDvzHfrcMlHbtXhutc6YYU9935Bh4H0YdgY7nvXdTwaA5YJ/lLHDU+FjfNyc3VYcPGndNh8GJ+BoWxQoeXQDh36usFpKSIrPgV25vyPRWDj0sAxHUakXYcd8TthhVteiupw3vI5OmyLh2GFrdeX6rBq2wOwcVHuBB02dzWitgMaBfDVOICLnDJQ1+Y1KI+IPYw2wjIDsK1rgY7UTSdQ1TSsUJIPhqSln/85bPzsdZt1eHDTn3QYf/McWMGZvFWH6YdydDjpGdDPiEhRPghtFx86N9kBtsGO6dDnwx2CnY6DCk4SNh4kBhyeOa8kxWN2h2ZxhscszgWzOK+zbc7Uah3mXPuvOkyeOxFW2NMCKif2NeiweNseWKFn8y90GO0B80DxmI5KAAz6aQd3KY4NJmw+G9waeI0mfgt05ssuXgUbn/HJj+rwxLmv6PC4gOmTiOw5Bo7R+RtAty8ieVOCOvzltx/WYcH6n8IK4gejDxxwvTswfBbDprhrHLSbbtMEw4SVPUmHuVXLYYW2yWfqMNXdpcMlM0BZETnhL9bhgQd/CRsXmT0gnQa2Lb7zOVgh1LVJh44LhkUv8KIzPI4/PHamCTor16MHm1k2TYdTr/sEbLz+JTDN6N56N/g4E8+g+j8Qn4Z7gBHMh7o1EXHRzMpJgxmUY4PbNxng+sYgMU1wDgeCebBxpGyxDvOrwIUvIlkFhTo8tnWdDjsPPwsrOAaaEyebYWPIlzt5jP0yrr74JOywGUsPVBMREREREREREZ2KsffLuPriIuxw4i/pIiIiIiIiIiIieqP9b0/djrFXwWZwEXY41dTUZNZh32gDD3gTERERERERERGNbWN+BVa4CDvsuA5LREREREREREQkY+6XcfWFXx1NQ2Py5MknTpzom7zRtu6MgguGa3uIiIiIiIiIiIiGUuYx2LH3y7j64pOwIw6fhyUiIiIiIiIiovFgnKzAChdhh9fKlSsn9REKhXpzrsMSEREREREREdHY1vdVsGN7BVZEDNd1h3sb6H/V1NSsWbNGRKorV4nI7GnzdJvyq26G/29dY0KHux75qQ7LpBlW+Md7fqPDxrM3wMY/PPiiDt2lW3SYFWiAFU6dx7nrdUobp1g4L1ygw3jRObBxIh4DW9CEdprhwAoFWUU6vOYTX9ThuZ+fAit8+NBxHUbO+y5sbNngMLkCtw3vHwPtYdfzcAD+vNk6TPvLYOPyCvCt537kYzrsqG6HFd7fAw7o5Yu2w8a+V+/VYU85aJkdmw8rpI7/SofL0206fPPARXgbfg++8pLsWbCxmV2ow851X9bh9FJcoaMHbFtLdxNs7OChBITwPKFRzPN4Wjpy3bQO/ZYf/v8hf1iHKz8DzmER6XrfYh2+kXdAh+tTh2GFzh+ADlNeaNHZ9MN4WMyZBHqwnoYdsLG4SRAa4K/GDQPsSRFxHVDBQaEM6LrzbIj+gHNI6h84GfCYNnjXUEx0yYhIIJCjw6xKMLb6r/4UrBDLApV9C8A2dHfid7vFf/QHHVr7wFxCRBwXzOENdyD7B12gcP84rg0LTCqo1OG8D/wHbJz17kU63LsE3EesCoH5sIickQjq8PFACjb+0dardLjg84+BDWs9BCtsPQTuUOCQNKBZ7mngVRVtxYAm1QZ666ARBJNDESk/5590OO0y8Iq85x59CVZI7wMjY1U+HpJyCsHcPmCDU6XMwqdEOg2OXVtHqw6zwlmwwp6Th1GFY7CxD01UXBfcJZ191SdhhblXXqbDp7fjw3/ovi+AbYjt0qFHF+h1/gCjblLudQ2YBvoqBu6f4bGDHcIIuW2B3zoSiOiweNr5sEJOJei0k6ULYeN9Bw6DbXgDDGpmdC+sYFrg1JxVeQZsvL+5cdPR+3t/HsO/jKsvPgk7smReP5w5EYmIiIiIiIiIiMaS8bYCK1yEHWlqampqa2t7f+Y6LBERERERERERjTH3v/6T3h/GzwqscBF2BOq7Dvu75780vBtDRERERERERER0uozPFVjhIuzIVFNTs2LFit6fuQ5LRERERERERERjzLhagRUuwo5Yq1ev5josERERERERERGNGZnHYDP/Cnz84CLsyMV1WCIiIiIiIiIiGhv6rsDW1NQM78YMPS7CjmhchyUiIiIiIiIiotFunK/Aiojhuu5wbwP9HTU1NWvWrOn9ubpyVZaRhs3Kzl6lQ2fZVTrcds//4Aqda3V46533wcZTrvqJDm96fq8Oc97bCitY4agOHceGjfvP64Q2cGPYHLbFqWngv8lwfXkg9efqzIke9vg4UPnCxZfq8IO/+SqsUC3P6TDwq1/Bxkt+2KRDO5zQoeM6sAJkeO0fVCTkD+vwustWwAqb33hVh8cS4OMuvfW/YIUF/9YDQvNPsHHR5j/rcGKdBZrmz4QV1n/6jzrcsCiowx8ti8AKLdF/02H5H8BOE5Fyq12HFee8V4cFhfjjIjkhHZ544jewsb+nRYc98W4dHm48ACvAa9fwuBhpWAyguxSxrIAOfT5wuqY95iHvOR+MXxd97VOw8fbKOh0WZz2qw/9avxlWaPzuIh1mbdivw3JnB6zgK5ihw3TbHtjYcVM6NAywO2eUzYYVDjQeAmXtOGzsfaDeaTuiU+YxYcMxHA48ZnG4sRUu1qE55TpYIXv+ch12LS7R4YkjG2EF/4sndFh8/HHYOOR06jCWjOkQTp9E8KXr0bniNDeUr8OcGZfAxgUf/pwOe64E3d0/lv0QVrh8E5ilOBUXwMbpsE+H/xIGM+0DU++FFZbNO1eHiQToMHcf2QkrdETB7cyAzsDTwKNq/2/nZyzGJ3zhcrAOsmFvvQ5z2xpghYuvrtZhVroDNq68ao4O1+aAyuFNZbBCsgdcCO3bjuhw7yZwvyAixp4/6NAfwLctiSi4S6qefb4O53/uK7DCT9a+rsPUky/AxhNan9ahge45PDuE8WdAN/XQqV+0A1yFALKC2bBC+bSzdRguA7ecMQG3byJy/DC4OmJd+Aq1ogd16ETBtNNrJSQLDShxK1tENh29v/c/x+0KrPBJ2FGh7/OwmbOWiIiIiIiIiIhohOMKbC8uwo4Ofddhnz8yvn55HBERERERERERjUaZFdgVK1aM5xVY4SLsKNJ3HZaIiIiIiIiIiGgkW3fiL70/rFixYvXq8f5MIRdhR5PMOiwfhiUiIiIiIiIiohErswJbW1vLFVjhIuyow3VYIiIiIiIiIiIayfo+AzvO30KQwUXY0YfrsERERERERERENDLxLQQQF2FHpZUrV/b+wHVYIiIiIiIiIiIaIbgC68VwXXe4t4HeidWrV2eWYqsrV3k1m1JYpMPUlV+Gjfe+9IwOgzt/Dhtfd/NtOgx/39HhHX99BFZI3bFch1M236ND20nDCiOBKwO4gs6dd5EOX9/3KmycSMV1mBXM1uGnv/QtWGHmJybo8Lf+KbDxz6bfrMMldUd0OG/mAljBtm0dHm08BBvHbXBMC3LLdLjytq/ACpd+eL0Oa4ru1uGimWfACuaMc3S4/6dgp4lIfMM/67CuEXzln7VGYYVgytDhEweadHj/vHxYIXLJJ3XY030FbDzpS/U6rMy3dFg1rRRWWHA92D8NoICIiK8ZXPvp4w063Po73KU0Hdumw+54FyjrpPBGDA5DwIGjv8swwH4zfWEdluSWwAorvvdTHUauBqeEiJx0O3R4Rgj0rt+7DwxeIrL2xU/rsOqhXTqsyEnACs3d4HL2+ttu1wWn8byKRTosveE/YYUXvnOTDo0AbCu2Azorntn0FgOa0owM+Cz2mWCsctDFaPhyYYVQ5SU6bAiBWUrs2D5YYXIJGFvDBaCCiHRuB3enThTOoAZwjOD4NaCjPKkQTxqXf+0uHT71rg067DTbYIXXGmM6jP3qm7CxGy7XYbgKHOXymbjCqm1zdXjk5U0gfPrbsILjgg0e4hmC95EDf1KWN0mH2QveDf//Ha1+HS6ZAqajl9x8GazwcjG4bTm8Bdy2iEhLITgrymeCCjsT7bBCybfRefXaH3RmpcB8WERmTZ2vw/pm3DjZcVyHWdPfpcNjxYthBdMG8+TAuq/BxmKBA8pFm14DugpO/Qr17jBhZdw47M/S4YK55+mwYsXHYYXuplYdtsd9Ojy27yis0Lr7OR0WWXhSHW0DRbqT4A7XCOE5vIhsOnp/7w9cgdX4JOxoVVNTU1tb2/tz5hQnIiIiIiIiIiIaelyBfXtchB3F3rIOy6VYIiIiIiIiIiIaelyB/bu4CDu69V2HFT4SS0REREREREREQ4srsP3BRdhRj+uwREREREREREQ0LLgC209chB0LuA5LRERERERERERDjCuw/cdF2DGC67BERERERERERDRkuAI7IFyEHTu4DktEREREREREREOAK7ADxUXYMYXrsERERERERERENKi4AvsO+IZ7A+g0612HXblyZe9/rtny0+rKVW9pU/zQ5+D/WxYs0mH7hd+AjR9+6D4dLt9SrsMv3/9jWMH90jwdfv2ys3VYHmiCFRxfGuZDyRAD5q64Oqy88DIdLvzK12GF39/yHh1GY5063PPsOlhh6opP6/AbiZdg4+bJ5+lwn32FDqecdRGsEJ11oQ4PPvYybOxs+R+wDS1HdPin2/EZOGHR3Tp8dssLOqwOLYYVCq/YrcMb/r0HNn5489X/H3v3HV9Vff4B/Dl3Zu9NCIQV9h4CIgLuPXKjqF1uWzvUVts6am2rbX8/rba1bq0D0dy462TIEBCRITNsCISEhOydO87vj/vr7W2ez0V2Qvi8X331BR+/eXJy7jnf871PDufqsCGnvw6vaW2AFTznt+iw/5kv6dC3F29DVUkvHZ5//jw4eMsbETpM/ODnOkw2wEElIk4POL829C6Dg/dlgW12TNuowzVThsMKSfeC4yd68f/qMC46GlawWx069PnxLOGwOXVY21ytw3ZvG6wQ7tynAL/pB6kXnAVVjWC3i8j6f83RYd60s+DgS6Pe0WHUliIdrmruASv4epTqMHL4FTqcOhMcqyLy9t0uHaKjUkTE4wNhfGyiDtfWRsEKhgl+j24I2u3U7cA1hqBJKdw8BStE2CN1mBybBitUNVTosNUDzvFwrBarDo0wN4jAKcVvohNJxBtm5gfaD8C4dc8CHcYL2ODYMBVSc6/SYdX+TXCw0Q6urQkxYM+3t+MVQgvK4ascfuEKZKf1hIMbnOBQ2VDu0eGUPnWwwr6WZ3SYciF4HyEi2//eqMONWzbr0Bj1Nayw9EpwSFTN2qfDOD++6Fut4F1zuDXGcVohwFNGRBw28HI0O8AFpXzDalihp5TrcNJNj+nwxSi8aMzeCN5FRtfjMzQvMUmHqyI36NBZEQsrOKvW63DkdLBWt0wA72VEpHj+NzqsXf8LONg0wPzTuPEtHcaeczqs0D73ITA4Og4Ormup1SEXnQHh98Nh7CE43VkMUMFi4EtSbESCDvOG4/fII2+4WYcthl2HpQZ4eyIinjhwOagvBRfc3D7NsMKI8+/V4acP/RQOlmYwb9tiwPqZHdgjwzthuyHeD0tERERERERERMccO7BHjE3Y7ol9WCIiIiIiIiIiOobYgT0abMJ2W4E+bH5+fuCv7MMSEREREREREdGRCXaWCgsL2YE9AmzCdmcul8vtdrMPS0RERERERERERyy0A+tygY9DoG/FJmz3xz4sEREREREREREdGXZgjwk2YU8J7MMSEREREREREdHhYgf2WGET9lQR2of9eOtrnbsxRERERERERETUxbEDewwZpml29jbQieNyuYqKigJ/Hpczs8N/tbTX6C+JiEyCpZrSpoG0Ya/Oott2wAozbrxHh8bM63T4p9GTYYU8Y50OfaYPDjbEgPlxYgo4s04be5EOr3v+l7DCpxmFOnz9lkwdZn7yMKzwm1dn6XD4DPAaiYj9ufd0+P2FD+qweNl9sELedDAdb9+xDQ5u3r5Gh4l183VoWvywgtMWocN+I87T4WmftsIKZW8+rsO9A7fDwZE9KnW4qtcPdei3eWEF0wCHRGvKJB1WTR4FKzTFV+iwz/gCOPj0a57Q4YUGePUXtPwIVshtHaDDXVIHB7+9DvxKL2IFOBn39FkOK3jeBhNFr6/adTh1QDSskNKnnw69tig4uGpHMRjcVK/D9qp9sMK+KrAza5oOwMHQCZ6Uwnw3nJomOO+O0waHW4VkJvbU4VnX3QIHG/eCcGb533R47gufwAq7Vj2iw6smXqPDz677CFaIHPKuDpNiwTEsIs2t4IKbEJWsw2rnYFjBWrdeh6YflJUTf7CdeuBF//ixGFYd+vH6B7/0idFgdTfs7O/qsF7iYYWtHz+mw/goPDguOkGHfrRt+2vKYIX6llod2gz808VExOqwoQXM8DarDVZobQcrh5g4sAbrN/lqWGFfNXg5PHiJKtIILjTe1gYdNu9fDQv4Wvfr8LBOfIsFXMdTU/Pg4MgzfqrDqJ+k63Bn1iJY4f7o53Q4tfIcOPiF03+uQ+MmcLAtvX4KrPDRinE6TH24tw5jip+BFdITsnRYXodXCBB8McJNHPDQtlmdcLA9IlGHfgsYPHD8hbBC79On6nB3dAb4XvH4Fq6W/uAMlaowa7Ccch06UzbrcEUjfhdw5cdn6nDIQPAjP//+HljBW/hbHcZ4wIaJSEwkmFJqneCQcGSMhRWSHY069OxYDAfvqdqlQ9i04aX94OC0JiJWG3grEe0E4YjTL4YVxl19qQ7L0+Lg4D37wAvlTwfrw43tbbBCa7VDh4OaQbg9Hi87y/8E1qgR6/8BB1vjenRI2IE9tngn7KmFzyUgIiIiIiIiIqKDWFEymx3YY45N2FMO+7BERERERERERAQFm0X5+fnswB5DbMKeitiHJSIiIiIiIiKiDkI7sG63mx3YY4hN2FOU2+0uLPz/R46G3mRORERERERERESnoA4d2M7dmO6HTdhTl8vlCvZhhbfEEhERERERERGdqtiBPd7YhD2ldejDLi/HnxlNRERERERERETd1araRYE/sAN7/LAJe6pzuVymaQYfEcs+LBERERERERHRqSPYgS0sLGQH9vgxTNPs7G2gLsHlchUVFQX+PC5nZjBPcxhwvNcercNqj12H0VExsILPmQrKlnymw8nvfggrPPt1oQ77PfgCHOw323VoCP7pjpO+GXk6HD3xTDg44v4rdLi95wM6fPHBTFjhV46zdJh/XwQcPHBHrQ7vGjBJh8VXwwKybN6dOkySNjg4oXmtDk2rX4dWqxVW8Pm9IDXAL5Yy4vH+2db/Wh02PhUPB8/vsUiHzxf+RYcv3fUDWCHH+yXath46rKgphxVqnCN0GBWNz6/EQVN1OPjJkTr8U9JbsIIP/ZIuQpLg4IKWXjr8+kCjDvNeHgUrtOzaqcNEq02HP/zhUFjBgi5nJb3QcSJiq3PqMKoBHGw11T5YYdeafTpc+L/goLJY8TzjN8EBf5gX5cOYwQwDDsYVTLRtYRztKsJqAa+yiPQfA+bAfhPPgIMzhvXXYc4VH+kwsfQPsMLVjz+qw5Sl4GRs7ZUDK/gqq3QYs3sFHGxUgykFvvqGGeY1MuCeP34XNfTt4LYdm03osqtT/OPB0yshKvnQ67Z7weXS6/PAwR645/2gggVdFkVk0ozv6DB26uU6/KoMzJYiYm4G1/GsWLDWEpF4f6UO21KH6HDlaw/CCoMz0nWYmDcaDvahl8ms2a/DHVtWwQrRTrDKzcroqcMNkeNghepKcI3wNtXgbxePlsQNoIK5fxms4PeBVdxhrXLhKWe3goW9iAw560c6bPg1mJ+3ZSyHFR5O/liHk5fgl2POExt0+M33wWvkjcOH6xMr79Lh8G+m6TC5ZAmsULHpXzr0tYHdfkxY0frHGYmnFIs9SoeDxp+rQ3PwDFghPQ8cgdUDm3X4ubUUVvBUxukwJgavoLw2MFHEpTylw6jIC2EFpx+8nfnmE4cOB36BF66pLdtB2dYDcHDNN+BwbXKCl2PavY/ACmvX1umw4pWb4eDG1gYdenxghg93jp/g9cHRC3PJP4yVQKQDvCFKSgSTtogMmwDeJU25ASw7y3LxbtsHXiLZaQFvfETks+YKHTqWgpW2pREvv8f2H6bDUh84v/zvgdlSRFo/u0eH1oj/OoaDTyEoLCzkx3AdV7wTlv6f2+0O3g/L58MSEREREREREXVjoZ/Tzg7sCcAmLP2H2+0OPiKWfVgiIiIiIiIiom4p9GO4TNNkB/YEYBOW/kvoR3WF/kqEiIiIiIiIiIi6gdAOLB8Ce8KwCUsdhfZhReTDba934sYQEREREREREdGxwg5sZ2ETlgCXy2WaZvARsezDEhERERERERGd7FZV/P/HoRcWFrIDe4KxCUthhX5UF/uwRERERNO5gJ0AACAASURBVEREREQnqVUVn4V2YPkQ2BOPTVg6GPZhiYiIiIiIiIhOasH2q7AD23lsnb0B1NW53W63211QUCAiH257fVzOzEA+5pLb9ODoTat02FxfAyv7/T4d1iaN1OH8Sy6EFZ7636d0+LfNu+DgDRNbddivciEYajFhhaO3vXyzDre9UwwHTzISdZiYe5MOI89bDCu8My9Zh1O9kXBwbvvTOjw3C4w8sArvn/rLtuqw76x6ONhn9+rQYXXq0ONvhxXgRhimX4fltaWwQszKR3UYO9KAg1/85m0dZl63TocNX82HFUrmgItcZopdh3HpeGY2t76rQ2ujAw5u/gqcjNa7rtDh3P+5BVaYmvwnHUZ+1QQHv/TKb3VYnwpe/Tl/zoMVdnru1qF17nk6bLfjI9AxfL8OZzjmwsEN2c069Ag4O96uHQ8rtE4CR2bcQPDtGn9xJ6xgNG7TYUSY+afNA2YwEx3w4eAjO4wwkyCILQb+bW6kPUqHTe2NOnTY8KTUtgecX3LJtXBwnQN8uy9rwGv3m0Rw4ovIOu+DOsx25eow76FKWGHYuBk6bB4yHA62W4bo0Lv5cx0OvOAaWGHN+6/oMMqBJwS7FUw18FW22fD847CDypt2rdfhiP5jYIWmZvDqh1NZW6FD+FOU1eyFFVLjMkAFG6gQDvyRoyJi4OCaxlodDj+/QIc+L1j8iEjtnt06bCwBy4Zw27avGsyB4yZMhRW82QN1uHn1Lh36G/F8AH8Qb84wODh5cJwOP/aDykmrLoIVzrkH7MzGeLBsEBHL9iodxg4Ci6K8HWBqFRF7VbkON3+9EQz96FlYQbxgUspyeuBYowXM0NWtLTr0meDiFaihI7xSCvP1cLjThvdwTRO4+tR/EKvDAwVgt4vIimSwK3aX7ICDV10MztzcOBA+uhkfgc6EHjpMHAfm4bp6cC6LiDVqpQ69bfg9jmGg3YxeD4vFCis4I8C7gOik3nBwQu5YHVbUtenw9CGgrIiszAIH24q2Azr0F+OLvt9TrcNqK16lxEiqDm2XTtRhZdsaWGHv9mgdWnPACxo/EVzHRSSvB8jXbMXTnX/1v3T4s788qMO/JuPjp/adPTr0NODjx2KDO/kw1nGHteQ7ema4ZeMhc1jBRQ1ex9MHjIMVhpw+WYcTv4vX8I3ozeX7GaAtMMAJLqwi8rd1q3Vo9V8KB6csBdOgpQy8pfrd/wyCFT6IfEeHzY+DH3lUOl7nrI1Ilv9+CGxBQQE7sJ2Fd8LStwv9qK4VJbODZy8REREREREREXVZHT6Gix3YTsQmLB2SQB82+GgC9mGJiIiIiIiIiLqyDh3Yzt0YYhOWDpXL5Qp9ROzTj43u3O0hIiIiIiIiIiLthUeHvvDo0MCf2YHtItiEpcPDPiwRERERERERUZcVbL+KSGFhITuwXQSbsHTY3G538BGxTz82mq1YIiIiIiIiIqKuIPQG2MLCQj4EtutgE5aORIdHxLIPS0RERERERETUuTo8goAd2C6FTVg6QnxELBERERERERFRV8CHwHZ9hmmanb0NdHJzuVxFRUWBP4/LmakH9LzwAfiFLS1tOmzf9KkOo+JTYAVHTKIOB589FQ4uTG/R4d4HntVh3p6FsILFDkKf3wcHHzeGjnLzn4RDd5pWHfY/byAc3P+SF3T46t9+rcN+62tghcXrf6TD4ZvWwcGxSck6rG/cr8OwcxTYE3iwAYeGYQr+dgN6jtBhwvAZOvzAhg4UkbpNX+swpwoMzhkyAVbYt36RDu1V+HAVC/hBxo69RIfT7/whLLB0wnYdtkQugYPvXPuMDjfNKtWhpw2fMkMePl2H2bWZOny/F94/PU2QZxgb4eD05gM6NLxNOrQeKIYVVucm6TC1DUxrk5YOhhX63gb28NiBOXBwQzvYb3vWz9NhW3sjrAD5wpxfpulHIdiGKEcMrNBv5Hk6PLBtpQ7zevWHFSravDrctmUpHJx15i906DzzLB3edytejDZecKMO51SBF3T+7Cthhf7JYMLs/aQHDs6cCn5zGdEEjsDkwdGwQokBtq3pn2CeEZEhF00Eg1vBqxwZh2cwSyIYXBJTp8P2l/bACp4BQ3TYWI/3T+XKtTocNqa3DnfMWwArOPoN12FkQhwcHBEBLpc9eieAkclOWKFtL9gVlWiu2tWCf+SUSvDtsprBhomIZ9tuHTqmZOuwth7fb1G+DmyG1QvCXZsrYYUdH7+ow7wzLoKDUyeP1eHr6zbosG9LD1gh6zqbDvfH4AXJbX0W67BGwOxR658CK7RUXqDDcg/YP9MaU2EFbwM4ZSp2g+NERPasAIuldR+8rMPEaHwMV9SU63BfzV40NtxbP7BYCreCgouliXcV6rBsPFiri8iS9nt1aCnDM/zV1/XS4euFYA70ZE6HFSJKRuqwTyVY2kWHOenq3gAb3H4AT7mGAc87sNPs1khYISapjw5zJ10OB0dng8G21DQdOrLx8fPhSHB1bl4Ur8NEIwtWiGgA1454A19QNvTfoUO7BeyKCt8nsELk3AwdOkrA4Try+/iQsJ35lA5n7MVL4iYbOPfnVbTqsKQRr3K9V4PjJ9a3BQ420GkH33Ie1nucwwKnCQNumYjD6tDhgGyw+s0YcRqskJrTU4eDzhmvwxhw1oqI1FrB6ndQHb79c3tqbx1+8GSRDuc3LIcVfGfE6vDSPDDti8h3UsBr5/E+rsNfvInXqBsywbvs3OvBNXRFyezgn/kIgi6Ld8LS0Qp9ROyKktmhZz4RERERERERER0/wT4MHwLbxbEJS8dAh0fEsg9LRERERERERHRchd4Jx4fAdn1swtKx0eERsezDEhEREREREREdJ6GNFz4E9qTAJiwdS+zDEhEREREREREdVx0eAssO7EmBTVg6xviIWCIiIiIiIiKi4yT0EQSmafIRBCcLNmHp2HO5XKZpBm+JffupQZ27PUREREREREREJ7sDZ93X4SGwnbs9dFjYhKXjJfTRBG8/NYitWCIiIiIiIiKiI3PgrPuCf+YjCE5Ghmmanb0N1J253e6CgoLgX8flzAz+uebe3+jxfZL76jD5/UWwuGGP0OH4M/Pg4LIDPh1+sXibDvcvfglWiPUWg22wGHBwlzizDPBbltxzHoBj29JBl3zJ8kId+tZthBXy/Dt1aFrBbheRmPhYHdY1V6GxeA+HSUFsmv4wFXANyBTwguYMPFeHlc1WWKFqzxYdxraX6NAKjmsRkZbIwTq01a/Do61gg9NiM3Q49Xt3wAJRl43X4ZrszXDwYu9KHY5selmHsZvBfhCR20el6rBHS5oO03YmwgqWuDN0WL9yFxwcOy4SpBX1OjMr9sIK/pxmEPYYocOvqt6CFR7tPVSH51a9AQev3w6Oq+X/+FCHlo14BvO2N6IYnx3i94IMhckxKbDAtOt/qcO8i8BBlZmAN+EfdXU63H3dg3Bwc9kqHVpisnUYP/I7sMJKO5jB7hl2tw535tphhSGD43Ro9E6Gg31JD+ow1jNchwkRc2CFs8ABKP6a1XDw7kQwuy5y3KbDhb61sEKarVqH1zV8oMNX54BpTUR2XfITHa5dg3fm8KYf6zBjzAYdLqxphxUuLQUH2/YaOFZ6DKnVYUnsdh1enQJCEZnvAYfrDPtCHS6u88AKYxLA4ZrivxAO9htv6zBOwCxaJviSPafpFh3Gt/TX4QclLbBCLzc4988cgQ/4D9bt0mHVoi90mLhjCaxgTQUT5vBLr4aDF9ywQIf5nv/R4W3pY2CFjZvn6XBkvxk69FjxHS0fRJ6tw1Qr3plPbpykw4IDuTrcuQofxJufuEmHfhOswWqa4FpL/Gix5LThFUlKv2k6nP6re3RYtA+vAxsiwSkTc0Y5HLypGCx1rNFgMeApwT/dhKzLdIjWjOKdDwtI3Rt/1KH/ADjHA7VRCBZmUU5w4RCRgWeAS5V9JDioRKRZHDrMHg0qr8gqhRXW79ujwxHZPcGGmXiDo9ucOqzYb4ODdyeBw3hF48c6TPl8CKzgeXGWDnMnX6HDW14aBiu49r+qw2WNT8LB5y+fqEPrzqk6HF82GlaoXvCYDn31eEkMj8xjAdRNj8+EQ00LeO1uevpZODghBUwUe9PAxS7Kj98lxVjARNozGUwp18z7FFa46yxwZK79O17SzIrpp8OHvgdW4NlOsPAQkTNbwM6MfPUhOHhpIliBXzb/YR3a+4DruIhk//0/e543wHYDvBOWji+XyxV8RKzw07qIiIiIiIiIiA5Z6MftsAN7UmMTlo67Do+I5ad1ERERERERERF9q9D+CR9BcLJjE5ZOELfbzVtiiYiIiIiIiIgORegNsKZpulyuzt0eOkpswtKJE3g0QfCW2G23DOzc7SEiIiIiIiIi6mrK7p5Wdvf/P4ObjyDoNtiEpRPK5XK53e7QPixbsUREREREREREAcH2q/ARBN0Lm7DUCTo8moB9WCIiIiIiIiI6xXW4AbawsJCPIOhO2ISlztHh07rYhyUiIiIiIiKiU1boDbCBRxCwA9vNGKZpdvY20CnN5XIVFRUF/3rFn9v0mJ7D7fBr08fU6HBliQEHT5V4He4uBb+H2FEJC8hX9/xYh2m+b/Bo42jPLFMOvQL+kXEahtUKdrLZCuviDTMNPyjrsMLBNvTtWtubw2/gkQu3J43D20OH/O3CvG5hvh0YbbXineb1+VBZzGq1hfkvHU0cdyHMJ9x6ow4rBkbCwX+2fqlDWwQ4nRMa58IKYz3zddgUEafD09NBWRGZYM/W4fhPo+DglvmLdVi7eb8OrZERsILp9eow7dYxOjQcGbCCeJ068w2eAMfenL1Nh2/ekqbD/ttzYYWI0nlgE+p3wMGmr12HabGpOrSFOdImXzJTh4N/fTYom/Q3WOGtBX/V4eMf42XoyH+AqdjrBIeKxcAvqNEOzi8xwRm2c0w+rOCMTARh/hA4+Ac3/I8Oc8xGHfau2AkrfN4EZo/owjCD68GumFMGjkxr/VWwgmNhExjsQzNQryxYwTcqWoe2jR44OHvwmTos67sHbENTmAkzAbyg/Yv7wcEJ5wzWYWV5lQ73tH8FK6SljNThzn1v6TA9+yxYof20JTocZS/SoYis2gV+dd0zzwGG1u2FFbJ6JelwyUJwOjcu6AUrTIm6WYdxfWPg4PXvf67DfhFgg62lS2GF2FhQOWrU+XDwgq836fCGm8Ge/031H2EFW1yODp+6YpYOX3lpNawQf/m5Opy6HbzKIvJkzj06vDUNnM4P/+x0WGFiOVhWebfO0WFDxRZYISEaHBJREfgaOvi6n+nws959dLg/FpxHInJ2HjjYlibgj+3d8hE4VCJ3g6nmpiumwwq7MtbrcMMOMAdGrwAXVhFpe+Z5sA3lH8HB8VHgclBRt0+H6T3BskFEbIOv0GF7fA842DkIHK4rvviXDpPGjIYVfvITsOIf4wQLj10C3nyJyOx2cLgu2DAZDv6RAyx1FuSCPbxpTAus0EdKdXjXJ4/qsCnnYlhh3ntrdDjfj/dP07rv6XBCT7AgKX7gl7BCYjM69w/njUiYtzO4RJ/0/jpMzh2qwwueuANW2JIJJore0Z/Cwc1+cDL2NcAKM6IeHJYi8vsXwcsx1/mIDu390JVOZOiQYh3+IGs4HOwRsNxKlWQdnrN9AazwvizU4e3rwGkrIhGPgDM0NxGczt7i10M/vZw3wHZXvBOWOlng0QTBW2Lfvht0JYiIiIiIiIiIup9ln10c7MDyEQTdG5uw1Pk6fFrX23c72YolIiIiIiIiou5t2Wf/uWWbjyDo9tiEpa6iw6d1sQ9LRERERERERN1VsAMbuAHW7XZ37vbQ8cYmLHUhLpeLjyYgIiIiIiIiom5s2WcXh3ZgeQPsKYJNWOpa+GgCIiIiIiIiIuquQh9BwBtgTylswlJX1OHRBE+cxwOViIiIiIiIiE5i5StuDb0B1jRN3gB7SmFvi7ool8t1xx13REREBP76xHkWtmKJiIiIiIiI6GRUvuLW4J8DjyDoxI2hTmGYptnZ20CEZWdnl5aWdgjH5cwM/jna4dBf9eTmv8FqD9Rs0WEfSdXh4Lh6WGGP7TUdvpTVAgcntK3SodVm16HX1w4rGGLo0BRwwsZGxMEKfnR2N7U1wMGHzmpYcW6x6dDr9xx6Zb/p1yHcD92GYRzGrxZMAfsn3BRuMcB+g3t4fN5kWCH/sd/qcFsvHxz8N/9KHbYuydChNwdXaLMf0KEjabcO+8WuhxVuS67U4YTtePDbW/bocHp1rA6jy7ywQtxisMEtSUN0GNGwE1aIGTFah470eDi4eMmnOryzd7MO9+eBH01Ezl69DaRoUhIRqQFFUnv20GGjBc8/DcXgkEifOE2Hj0/YCCtUPf+iDp3WkXBw8q6+OkxZ/qoOHRaw00TEi04leB752nAFOFd5JvwKjrWib1f5GDhlDnxQhCtsQXt+aTUcbLGAB/vE79uvQ1sEOAtEJLVxjQ79NnD9MszDmNYMP76g4Mq2GB2ed8vvYYXydHAyDhoeAQfvQLttxIg2Ha7Zg3+6tthWHbasABs8ZjKeUuaVgnx3v01wsDUSXMord4OTzp6RCStULwbzkr8R7Pbs1efCCpNvGarDNdvAVUZELowEh6stEZwGPfz4oh/VDrbtrVZ8/PTvAS40nxSjnVaxDla4YNIEHX4oz+mwcVEkrGAmgW/njM2Dg3MzwLerzZilw7Y6/HKMaumpw+Ff1+lwyEiw9BWR5Yv26tBYCGZREVnvHKHDvIvO0WHDZLwOnJO4RIf+7QlwsGMjOO/umD5Gh2avElihyvmhDuceAFfhhOXjYQX7ix+DwWHOr41Fd+lwWC9w/Sp3ZsMKLVG9ddjqxPunoqRYh0OmXqbDnz+BH/I2fReY4ZtXgOvX1VH4KtN+7g91GOUB87CI9Iv5RIfP3zFRh6fvS4MVBj4A1q6leY/qcMm7c2EFa8ZAHbbGDIaDq368T4eDN6LZw2yEFUwLnBvxdBfjBBdiuIa//w3cv5s/CqyfZ30JTsbew/D70N4pYNn51UY8OBW9C4heA94Lr21JhxUk4a86uzhqqg5vuOwLWMAnm3U4uhEvaSJ3g6uztw7sH5sHr1FtfwWL6rzl+HIQY60J/nlFyezgnwsLC3kD7KkJNE2IurLAzBXaiiUiIiIiIiIi6oJC26+8AfYUx3/fTV3X3r17zRDBT+uS/57FiIiIiIiIiIi6mg43wLIDe4pjE5ZOGoFP6wq2YleUzF6w7eXO3SQiIiIiIiIiog42lf4j2IHlZ3BRAJuwdDJxuVxutzv0llj2YYmIiIiIiIio69hU+o/gn3kDLAWxCUsnnw63xC7Y9jJbsURERERERETUuTaV/iPYgeUNsNQBm7B0UuItsURERERERETURYS2X4U3wBLCJiydxHhLLBERERERERF1rtD2K2+ApXAM0zQ7exuIjpbL5SoqKgr+dVzOTD2mcPc9Osx69nEdNk8uh99l18BJOtxpwYN3z3tXh39++gkdZi78hw5FxO9vh7nmsDph3qvHEJDmjIeDty5+RocpcWk6rGuuhhU8Pk+4LTxhDDE6exNOtHAzON4RKE2NzYBjZ977Bx1arkmAg9c7X9PhrG0pOuyfnAMr7NzaQ4fe0lod2lbjU6OxPxj8s+/jX8wkr16pw+19BurwSmsjrDBkZ5QO45pH6XDd7z+CFZIEzB4xk8+Dg5e+CPbwF2NtOvTO+i6scKkxTYfb5Qs4+OE1d+jwruo+OnzJUg8rtDy5UYfnjcvS4XuF82AFs3avDnuMnAEHl3padOgt3a3D1H3vwAqxTvCCWi1WHTa3NcEKw/qO1OGK4mVwsGGAs3HKH97X4ZtpO2GF2o1f69DyV7DbRSS7sViHDnszGuuHFWKjwbkfnzlIh14/npYyEmJ1GJ0MrjIiMuKSC3SY0CNRh56hXlhhfZVPh7vTV8PBke1gM65NWavDYm8yrDDeCl6maInUYZlvDqzwSevPdDhrBz47fBFgg1sqwEibB5wFItL+TrYO7eV2HfYZfT6sEDcoRoeeIXvgYG8rmKxGp4GzoLDuG1ih5T0ww+eefhYcvL8K/NQFfcHhWid46dKQuUaH85eCbbgkZzqsYO25WYfvF6MXScQaB3Zm+9Y6HZ42ZDSuYAFn7tiUNh2+UL8NVrA/nqrDwSvxKdNn1FgdGr3ydFh3IZxn5Csp1WH9XHw633ZFXx0mJ4OV9mizDFYo98/VYaX1ezpc2IRXKbvWgD3f5zUwtYrIuIm5OvzsA7Aza4rBholIUzs4Gf21+LVzXfcDHQ79BVhODPzLj2CF9/fN0mHJ7eCSPSwXXCtFZGniLTr8roFnsBvXgUMlufWnOvRVgFNDRHbEgFffaAFXwKaPwXVcRCzLwbmftw1M+yJitYA1huFAd7OFefuWFgd2pj0hEw5On1Sgw+RLJ+jwuYQ3YYX2XWAz+kRfrsP9yc/DCo5Fk3XYFo1P57boKh1OGw/eOP98AK7wzQFwURuYeLMOpzb/GFawlIP3py/n/xIOnr9zgw4/zANtgdiaBlgh1dfxYAt++lZAYWEh268UDu+Epe6gwy2xK0pmd5gHiYiIiIiIiIiOodDOA2+ApW/FJix1E/opsezDEhEREREREdExF3rvV35+Pp8AS4eCTVjqVnhLLBEREREREREdPx1ugHW73bwBlg4Fm7DU3fCWWCIiIiIiIiI65ngDLB0NNmGpe3K73aZpht4Sm2uAj0whIiIiIiIiIvpWu3beH/xzoP3KG2DpsLAJS91Z4OkEwb+yD0tEREREREREh2XXzvuDHVh+ABcdMTZhqZtzuVyht8TmGiPZiiUiIiIiIiKiQ6FvgO3EjaGTmmGaZmdvA9GJELgrtqioKJiMy5kJRz6UuBjmbbm1Orzk+6fBwWt67dfhiE2DdBhdHgsr+CtydDj4yS/BUHs9rJAYnQK+nTMGDu558c90uPbDZ3U4YPyFsEJyBvh2Kz/CD+RtOrBJh/0yB+rQbrPDClv2btShz/TpsN3bDiuIHJfZzxDjeJQNJ/zPAP6LYYBti3LgI3DchPN1eOUfb4eDl/V/Toezl7+jw5qe18IKSY59Otz6eZoOUx1nwAp9m3vrMLMZ76Fxk0C+sf8sHZ7tqIMVJtRX6jB5T5UObb5kWKH09T063LYehCKyetHnOtyHCsc+lAgrRI1N1eGICBsc/NLHe3X4zgbw6kemDYAV0kr76/C2aUN0+F4GLCC2LXEgXbIOjz6wXWdRNq8Oz714DCywd91mHeaOGw7KJuJZNH0YOJW++Ns8OPj9l/+uw0mDhurw8xtvgxUOvPaZDq17q+HgrEaw32wO8Or7Ww7ACjm5o3XoRJO2NQJPKdMvGafDlrwkOLi1GtwlUOMEM7x/FL5kF5s7dbho4VY42EwDP93Fw3bo8PGqRvztdr+lQ8vGNh1uLsFTyt0NTTqs7XMjHGw0g/PO5genTI8VvWGF1IgEHdobwLQ25ILJsEJtpFOHq7Nq4ODKZLAzWxeB1yhuYRSskDVqog5HDcDHT9aFxTosat2iw35OP6ywuxycuY59D+nwqvFgvSciz9aDSTt2SwEcnCQOHdZkgMticeEaWGHypeDK+GXlyzpsq0mHFdKdM0Doxgf8kP5gyVd7WrwOP9oJLqwikptyhQ6zM/AlO6I/eEEfi1qgQ2/zWlih756rdLi57H4dzjkHrIdFpKz0ch1+6gHXShEpux8c8BFfrNRhuq0UVmhvrNDhjVdeBwf3fxjszG2j83S4dFQJrLD3ZnDJvvXc83Q4wjwdVui5dZEO78/GS5pXfgRejuRscAWsMrbBClFPzdFhfL8JOrQV43cihgWsECLTwDs1EfG1gJfDYgWnbWYcXoPtTAbnl7kLzBIikjYW3FxZeu1g8O0skbBC/xzw3mdDW7MON8WshhVyP5ukw3RwGRcReSvzdR3ueekRHQ6LGwUrvPpT8Ga2z9ngbe8rS1phhRYUfnc3vvVqVBqYG6f0ARscoD+AK9xIokPBO2HpVMEP7CIiIiIiIiKib8UP4KLjgU1YOrUE7ocN/cAutmKJiIiIiIiIKEDfAMsnwNIxwSYsnXICt8SGfmAXW7FEREREREREp7gON8CapskbYOkYYhOWTlEdPrBL+HQCIiIiIiIiolMVnz9Axxv+RA6iU4Tb7Q79wK7/n3MTszt5s4iIiIiIiIjohOAHcNGJwTth6VSnP7Dr/G/wR50SERERERERUbcRYRvO5w/QCcMmLJGI+sCu87/Zy1YsERERERERUXcVYRse+AOfP0AnhmGaZmdvA1EX4na7CwoKQpNxOTMPMn5m37dh7u0NnvVRHuvVYcvEWFghY3WLDufYfDpcXvpTWGHYh9/o0O9vgIOhPpNu1mFlNdgwEcnoP0SHWZPGwMGrIp06nNFQqcNho1NghQPL1+lw14jhOlz/u6dwhY3v63BgT/BTiEhbe6sOt+4r1qHX74EVDn2yNcQ4xJEHEeabgTjSHgWH9h0wUYcTZ14LB6dc2EeHf7H8Soc7dqXCCtlDwWZs/bxZh4mJl8IKl41p1OGyevxynNM0VIe5vfaD0DkHVohvXaHDdE+mDtO2gwNbRGx1w3S4542P4OC33/wEDLaCFzSiIAJWeCK+rw6NwZfDwa1rd+vQ+V6WDvs3VcAK/b7zRx32nQBe/Zf2fQYrWMrBT5ezLwcOPu+0HiC8OE6HZpiTIz19gQ7/ZYJZtH0XmBhF5KrcMh3ueu5sOPiS31ypw34t4KASE08IbXbwIzuMejjYHpumQ38LOODDzT5nXny9Dn3ZYMr1NoEzUUQyzhihw+esO+Hgpl0gvzx9hg4/GI7fLNUuKNdh9MaecHCiDxxX2RcP0GGx8TtYoW5BLx22Vm4EQ21tsMLQnVfrMNI1BQ42msBi4LTLwKuf5YmBFXrsA1Puntw6HW5ZnAAr1HjBqVSHfzgZmAkGb80E1yrVswAAIABJREFUR2D8fHyNuLQA/MhVUWCDReSZuu06fLInWJit9G+GFb5oAE+mejoe3LyyRP4JKyQa43X4fNlZcHCpB6wxNlSCeTihEpx0ImJGgnPXGgl2Wt1+fJNB3CxwuUyOSYeD7SbYFU29wYI2LwVX+HLgHh0OjAGTtoh8b9x9OpzeMlqHsXPBjywiO564U4eDbgE7c9lpeJWb/2VvHTY9OxUOTtwFzoRMS6kOPehYFZHrZ96kw4G34Ev2olHguj/6TKsOt3x8Gazw43pwSXJur9KhWb0VVrj4syd0uOCLB+Dg2F1gdSdpYAWVf8ZIWGFbHThUfLu/0mHNziWwgt0B3olY7ZFwcEsdeO3MJrC6M624wrSrwZu11hnnwsHx2eBkrLa167CszzJYYWDcOzqcVXqeDn+Vgd+H3lS5TYdN8/4GB/e2363DiZdU6/DsptdghbnPbwBlV4PzaMJNGbDC1V+CF/SM58A8HIrPH6BOwTthif4LP7CLiIiIiIiIqFtaUTKbH8BFnYVNWCKgw9MJQqdpIiIiIiIiIjrphL6vD7RfXS5XJ24PnWrYhCXC9Ad2sRVLREREREREdNLpcAOsaZpsv9KJxyYs0cG43W4+nYCIiIiIiIjoZMTnD1DXAR5RT0QduN3uwAMKioqK5N992IN/YBcRERERERERdZYOd1AVFhby7lfqXLwTluiQBJ5OwAfFEhEREREREXVxoe/W+fwB6iLYhCU6DPpBsXd+3nbn522duElEREREREREFBB5/3Y+f4C6JsM0zc7eBqKTksvlCjydIKDD0wlabvxAf8kW6w9AoTC/CrHLZh22VqaBkRv6wAq2aqcOE7bthINTZStIDZ/Owk0ZhmnosPfYq+Dg5qh+OmxK7KnDqQWDYYX1KbU6bOgBfroNTaWwwhW7LtBh2ohqOFiqo3SWWgvC0q24Kb/G/YkOzS3v6dDu98AKVQ2VOmxub4SDIUPAa+SwRcDBOdlDdNj3LPzb48xRw3S4PS1Gh6+0v4U3zmbVmbN3gg6tzmZYIDsG7LfYyC1w8AD/WB3+OhIc3RFN62GF5VErQFm5SIc5FXiDHTV+HXqKnoeDty3fqMN5O1p0uLcX2JMi8lR/MNfY01+Dgw0HKGIWN+gw7Zt2WOHs6aN12BAHzvH1O8pghaat4Ee+7JLT4OCzbs/Q4RT7Bh22v/QmrGCueUeHHyeAeebNTHyOX3v7czp85t7vwsELXr9Zh4PrvtGhzYafHOWMSNShIyIWDk7sMUiHKX2H6zA6Eh8/xsDxOqyqA9eIqAgwz4jIrkZwSaqvwVOu3erQ4TnTUnT4SVINrOCze3W4bTe+Al7dDn66HSMqdLiyEW9wY91KHcY/CKaUtDAL75t+c40Oq4c3wcEpPjBvfy95uQ59lV/CCjZ7tg6f3HiPDv8c/RGscE5aug7P640nzPfqo3U4JRocbGfYwGkrIvEt5Tpsd4JtEJHcN1/SYdnAVh02pdthhfadYLrrvRvMogv64tcoswUcw49WVsHBn/V8QIeTBozSYZkTzBIisnshuGSb7eAssC0A+0FEEvaBJY1zDz5l0noNAOGkMTpsbMMTgmcaWL3kDiqGg78btVSHY95cp8N9hZ/DCoXl4PjZUQAmpXfje8AKLS/9WIfJdfh0TmrfpkN7NLhO5SbjGX7sgz/X4Y0bwVpLRF75HThrJvUER6AtDfzIIpJ8HviplxWDZWeBfRyskLbjVh0mrfkKDo5PTAKD+4PK+5vASklEPFsX6dDqByejv347rGAIeo/jx0uaCCc4O/KGTdFh/6vRez2RdTawJP4iB735EhnYA2xbahqYzG934FVuQgM4cx+MAO8i93h6wQrlC+fosG4NeJVFJH4FONgaVoLT1ufEU64Rgd6MDASnzMBpd8AK7X8+N/hnPn+AujjeCUt0hPh0AiIiIiIiIqJO1+H9OJ8/QF0Tm7BERy74oNhgwlYsERERERER0Qmj2698/gB1TWzCEh0tl8tlmmbog2JXlMxe/8Bh/CNxIiIiIiIiIjosS26v5uNf6SSCH0NDRIcrMNeHPih2/QONQx8CDwAiIiIiIiIioiO25Pb/PKg9Pz+/oKCADx+gro9NWKJjye12Bx5QEGjFBu6HZSuWiIiIiIiI6OiFtl9FJD8/n3e/0smCjyMgOsb0g2LXP9DIpxMQERERERERHbElt1d3uAGWj3+lkwubsETHhX5Q7PoHGtvv/VsnbhIRERERERHRSafqre+x/UrdgGGaZmdvA1E3F/qg2IBxOTODf65pi4Nf5fDU6rAiYbAO/e1tsEJOw2ow2OKAg00DPJzEZlboMC4qHlZw2CN02NreDAe3oNxigF8LeTxeWEGsIEuc8qAO95/VFxaILAMl7OdGwsFbDnytwwWX7dVhXHMJrBBTvU+Hf6/5uw575uAXtOLpbTosn/sBHDx2/BgdrlqxSocHag7ACiPGTNBhXUwyHFxpgrzBAw62nUYCrLDn6wU6HFDwHR1m9sWXraKyJ3QY6cev/swx5+jwiSHrdeiZD3aaiOz+eI4Oe585SodblpfCClHla3T4+pxlcHD8SKcOHel2Ha5Jb4cVPvQZOqzd9Xs4ODvhdB16E9Eps6UGVsj0tehw0LihOrRGRcEKhhP8yFfeHA0Hj4rcqcPoHWAWfXz0RFihfDSYA5+YAZ4s9tP9b8MKr44ZocPKD8bDwY554DTPs2/WYaQd75+o+GxQYcplcHBEYooOzWRQYdV28MKJSFIqOHMnjAOhH369yMImMMMPcILDUkQGpYGwchTYP7aqLFhhT9JGHa71lcHBk/fP0OHKFHDuJ+wFx7CIzF3+Ix1Gv3SWDq+/6gJYYdhtYFdk+r8PB7/f/IwO/a8N1+HvL78HVnj5rkd0uHwGOMcjr/sQVjhj2bU6HNOElzRXRILTuaAMnLaOPviA/98VYGZ7zYaXNL9cCS64m1f+Qoe2H+FLttWzW4c5peCQ2NB+Naxg6wWOTIuADRMRWw6YlxJ7leuw4m2w1hKRHB+4qLXWVevQv3QDrGCvAruib298fg27/jYdbgXbK8PPw3f8eAeCK+CNUTvg4L4rvwHf7k9P6XCB3QcrPDMOXC431oIrXfYLebBCUiwIeyXhw3V/yhk6bFz8Wx2aMfjb+R98WIc3O4bAwTu2N+kwsxiMfKgvOBNFZLANXJJWLr1BhyM2opdZJDqxpw4bvGiviciBlTrzRufq0NEKlr4iYjjBstPfUqnDnJ7grZOItNWBH+TOf70OByclg5XnD54Cp8zIlB6wQnk0mF1vvWYXHNzDVq/DcYteAxu28HlYoW7LFB32/unjOqzfDC6sIhL/h006HDR4EBx8oHixDs2GrTpsbcZrhBZrkg4TIv7rwA5+9Jbw8a90kuMzYYmOO/2ZXYGrSGgrloiIiIiIiIiC2H6lboZNWKITpMNndsm/ryj90m/p1O0iIiIiIiIi6kJC26/CT9+i7oLPhCU6cYKf2RX6rNht+5/Zth/8u0IiIiIiIiKiU8rWiuc73ADLx79St8EmLNGJFq4V24mbRERERERERNSJtlY8v7XiP8+6ZfuVuh82YYk6R7AVG0x4SywRERERERGdanT7tbCwkO1X6n74TFiizuRyuUzTDP3MrkAflg+KJSIiIiIiou4ttPcq/PQt6u7YhCXqfIFf8elW7OCkqzpzs4iIiIiIiIiOg7VVb4f+le1XOhUYpml29jYQ0X+EtmIDxuXMPPiXeBv24v9wOCe3afHr0GJYdZiV1h9WSOo7GoS98ODqsn06rKmu0qHdHgEr7Fv7rg4j7JE6rGuqgRUcdocOPaYTDj7t89k6/Ggj+CkGxfeCFb5OWK7Dvb1LwDYsbYEVSpat02He3ZfBwZZ91TpcNLQf2AZ5GFbY+c4bOjxvIv7V3T/j5+tw8/XROmwycIWKBf/UYawFHBJn3PAArLAqs68O64q3wcFTBufqMP+GBh1OXfZXWOGjt8DDQyLWNuowvsEHK3xR69VhXZinBC0/09Dhphi7Dqszx8EKnpiJINx7AA5OtVytw2t6TtahfRA+ZWb/4X0d/rDgDB1mjU3C2+AEP/KwASvhYOdfXtfhI4//BVSYFAMr/MA4W4dJ6yfpsC2iFVaILN4JBsckwsH9zK067JOUosOSFnz8pEaDuXH85d+Bg2MGD9fhivXNOty3sRhWGDkgTocTbhqqQ3fEDljBV5qqw7MH4Z25tRG8+qdnrNBho2yCFZ5tTNbhr2PBKSMin/vX6PDpZ8A1IioVnOMi0vwLUHl4Btg/fYYOgxWMUWN06L32Jjj4g8cH6jBzRoEOl435GFZ45YF7dJgRAX7k6zdfCytYKsCPHFmRAAe3TvLo0Ps5uAJmVeG1S0UiOAJzasE1QkRMG5iX4m2VOmxPPw9W2OcEm5FYVavDRnTaikh8VZkOnePwt6utBcsJWyLYmY5eGbBC+xowpfhawHIieR84j0Qky9Gkw3Mf/QccXOwB1yp/aZsOx14EC8iw7GU6HP7S2zoUkR2zXtThZ4PAGvW5niAUkc0bvwu+3RIwOKP3YFghO6eHDi298Om85uNPdNi29TUdGvG4QmkTWNC2XIkX1d5ycCn3poBX31iJV5iD9oHD1eIFK0kR8CqLiOkHp0xSfBYc3NQMNtgwwTuRAXlg6SIiGWnpOrzob7eBbUgCZUVk7KsP6tDyT/ym445rbtXhzNvW6jDaBEs7ESltA4vGQaX4213yCFiBn/VzsEbtlQ2u4yJy+7/AKdPzoyk6vGg8uJqISLSAQ2XbnnY4eP2r9+nQYcerl6DQz90Stl/pVMI7YYm6Fn1XbOAS9a2tWCIiIiIiIqIui+1XOsWxCUvUFbEVS0RERERERN0D269EwiYsUVfGViwRERERERGd1EI7sGy/0qmMTViiro6tWCIiIiIiIjrpsP1KFIpNWKKTA1uxREREREREdFJg+5VIYxOW6GTidrvdbndhYWGHVuyoRPB5l0REREREREQnEtuvROGwCUt0knG5XC6Xq0MrdnXNYmErloiIiIiIiDrDN2Wvhf6V7VcizTBNs7O3gYiOUIdWbMDBH1DgayqFuSl+HRpi6NBmscMKfQZM1mHGkHFwcL8pE3UYmZWow6ryZlghMytSh+uW7tZhcqQHVtj+L7cOK/ftgINbfGCq9HuadFjR6IUV+l35EPh26Tk6HHS5FVbY32++Dt1zl8DBm16ep8NZH63SYUIP8CqLSON98TrcePVf4eB7oiJ0+Hjhj3X41oc3wAoDaqfrsOnrD3WYbtkFK6RkDdJhxiU/g4N9mUk6vGAqGBnf57ewwo4nn9RhcXOrDgf0joEVlq+u1eGbvr5wsBk9QIdRY68HYU5vWMG/tUWHvjfwAX/BeQU6TLqwQofNFnAWiMisxUU6vOQz8Cpf8T9DYIXaGLCHE+eCUERmrgW7wv9cuQ5NB172xO8Fv5bOMbeCsrG9YAVr/Wbw7QwwtYrIoKFngnTUVTpb9/YTsMKUyafpcML118DBbfHgDH2lCsyuaVVRsMKoWJ8OM88r0+Fy40tYob8lU4e9HW/BwX9cW63DJ4aN0eHfZ/8eVljpA9eIM1Lxy9G+pkqHha+CycpZjW9fyHMc0KHpABe1ERPOgBWGf+dyHRaNWQgHby4H5137bhT+eSOs4EsAV8bEr8D+GRAPZioRmTz9fB3u3bQODm6pBodKcjSYG8e78mGFlW+/q8PY2Fg4eOBVV+uwOSZFh7Nnr4UVvGtf1+GoaZfosKEer1KiYsFPV7kfHGkiMmAYmOFLBZwyqxctghU8Vft02CMtQYcDh/aDFYacPkyH9We3wcH1XjCRfj9thQ6TzWRYoeX8s3X4aTNeQe2YDtZFc6PAcnS9+4ewwqAGcOampIBtyx0+GlYYee5YHf55ztdwcOIbj+jQMMAKwe/Da9QWay4ITTw/J1rBhGkxwbeLd+IlX1b/CTqMiQHnl20wuI6LSNmqxTrM6IOXNHU71+vwhtlg0ZiV2AArvPMKOIyb6sHx8/qk22GF6q/AAX/NuEvh4N/mgdVvyief6vAT73ZY4ZMDNTp8/+p/wsFNCz/SYZ+p4P1dlh2/KVv9XLQOoyZl6bD18t/ACvEmmLRtUXjKDQi99VXYfiUKj3fCEp3EAnfFCp8VS0RERERERCdWh/ariOTn5wc+zoSINDZhiboDfmwXERERERERnRj67lf599tSIgqHTVii7oOtWCIiIiIiIjp++PABoiPGJixRd8NWLBERERERER1bbL8SHSU2YYm6p3CtWBEZnYw/FYSIiIiIiIioA7ZfiY4JNmGJuhC3211YWCgiwc5p4Nk6R3yF061YEVlVtUjYiiUiIiIiIqKDWn3gX6F/ZfuV6GiwCUvdX6CzGdqFPPSnhuuvlePzgY8d+qRBgTDw/4WFhUfZipWQ9i5bsURERERERATp9is/d4voKBmmaXb2NhAdR+Gam3IIV5GDfK18W0u0w386mm8U6uivfLCtHO5xsd6mvToMN2lYLVYd9s4eDgcPmH6pDodPH6vD1P7xsEJdj0YdRjnrdJhj2wQr7PVl6zDbWgoHL9p0pg57eSw6XPbYq7BCTT3Y4NJNK3TY7vPCCtlTr9VhZP65cPCLvsd1GNX6tQ63DvDACv4Xl+rwjb21cPDW08GuuPDHn+vwy1UFsMLv7r9Rh0P6gcEl7udghT6OHTpM6jcNDq7cs1GHp3/3Dh2uy+wDK3y5+lkd+peX69BySQ9YwZsBzq/IWvzT2VP76bBNeukwcXhPWOGm0SU6fOSJKjh4UPPLOrz+2hgdlmTNghX+fC84th+88Ckd/sX+AqzQ+BrYmXH/3AwHN0fG6bB3UpoObT4wS4iIv71Zh/bWXWCkvwlWiEoAh4rNCXaaiMR6wKmUNvFqHa4s9cMK461gZpv+xD1w8A5Lqw4fmQNe5SFZP4AVyj9dosOZPzlNhzX9X4EVPvp4ng4r1oIXTkSmjwKHStzaBB2+N+uHsIK1CVyqbI14uvO2glc/z7FPh45IcKUTkfiUvuDb2SN1mNQDjBSRadeD6e7eyGI4OOpzMOX2cw4G385TDyucNilFh8mjfDp8N2o5rJBVOUyHhf5VcPDj3uk6nDBkkQ7flr/CChv3/UWHk2Oj4eAdreAy+nzNeh32vT8WVrh55gAdtvQFh6vTB14LEdmWfkCHW8LMP3vfTtehfz1agy3Di8A+g8Fya+T0CTqMScE/8oEZYIPjImrg4O9Yd+kwZcFHOvxq+SewwldbQOWVp+Pz6yM0Ddre/YMOR0bjPTz4rMt06DPsOtxYE2b/+MAqru3LBXBwVAu44FqatunQ31IJK2Sl99dhZjI4TkQk+2KwPqxvaNdhkwfv4bgocBj3OTNPh1vAYSIismdNtQ5v/AU+Q8978AYdRtin6HDsnWA/iMjX88HpnPUq2OCLLp0KKzRfBZbEZ279Phyc2+jQYenT4BpRUPddWCF1A5hyx75yJxy8eOutOnT+BLx2keAQFhFJtOxEMbosxuBFY4cnDwjbr0THDl43EHUPhmEcpLlZVFR08C7qwRujBQUF8FLkdrsDXxvK5XKFu251+Eb5+fmFhYXmv+Xn5wfu2z2UbT4UgS0pLCwMLbuiZLa+1hIREREREdEpQr8rzM/PN02THViiY4VNWOq2QpuVgYtHaGczkIfrabrd7tCnsnboigaHBZ7f2kFBQUHga/P/LfCNCgrATS6hHdjgFS50k9xut9vt7rDNR38VZCuWiIiIiIiIRL0TDL4FZvuV6NhiE5a6p9DmZmFhYYeLh9vtDu1p6i8P7a7qrmjwv+oebuCvwXZqhxaqbviGdmAPfoUL3WbYzz0CB2nFshtLRERERETUvcH2a4e3wER0rLAJS91TaHMz3L2uwT/r57eGNnD117pcrtCupf6+ukkaSA7yfIND6auGjjmGv5OErVgRWVEye3XV4mP1XYiIiIiIiKiLYPuV6MRjE5a6odAG5UGaleEaqaGN13BXoGA/FPZV9VfBOqHhoVzqQsfA7vDRCLRiOzxvQURWVy1mK5aIiIiIiKh7WF39xerqL4J/ZfuV6ISxdfYGEB17wQZluDZrwLfeTHqQL+/QPz36+1IP8Zp3zJ9IALdE/v3UhWCLOdCHHZUMPreUiIiIiIiIurjQxmvAtz4Tj4iOLd4JS93QQf7V/zH88oO0aPWVDF7bQhuph3hna/A5s8f7t5TwGQW8K5aIiIiIiOjkom99DX6KSSduFdEpyDBNs7O3gegYMwwj8Icj+83eIX558LO/QocFw8LCwmCf1O12B/qtumDwex3x1p4AHe6KDRqXM/Pbv7hlP4yjHFE6HDztWh0OnTIeVhh0fZwOT/ds0KG92tChiJgNLTpsW/cNHOxPzNWhp6JMh9asfrDC/J/8SIfPzuqhwxEHcKc7vrJNh5VljXDwgVXLdbhy+Wodzrj0fFhh9AO9dDgq+ks4uO+fntfhWwvn6ND16M2wwn2zn9HhX+qu1+HYqhtghYb6Kh2m1IPXSETsMUk6rFjzng4jzApYodk5UIetTbU6jPJUwgo2X7MODT++KFc7snTYZE0EQx0RsEJMfKoO268bAwdbanw6vP7uQTr8VNbCCuvvACej7GzVmXNnHawQ23ZAhzFOOFYcVq8Obb5qHUYk9YcV6hvB+WXUr0Njwc4RkZ7p4JBw9hoFB1fVgW+XEmfXYUS/SbDC8Kng5UjsGQkHb8wBB+E//vqKDq/PuBFWKHoL/Hpyxv9epcO5T38CK9SPXa9Dy7JoODh6Ub0OW2rKddg7uh1WcEbHgNQAe1hEzMYdOkzN6KvD+KwBsIIlPhuE0eAMtUSgDRPxR8TqcNwVYBtEZN/Yd3T499e26nB6j5/CClOGg5PxD4vf1WHWcwmwwvTbLtXhGxVgw0Tk3okX63DqkF/p8LlqNHWI3JYEJquSN1+Gg6/a0FOH30sDR2b+rfiQ2G5Hh7FnsM4enA/mGRGZMAAcEsUmvhzs/3SbDiev6KPDaTPAakREIjPBy1SRCc6O+JwaWOHSuC06TN36KhxcshUsBqIiwM58by44uUTkT1ZwsatrvA8O7h8H7jw4OytNh2lgbSgismC3Q4e+2iYdVi/7FFZIaATrwzFngQNbRMr3N+gwJRMsPBypmfjb9QE/3Sc78YK2rBa8duMMcNGf+kvwI4vIbVc8rsOL4i/S4eYSvChqWg3O/T+8g8/QYWc9qcNRt4NrxI05j8IKPaaBnfnIa3/UoWGCl15EvA3oHcpcfDr37neODlvqwOmcuB0fPxYLOOAtTrAOFBEDLTMshhWMjMyAFTro8HnL+fn5BQUFfOwAUWfh4wioOwvtjYb7TwfJD7ElGtqdDNyjWlRUVFBQELyHVPdqg/Lz84NfXlRUZBhGF7wuulyuwPYEW8wBgSv6IbViiYiIiIiI6ITo0HuVLnzHD9EphU1Y6m46tC+Dd6F2EGh36uvQ0X/gVbAPG9qvDHfNCw4OJsEvDPRwu9SVMrAxbMUSERERERF1QWy/EnVlbMJSdxauAxtQVFR0TD5TC37fwD/hD/z14He26j5scPPk388r6AoN2ezs7NLS0nD/NXixZzeWiIiIiIjoBOOTB4i6PjZhqTsLdmCDTcwOjzc9fn3Y4D/hPxTBO0wlzMeCBRuyXf/XmLwxloiIiIiI6MSAt76y/UrUNbEJS91chyuQfrxpUVFR4F7UztxKEQm50TV4Fy28PdYwjNBP/TphCgoK4LMaysrKRMTv94eGbMUSEREREREdP3zyANFJh01Y6ubC/Q7Q7XYH/qW/iHRKT/MgQu+ihbfHFhQUmCb+CPXj57HHHnvssccOPqbDjcb/eUZB6vTju3FERERERESnhq8rPw/9a1d4eB0RHQpLZ28A0XGUn59/kO5q4FolYZ4A0EUEHqFgmmZwawO6VNc4KPBsB721Kyrnr6ic31lbRUREREREdLL7uvLzwP+CSX5+fmFhYeA9YyduGBEdIuPE309HdFyFfsjVwf85RujHdoWeCME7ZA9+doR+oxNzHnX4nLGuf/J2uDE2KNxjCoYMm6hDT2szHJzYo5cOW5MH6/DSP+TCChd4inVYUbQMDv70L8/oMDl2uw4zep4BKzz9zlwdpieBkfVe/MoOSAa/NpvxzBA4uPC0p3RotPTW4Z4mA1Y4rzpLh4m92uHgtPivdJix/3Ud1pmbYYW+c8Bm/PDLRTp8PvIyWCGybArYsMocODimGRxX0TGxOqzbBF44EYmyg13ha6rQodkGQhExDT/MIac9Uoden0eH/nBVTZ/OrJFpcKzhBIfmkPxf6NB+GTgTRcQ34S4dvj7ArsNBVeBMFBFrXLwO42MS4eC2llodWpxxOmxta4EVfF4vSE0Qmm1VsEJaFjgZLfG94eADjeCAt/nAT5GUnQcr9B87WoenFQyEg3+47CMdnlEF/o3CF034gE969AUdRtlbdWgYaE+KONLB/Owf+304uHol+L1ddlQ9CJNiYAWfDZwy9WXb4OCEtJ4gjQRHYEwGPuBbGhp1aIkD51eDLQVW2L+/RoeTJ/WGg1+YskaHSS+A0zbpZjCTi0h0j7063LT0LzqsXTUJVsjKOFeHP74QT7ktvX6mw989sFiHzrN/DCvUPA8G58otcPDLL/XQ4cTyb3RoeiphBVm8Vme7LgIH/I0OcCaKyOn+aTpM2wLOAhGJ79ukw4hScGzvTwJHmohYHGDqH5u4S4d9N98JK9QnRetwz7z1cPDOHeBkvKsOzK4tTb+GFVLiJuvw5zOmwsFbosAFd+0eqw4d+/ENRuMGgPzLGnBZTNmC93BTBNg/cQ3VcDDciO0tYP+UL/gEVkgzwLYZUfgKWLUXzGyxrSC87Gf3wwqzPlunQ8tWsLTLki2wQsnQ7+nQk+aAg5tWgvMrevcGHaab4T4TGBzwJvo3vimZeA60W8GCxJmABze0g+tabRVBM7vhAAAgAElEQVTYNqsfv21x2pw6zM4dCgdv2QomK+GDX4m6C94JS91NaNf14L8PDL1iwZGHeEnrcNfnoXP926GPD/1eXf+3nYEbYwsLCzveGFsyWy8jiIiIiIiIKJR+65Sfn2+aZhf5XBMiOix8JizRETr6hxgcQYWu/CjbcEI/DE1Cfmp+eBcREREREZHGW1+JuiXeCUvd2cEvUaF3koaOPNw7W0MfEXBkDv1SGrrNR/99T7DAs4o63Bgb+NUub4wlIiIiIiLira9E3RibsNQNHWIXtbCw8OADDnKnauj174ivhUfwHIPQbT5Jr8FhP7yrZPY/P/xJZ20VERERERFRZ5k175ez5v0ytP0a+NCtQPu1EzeMiI4hNmGpGwreIlpUVHSQK1bo53eF5uHukIWO+IGwHbbkEDuq4bb5ZBRoxXa4MfafH/4k8L9O3DAiIiIiIqITI9B+Df41Pz+ft74SdVdswlI3FPoBVgUFBd/6oVt6QPDLYRvX7XYHm6FH80wAt9sd+o2+9eEJoQNOumcRhBPuxli2YomIiIiIqLsK9F47tF8LCwsDz3DrxA0jouOHH8xF3VNBQUFonzQ/Pz94JXO5XKHPGYAPJQj9/KuCgoLQj8AK/fL8/Pyj/OVk6HYWFRUZhhHsRQY2OFg/dJuP/vt2QYGfN/DQ2OAPG+jDXjvjj525ZURERERERMfIwh2vyY7//DXwBpCNV6JTgWGaZmdvA9Fx4Xa7v/V20dDm7OF++UG+9rAcynYej+/blXVoxQaNy5kZ/POE6x/WX+jMTtfhhkWb4XcpWz0PpE3lcPCCrVfqMGpNqw7vmzADVmgfauhw12V2HV5kjYIV7q1s1mGT509wcN19aTrc/+RHOlw/C38qmm3tCB0mRZ4FB6daxuowpdmqQ+feWljBv/BFHfp8STp8+fVPYIXbR6fqMHrBT+HgkbngpzPbwR5uqKmEFVqrS3Ror/4ClDW9sIIY4PprCDhOAv9Bi4wA+yciPhsW8Fgideit2QYHx6X216ElOkWHVbVgp4lIY1WpDsf+7lkdup+5H1YYVQX28LgLvg8Hr99Rr8OESL8Oa7YtgxVaanbrsN3brkPT0wgriIFepLCrLPhbcJ+O0vufCb8+dTiYas687jQ4uCgT7MyFz3ygw8g5+HBNqQSHSoynWIdDh58NK8T0HqzDsuZoODhnQE8dDprQC1TwgllUREr2g1d/z5ItcHB6LNjzPXPB+dWWCM6CcJvRtnGPDsuLN8IK8QkJOqyowwdb7R5wXesxbDIYiaY1Edm1fbEOzSpwHo0ZfQ6sYBkzQYdbar+Eg6ui1unQXgNe/bZNO2GFS8ffrsP4H4CrjIhM7/dnHX795DM6fDh3IKyw9P7VOoy9LEOHo0ZfBitIbj+d+eu+gWPr+4LVy54ksH9y9lfBCm3Na3X4xlZwsDU14XP8s7XgYPti+w/gYKstXofThzykw9E3lsEKnzaD5VbFF/h0HuIYpsN+EeAfdL5U+xyskLQgV4f5g0bqsNYE10oR8baAy0FJMZhaRcSLJn6zpUmH/sZqWKF2L5isUrP7wMHVjajyPnBIRETHwQqRrVt12O4FE2O4a1pUIlh7REbFwMFeDzgI/T6wh1PSe8AK0278jg4fehFc1Iw9eBXXs2quDu1OcGCLSGYuOFTGF8zUYWUZmEVFZOE/fx/4g/4s4vz8/IKCgu53ew3R/7V351GSXeWB4G9UlWqRVCVVaUOUltKChJBACLMvNrSbwZixdcARybA0bffM+Ay2x27haXPOzBnbTJ+x8cFA+7S7p3HTNh7axkRku7GNoW08YECYRWCLVRIgJLTLElpKpdqkypg/ovLVy7hfREZmxov197OPiPrivhs3Xtx4cd+X991HL2bCMrMajUaz2eyT3yzPb+21eZgKTEPNhDYajXa73TU/NzQ/P9KNRqPzNjv/LfZMMXApZ2MBAAAmVlf61dRXmFuSsMyyIr+ZsltaDfKb10kFlmdldratIhPaa/GBrtUJ5k2vRSRuuONDN/z6h1JKv/Dr8ZQZAACAMfrt/+vKrsj8zKoBQpKwzL4Npi+LWZkjMJ+Z1kGEK8amlH731y9KUrEAAMBkCHOvybkeIAkLTJFeyxR0UrEppV9+f7z4HQAAQKVMfQX6k4QFpk+vibHv/p+O39JKNhYAABiBt7+1+36Spr4CIUlYYFr1mhiblrOxUrEAAEAV8txrMvUV6EsSFph6ve7fVUyM/bG3/MMYmgUAAMyccOqr3Cuwqlq73R53GwCGKV+moPC8C95QPD7rDb+bFzjpnF1hnfdc/8U8uPm+b+fBXRdcEdbwY390Yx583UOfzYPnvv+usIbHr3w8D97yZ7eHhb/286flwdOf/U/z4JW1HwtruOJjNwTRh28JCz9491fz4EkvOTMP1s59eljDroOX5cFDn/h/8+B9Tz4R1nDrfQfy4HtPejQs/Mna2/Pgcx56U9CwHXGX2HrscB68f+nJPHjg0x8Na9h+8Ht5sHYgCKaU2kvBG9lU25wHt2w6KX65HafnwcObTg4L12q1PLjj1OADPZq2hTUceOj+PLj5SNC320vBa6WUNp8c9OFn/fBCWPgpz7omD55z8dl5cGl3/Jb/9MvBxPl7//B9eXDnI18Ia0hHgrfcTsfiwrF4V4Q2bwr+jn75f/e2sPDz/9lr8uBv/kXQM/fdFn+guy+9Kg8e+U5wlHjRc84Na/j2gTPy4NkXBp0qpfS0H92ZB//s3OA4/Pnf+2RYw+6PnpMHdz4Z7+E9p56aB9tbTwmq3RcfwR7dsikPPn5K8Onv/9Snwxr2nrw9qOGRfwwLb9l9Xh48eO93gpIH7wxrqC0dyoPbTt2dB598/MGwhmO1oMHHUnz82Xr0vqDwseDj2LL5SFjDyWcHv63P+JlfDQt/rPatPHjkiqN58ND+b4Q17Nz5tTz4C5denwcfuvXhsIbDNz+WB2/bHBy0U0rnnxHE//D2l+XBLVvjS3yOPP6MPLj1y8GX8fylq8MaTt7/gzx4wXnB9yil9KNveXke/L83fzko+tn4V3jbncFbPn1PMKkwpfTQI7fnwSPXfyUPXvbDrwtruO3WoG07oj68+UjcA7ce3p8Htz3+3bDwsQP35sHaE8FXqb0UdMuU0plnXJwHDz8Rt+1QOzhuHzsajFL2XR2MA1NK7X0vyYOP3nZzHtz/QPDWUkr7Lr0wD9717fj79cT+YDBw+tkX5cGHHwwOHSmlU3YE/WfXKTvy4EU/8tqwhnMuCH59vveVb4aFv/mJ9xePb7jjQ13PWnYAWBMzYYFZ02eZgs7IqZyKBQAA6CXPvaaU6vW63CuwVpKwwMzqdf+u4wOp3/rQj789mPcBAADMuQ/8px/Ng5YdADZCEhaYcX0mxn7st45fHisbCwAApCj9KvcKDIUkLDAvyvfvSj2ysde+J15vFAAAmGFh7jVZ8hUYHklYYO6Us7Fd9+/6s7cdv6mIbCwAAMy8X/25p+RBU1+BKkjCAvOr16KxSTYWAABml9wrMHqSsMC8KxaN7ZONfd7rrh9P4wAAgOHJ06+WHQBGo9Zut8fdBoDJEmZjO553wRv6b1t77W+E8Qe/8vmg8JHDefDUg/8Y1nD15efmwZ9tvTAsfPZbX5oHzzzvVUHRU/eENTz28T/Mg3tf94Kw8JO7X5YHj377xjz4m//+T8Ma9u7elAeveO6uPPj8n7o4rOHPP3lbHjz94h1h4b+688E8+NFo0vOdX3xrWMOrnvrKPPjyt/zTPPjBD34xrOHJu76XB7c+eTAs3L7rE3lwS/uRPLjz5DPDGs447xl58N57gzaklI4cfjQPLh0JXq6damEN23ZflgePHgh2+9LRB8IaarWg5h2nBJNWUkpLm7fnwTMueE4efPOH4w/0f/n0r+bBJ5eCndn+jWA/pJSe/uB3gsJPxO+uvfRkGM5DtR57OK62R/yHnx1012f/6b/Mg9d96U/CGs7/rXPy4DUvD774B4/Erfjb3//tPHjhyYfCwtt3BYe7x/e9JA9+7zufCmvY+0jwMW1vPxQW3nTs8SD6xGNR0ZPCGtpbd+fBpe178+Cxw3H/2ZyCA9Dmo/eFhWtbtgZtOLI/aEP7SFhD787S7dzd54XxrVu25cELLrw8LLw/Bfvtlu/dkgePPPLdsIZ//uu/lwdvbF8YFr7mhcHLvasdvFw6sBTWcOyCm/LgA+/+bB486SvB71RK6fSb78mDZ+27Oiz82I7T8uCLfvhH8uA5ZwfHupTS974e/AL+1BuelQc/90T8s3jnXUHwvpvij2PL04Nv6MG//nIefOyrwU5LKZ1+NKh506H7w8LtWvAN3bYl2BVPOfOisIZdT9mXB+8/EByHDx2OD0qv/fmfy4Mf/mhw2E8pPe2U4Gv+gle9KA/+6Y3xN/Huz/5lHjz1jg+HhTcFA6i04/RLgujJZ4c1HN4WfJU2bQm+Rwdu+7uwhm1Hgl3xlD3BMTCltHlv8Ou89dQzojYEx7qU0rPrP5EHP/K//89h4bIb7vhQHqzX63KvwMiYCQvQrc/c2GL0tmo2FgAAGK9euVfLDgCjJwkL0JNsLAAATB25V2ACScICrE42FgAAJpzcKzDJJGEB1qDIxnb+G2Rjf+dDz/+lYGk2AACgCnKvwFSQhAVYj2IJ/zwb+6XfOX5fCNlYAACoyP/x5lPzoNwrMLEkYQE2RDYWAABGJs+91uv1VBqWA0wmSViA4RgkG3vxS/949A0DAICp1vrIG5YfnAjKvQLTpdZut8fdBoDZlGdjC+u4i9cDF7wmD+6477th4XPPPScPXnXlhXnw7N/eF9bw5m1/lwe3/8Lvh4X/4198Pg+edPbmPPiKHzotrOH79xzOg49uDn6hdr4wuO4spXTPSUfy4HMuPiMs/MefuysPfvukWh78zA/eHNaw9SPBu7tm36V58BVvemNYwwtf/5Q8+NN/9d/Cwq/4xlV58Lv/8Pd5cPMtcaL/3DPOyoNXvuLasPCh7WfnwS98+oY8eOyBr4c1pAM35bGlY8FnVKvFfw9ut5+MCsevFg5mdp8SvOWHU9wlavvvzoNLu87PgwcvfVVYw4HbvpkH99QOhoW37Q925lI72j+px3tei1q0437uN9+fB9955tawhgf+9Yfz4D9//Vvy4I13Bx9cSulbnwh65vn3fyosnML91g7exdGdzwkr2Pb4zVG1R+OXi7Tbx6Jg/O5S9DHVoganFA+847I9CscvF5XbtCn+fu3ZGXzHX/2z/1sePHxq8GuSUjp/3+48+JFvxC93y58Fv4NP3xYch6+97q1hDfdsC347Pn7V18LCR/7j3jy4feFQHvy71/+bsIarNwcHikc37cmDL7zklLCGVzRemQePPT+oIaX07z4dtO31Lwm+jP/hu/eGNTz+vi/kwaftemYePLIp7lQvfdnlefCu2raw8N/8+3flwcseC46ie7fFX7rNO3blwSue/+Kw8IOnXZEH20eDnfbFP/8vYQ3/5OXX5MF7N+/LgztOj0cpm08POvyOo/vDwn975vY8eKB1fR48//b/Gtbw6CN35sFabVNY+OTtwc48WIveyOH7wxouOmdfHrz00mC3H73k+WEN13/843nwp3/5Z8PCH3jHr4TxXnot9prkXoEpZCYsQFX6zI0tBpTryMYCAMAMk3sFZpIkLEDlZGMBAKA/uVdgtknCAoxOMXxstVrNZjPMxiYJWQAA5obcKzAnJGEBxqDRaHRmxebZ2GR6LAAAs07uFZg3krAA41RkY5PFCgAAmGlh4jWlVK/XFxYWilExwEyShAWYFKssHbs8Zt330v88+rYBAMD6/Pz/eH4Yl3sF5ookLMDE6ZONTSndfv2bOw9kYwEAmEy9Eq9J7hWYV7V2uz3uNgCwinDp2EK+WMFjl78xL3bo7lvz4NnH7gzrvPyq5+TBZ770uWHh3f/irDx49OA/yYOn/ck9YQ0/uONwHjx4ylIevPQnzg5r+PEUDPQ/+IEbw8Jf2nIwD/5R7Wl5cOnWV4Y17Ppu0Ixzz39mHty3Z2dYwyVP35sHn35V/O6+9eqb8uAHPvjv8uCxv7o8rOHcb5+SB6/euzks/Ko3XpsH73xyTx78yJ9/Maxhy+3/kAdPOnJvHlx65OawhtQOPqOTtmyPC4dt2BS8u6WlY2Hho8eOBi+3eWsePHLkUFhDbWlTHmxvCvpwSinVwtFXFKzFFYRl11T4mZe9JA8+emW88smdW7flwVPuDj7QRx75QVjDQ7d8IQ+e8+RXw8LtFBwQainaw0vxHt6y5aQ8eOVlLwoLX/ma1+bBI/cEx8ZjPUbND993Xx6857Zb8uBDD8XHwCNPBP3q8NHHw8K1WrArdmwNvuP7Lro6rOFH3/Yv8+B9Z+3Og++/+66whq1fCb6h2w8Fuz2ldNVpQf956XN35cEHLo9rOHTx3+bB33r3DWHh7becmwcv+n7w7s7ae1FYw85dO/LgtW+5Ig/+2mf/Pqzhhc8Mfg52nH8gLPyRGz+TB3dff2YevOTU+Ah/9aXBsfHGB4Od+cCX44P25pOCw90PPWtfWHhrOzhg1k4NfuxOe/LRsIYvfTk4evzIK+N3d9ue4LP73B9/Og8+7ZzzwhrOv+C0PPiNTafmwQf/+hNhDVddui8PXvmTzwoL/+67/yAPXnjzR/PgM658cVjD/seD7/4ZZwZjrZTS3he8PA8unRWMMe4/KR6Q/Ld3vjcP/ouf+Yk8+Pn7gj2ZUnr4v6w4pPRacCDJvQJzz0xYgCnQdSOvZOlYAAAmRp/FXpMbbQGklCRhAabLgDfySnd86Omv/IuRtw4AgHnx1+89p9dTJr0C5CRhAaZV/6Vjb/7E8evIZGMBABiWXrlXk14B+pOEBZh65cFunpAtsrEppQuf8W9G2TAAAGbAO95+Wa+n5F4BBiQJCzBTihFweC+v73/rxJ0TJGQBAOijV+61k3i14ADAmkjCAsym/qvHpuWE7PdTet7lvzz65gEAMJn6515NegVYH0lYgNnXf3rsDbe8u3gsIQsAMIfuvLnnINBdtgCGotZut8fdBgDGIJweW/aCn/xUV2T/d74clrz44vPz4NLZV+XBQ4cOhzU896WX5MGvp9Py4Ne2XR/WcNY1F+bB79/+vrDwEwd25MHNRy/Ig4e+cGNYw67Pn5UHL3zai/Lg+T/03LCG9uOH8uDS7uAtp5SeuvRoHtz/zD158KbP3BrWULvvsTy4fc8ZYeFj996XB591cfCWH0mnhjV8+Wufy4O7j27Og0/+4J6whh1LQYNP33owLLyp/WQePG1n0LaLLr88rGHLrmBX3HPvw8FrpaWwhjtuDrrKocceDAsfOXBvUPMTwVteah8LawiddWbwPUopbTp5dx68985v5sHa0uNhDXsueEkefPjoyXlwadPWsIbHHrw7D556KP5+pVrwrreeFHxtd+8ODj4ppbP3BcefF77pTWHhh/YEffsDB27Pg7suit/d7b/2sTx4ze4fyoPnXXhmWMO2o4/kwQfvDr6JKaVnX703Dx4+/al58B8fOBLW8NR9waHm83cF39D2/rhLXPXioFOl0+LueuTZX82DH24F3/2d9wefRUrpwMf/Pg/u6bF/zty5KQ+eclqw55/5xp8Oa3hoS9DZvvNg8A191Wu2hzW86zN/nAcvPv3asPDLLgu+Sn/x+B15cOtn4t/QFx8JPo6T9gVd4vxLgp2TUmrtfygPPnfb6WHhbz30RB7c9P8Fvz4vffHFcQ13BF3l0APxAXPzIw/kwS07g7d8ycW7whpufCg4bh/4enD82ZHiU+M9Tw3GGFs3xz8HB/YHP1W3fy0Yvew5GB8Df+l3ggWjfuX3/iYsvPvrQc3Xvul/yIPffnhnHlx837PCapNJrwAVMBMWYE51TY9NWUL2i3/+is6DPBsLAMA06pN4TSa9AlRJEhZg3q26emyRjU0pXXHFu0bZNgAANug33hlc0FAw6RVgNCRhAThh1emxN930r4rHErIAAJNJ4hVg0kjCAhBYdXpsKiVkb7opveY1fzLK5gEA0OWbd/7blNI33/lvw2c7iVerDQCMiyQsAKsoz5LolZD9y788cQsICVkAgJHp5F5DEq8Ak0MSFoA1WGtC9tU/843RNAwAYH7c87HXp5Tu6fGs1QYAJpAkLADrNEhC9uN/cFXxWEIWAGDdOonXXiReASZcrd1uj7sNAMyUXgnZsudd8Ib1Vb79Bb8Yxq957kV5cMfuU8LC9246OQjeuj8P1nbGNezduZQH7966LQ/u/8btYQ1XvfDCPPjFj34pLPz8512ZB8+49NQ8+Mk/uiGs4fU//dw8+J8+cH1Y+NpfeX4efM8vvT0PPvuM14U1bD3jrDx48L++LQ8ubT8jrGHXxS/Lg/fdeVtY+F0f+D/z4K/+P1/Ng7/4ukvCGp6zEHx2/+oH38qD5516V1jD/ltfngfv+eLOsPBt7/jNPPhTr311Hvy7j380rGHLwe8EbXtK0KlSSlf/98HX7es3/yAP3ndr8JZTSkfu+Js82H7y0aBoLf4D/+YdwQe9dChoQ0ppqX00D568Nejwz3hxPazhaT9+bR785CeCnZZSOumKq/PgZ9/3jjy47bF/DGs456yz8+ATm3bkwR//X38prOHuh2t58OWv2R0Wvv7+Y3nwoXZwUHrxmZvDGv7o/uCNbL/hcB48dXPch3e9JDg2fu59fxAWfuorXpUH7/zd38+DF973zbCGrZuDrnLu3qvyYErpn70z+H7dlHblwd/57AfDGnb+7ZN5cM+Vz8mDd37tU2ENr7v2jXnwsl98Iiz8a+/4z3nwqQ+/OA9esutpYQ23nR3sn+1LwS/dkZvvDmt481uDOzh97E++HxY+v/GUoA1/E7Th0I03hzW88hXBzvzqdx8LCz98x3fz4J6D9+XBB37wSFjDGfueERS+6XNB0SeDb0FKaeuBm/LgT746OM6klP768p/Ig8f+w8+HhQdxwx0f6vOsxCvAFDETFoAhG2SGbPmMYt0JWQCA2TNI4tUyrwBTRxIWgApJyAIArEriFWDmScICMCISsgAABUsNAMwVSVgAxkBCFgCYQxKvAHPLjbkAmCCXXXbZnXfeefhwfGcMAIAZI/EKMCckYQGYUL1myAIATK9O1jVJvALMmU3jbgAAxFqtVqvVavdVr9eLM5lCs9nsv9UghlLJWCqv1+sV1X/dddft3bs3/6Q6n8IGK282m52PcihN7VJ0ko23s0vR7Coq79rbQ/xYm81m+eMbVrUdle7timpuL09K2Lt3b0U1V9G3q+gb7Sq7R7lL792797rrrhti5ZX26vZyx67oAFtUvsF6ykeksr1791bRtzuq+9HpVF5Rze3h/RaHv4n9K28tyz8sAGaYmbAAzIjifsHOaqrWarWazWbXJOV6vT7he77RaFTUwlartbCw0Gw2h37T6re97W3vfe97i38OcSd32jz0ajsajUanewx9n9Rqtc6DoY9gOzXv3bv3rrvuGmK1xX6ubicPveZiJw+35qLBqYL9XLxEquz28Z1dMeE3pi/v5OQi91EpekVFfQ+AmSEJCwCsUzkba0RRnfPOO+/uu+/uPK4iDzv0VGk5wzvcjlF1enfoycGKGlxdbjctt7mijH9K6brrrnvPe94zlJrpUl1qHgDYOElYAGCjWq2W6T+V6kpjDSujV93kvk4yqIrZwZ1saUXTP4eehK2otanKPZyG+o0uz82s1+umClbN0RgAJpYkLADAFOhaBWJuZ7p1EkxDf+/VLUfQbDbnM/OoxwIAlEnCAgBMDZcbV6S6Katzqzx9u6IZuwAAU2TTuBsAAMCgOrMLU0rl1QlgAjUajc5t4tvttgwsAICZsAAAzDszYQEAqJSZsAAAAAAAFZKEBQAAAACokCQsAAAAAECFJGEBAAAAACokCQvA2DQajVqt1rkfzoBarVaxVaHRaAx4L51em6/3HQAzol6v1+v1hYWFcTcEqNCIBx5GHQCU1drt9rjbAMCcajQai4uLKaVBfoxarVaz2eyUD616W/Pi5ULNZrP/eVHXs26hPnTlPbzq7i0KLywsrHpCu6aaAejS+Qlex4aDHKJHaZQDD6MOALq1AWBM1vRjNMiPWr1e77V5vV5fdfNmsxlu22w2883r9Xqv8iNTtGrwTXq9lz67bpDN1/sOVhh8fNKVCxi88LCaCtDLjB2ZOwb5DQ1N2lF3wB+OrsLreIMzOeoAYIMkYQEYj/IJxpoKd53wdJ2rhKcoXWm4cpk+NRfKBTrWdBZXnTWd6ocndQOeEHa93Dq27Wxe1r/+VataX7MnLR0AzJ4ZOzIP8ip9TNRRd2QDj1kddQCwQZYjAGDU8gv0+v8YtVqtYqHGXpf+levMa+v/bP/6O9sOHh+lYlW7QX7NB1wCr9cFkv0vq+y/bXhFZ2f9zXL58kv037Fd72XwC0LnbdhjhQem1FRf/D5jR+b8hdaUkJ2ETySNfOAxq6MOADZqXNlfAObNun+MBpkD0qdM+Uy+15ygYvN8WkqvDYtq+ze+OhuZ0dP1drrOqPPNRzapZ9WquoqttXCfYhuRz2WbkOuIB3/vVniYQ+vuty5+H7Dlayo8yUfmtb6vydGnq/TfcCMDj1kddQCwcQ7iAIzIxs+FBsy1dRUb5FSqfMoUVtvnFfs3vgp5eqJ/+UFSZv3L9N+Hg2w7YHyQN1XuD4PsgVXf+wb1yRat+opVX0c8eN6kqyVWeJh56+63VXfaQV6ljzF2yBk+Mq/6WhOrT1fpv+FGBh6zN+oAYFi29PllAoAhyk9QV72IsuoGFLouip/Ma/0GvGo1Vz7Z6/XWGo1GvV7vfCJdn0ur1Soi4QXC5W1znXhx6WVhYWFhcXExvxJ2fb2i16dW9WWw/T+UxcXFPt1p1euIFxYW1nQdcaPR6HPlb/+O3VXVqrftLrdkkGJMlHX32xF32o41JWTzQ03V5uHIPGviOScAABbmSURBVL3GO/CY9lEHAMM37iwwAHNqfXP0epVZdVJJGnh6Vzg3cxIuDFz3r/la90BXhaOc1LOmS2jL10T3Klzp7K0+rV31jVjhgXFZd7918Xso9TbghpN/ZB7w5SbfaAYea/1kJ3bUAcDQOYgDMB6DnwutaXm1Xqea6z4dKuLlly6aNMpLX+uZAXfggHugXLLrdQfZvNerrPVUv39ru056V90JqaRP49eh/NJht9xIjmnOV3igOhvpty5+D83JkXmKPpE+RjPwGPCTnfxRBwBDN8U/ogBMtTWd0fVPHPR5ts88oMHbUz5TKp9jj/dcaB2n+v2Xa5yQST39Xy5/lf7vbsDGr8MgNfcqM8rbtgzST8IkbK/3NUgZJta6++2I7zU0vSm/WT0yT+8nUjaCgccMjzoA2LhNCQAmXqvVKk5CFhYWarVaY1mtViuvi9e1tmC4Ut66X31xWUqpXq9PyyJuxa9+/4UXh7Kvcp1dt7CwUN5drVarsxZh+Sy0XD4NvHJfedJQ11PVfUBd76VXsfzddZSb2utDKdZq7LUf8g1XXcW1V4HiJRYWFnq1OTQtX4GUUqvV6hwuyqpeMnjSbKTfjqvTzrDpOjLPofUNPIw6AOjDjbkAmA6tVqs4P0zRSf7gtxJa96sXJ1er3klmGhW7tHz6PWDWJqyn2KpzM59ygm/AU8rOtmHlgzRmkPverE/5ytA+xVZ90T6bD+u2La1Wq/+Ng8o1NxqN4q31v5/PdOl1O6nFxcVarbbqoaPr2enNgwyl346g01I2gUfm+THGgcc8jDoA5pAkLADToXwiFOqcq1R3ltKZ/1JR5WNXfmvl/TysST2ds/3yGWyv8/xy0rDr/DYs37mXdxptcnCDrzX4JN8+JfMM9fryJl2JufL+z1+iq3nreLnR65WBLSwsLPTKpHSSIF2bNxqNKU2IbKTfTlSnnR+Tc2Tu1apBXmWd7ZsA4x14zPaoA2A+ScICMAXKaZTiIsri/KTIwS0uLlY6H3ZWde3eKnbgUCb1hPP4urK05X+GM8hmQCfP1ZU67L/Cw5ry1EX5/Ns0dfmUVqtV7gbljlfu9r2OG0X+pTxVsKO98qZn9LfWTkua4CPzNE6HXwcDDwCGThIWgEnXdSIUXoZZlFlYWJAcGVzXNJ9Kr0IdfFJPr6RhrzP/PknDqpV7YK+n+sSt8FC1Pg0uX2i8uLiYXz7f2VH5Lu3s/Km+3H6t/dbF7yM2mUfmuWLgAUAVJGEBmHS9ToTKytdQT3VyZGTy66ynKBXSq53lt7PqOgbrlk8ODa9XrdVq4S61wsPIlKfBhru90Wj0uXy+SK90xTv7Z+p2zkb6rYvfR2YqjszzMHPZwAOAKkjCAjDRBk+lhdMnV70r0XzKV8mcqKspwzPbonn5+f8YP+X+KwZWOl/SCg+rKqcOe+2cVTPO+YaT801Zt3H1Wxe/9zfhR+bCzGcbNzLwMOoAoI9N424AAAxH/7tnpIFTJ1ORXVq3zvlh1zSrdrs9gef561O8kdGkC8trhnb2ZLPZLL9iJ59V0at3MmUd/V+l6wLwcvP6lx/KFMix69MHyvttZr4Fqxpjvx28086VmT8yz6r+Aw+jDgC6mAkLwIzoSqasdarOPEy26ppm1XWfotC4JvXk04uKB+FJb/97slcqv91T53GxtxcXFyc/3zTeFR4qstYbkYXyz24q3vuqpqjfznyKaoqOzHTZyMBjHkYdAHSRhAVgBpVPhNaanlt1Ru2U6rrNyDquXh/wDLOKjEn5dXvdxb6ctF3HfYTWrdee7LMS6+hN0QoPk6Nz6FhYWCh/fMWF/NOeGZyKftsxG1nvXqb6yExZ8SkYdQDQiyQsADNi1RPXPidFM39Jcp8bPQ/LcCf1dCUNi3ivPELXJM2RXURfr9f7dJhwneKpU6R4pmtB2HUk4rs+puJGUgsLC13rOUzgvZLWZB767VSYuiMzXfoPGOZ51AFAyJqwAEy0VadAFnpliAavId92NpTvEb+O8/y17pNxTeoJlzEd7wca7opxJe/yZWFXXeFhNA2ryFAS8a1Wq7MfFpel6c/ArirvD7P9fsdlTo7M02iDAw+jDgB6kYQFYNKVk0e9TlPL5zn5qWb/GspnwjN5mlpkozaYPBrxpJ6u2wR1HgzS/iJZVpHBp1iuuojqGG/bMsgKD50Ho1/hYaJ0JlbXlzWbzSl9+8Pqt+41NCxTemSeExsceMz5qAOAXiRhAZh05ROYznp5Xfmj8k2lw8tsu2ro2rx8o/CZPE3d4MneuCb1dCUBVxWeJ09pvqxj6Cs8FI8bjUY5ARSWH9cKDxOoc8zpmMlDxBC5+H1wU3pknhMbHHjM+agDgF6sCQvAFGg2m+WUXK/z/D7zico19Lr4eqoTdr2U31Sz2Rwwlda1K8prRIY3i69iUk9+arrWPMII8g79b4nTK0syLbdtKdo5OSs8MBTr6LfT0mmnxfQemefHBgceczvqAKCfNgCMQzmVs45NcvV6vf/mnWuK17ftBBpwB64vZZbXU3622WyG9Q99N3Y1ftX611p+4w3r/xK9PqNBPrt1fEHW1Ox1d55p+bIMvgOr2NWTaSP9dsSddno/lFk9Mm/kry8bf/VhGfHAY8ZGHQBsnOUIABiPVqtV/BoNvkmxOGMR7Pyz3W6vOqOkM/mrfFI07Ys8jlJ5otbCwkJtWdW39i5ba/3VTf4qT4/q06pJu1mcFR7m3Eb6rYvfJ9MkHJmnyIgHHkYdAHQbfd4XANi4Ec+3ao9jUk/XVfCDbDKyQU55V5QnoIUF1rp5+Y2Hla/bWj+40XzQFRmwJ0zvpMt12Ei/HWWnnd4PZVaPzLMxExYAxsuPIgCwBuGknnE3agy61nAsJzu6shW99k+vMvO5wkMVBmz2gBfpz4YN9tuRdVopv7VyZAaAyVdrD3wtBgAAhVarteqKB32uBV518yquI240GuW1CFYdB3aVbzabU3Qv71qt1nnQf08OWGxmbKTfjqzTdnW8NXF2AwBMJmvCAgCsR6PR6H9P8/4L/3U273MdcRUJwXIGbZDJhl1tmKIMbFr7yqRzcgf5jfTbsXRaAIDZYCYsAMCGdFKTXbczGjwb1blzS2fzzrYLCwvTle6cTOXZlL1GvIOUmVUb6bc6LQDAWknCAgAwm1ZdaqBIwprFCQBApSxHAADAbCounF9cXMxzrK1Wq5gHOidrEQAAMC5mwgIAMLOKybBp5Y3FygsRmAYLAEDVJGEBAJhZrVar/yxXGVgAAEbAcgQAAMysRqPRbDaLdQm6yMACADAaZsICADD7Wq1Ws9ksbsOVUlpYWChWJwAAgEpJwgIAAAAAVMhyBAAAAAAAFZKEBQAAAACokCQsAAAAAECFJGEBAAAAACokCQsAAAAAUCFJWAAAAACACknCAgAAAABUSBIWAAAAAKBCkrAAAAAAABWShAUAAAAAqJAkLAAAAABAhSRhAQAAAAAqJAkLAAAAAFAhSVgAAAAAgApJwgIAAAAAVEgSFgAAAACgQpKwAAAAAAAVkoQFAAAAAKiQJCwAAAAAQIUkYQEAAAAAKiQJCwAAAABQIUlYAAAAAIAKScICAAAAAFRIEhYAAAAAoEKSsAAAAAAAFZKEBQAAAACokCQsAAAAAECFJGEBAAAAACokCQsAAAAAUCFJWAAAAACACknCAgAAAABUSBIWAAAAAKBCkrAAAAAAABWShAUAAAAAqJAkLAAAAABAhSRhAQAAAAAqJAkLAAAAAFAhSVgAAAAAgApJwgIAAAAAVEgSFgAAAACgQpKwAAAAAAAVkoQFAAAAAKiQJCwAAAAAQIUkYQEAAAAAKrRl3A0AJlqtVht3EwAAABiadrs97ibAPDITFgAAAACgQpKwAAAAAAAVkoQFAAAAAKiQJCwAAAAAQIXcmAtYg2vOfHkt1VJtU6ptSqlWq21KtVpKm1KtVqttSsefqqW0qbYcH6jkcqRWqx1/KtVSrXaiks6G5cdFyVotpeKfxcvVVpbstKQoc+JVat0vV4tKFm1ejqdUepy/XHnbFSVLlaTo5VJWMi3XmbKGLdd84qmUaiv/2bOSbJN82/C/tRUl2ycep9Kb7fpv11NpuWHH/7ddjtf6PdVeUSy1a7UVT6Xjuy2l1D5RQ+eJdnfkRLH2ykh7gKdKD7pKngguP1Vrl5rdeXyiQKp1lW+Xi63458oNByjZLjWsfXzb5UpSrd1OnXcR1Ln8HoOSqVQmpeXXTauVrLXTiaeWH6zYtrzVikpqpZdb7jzH/1kr1bDcGYunipKdx8f/Wyrc+VjaqVb0rONP1VJXVcefLR4c/8yLkiueWvHP44WjkrVSJbWi2uV/Lj8uKkkrKjnx/90la1nJVC68omQ7q3NFJelE5MQmRUvKm6Subctt69ewVKqh/EJdBbqfTSsel4LtoEwKSp74UpaOHMuRE091VbLc5Y+XL22yXOeJo0W766nUu2T5kLbyqZXPFpWcqLAdPdVVZ3tlgXJL2qUCabmzR/V3V9Kj5PKDWv5yq5Rc7anuJhU3kjnx9e0uWT6KdG+48kDS9VS55V2VrPhn6Zi3asnjTTyxYbtXJV3/7X6qtOHxg31YZ9dTxT+XD9vBg6hhqR3VGW3bXlFgRcl2+HLFUz3qbBeN6a6ku2ErK2mXW9JeuR/avRsWvFxc8vj/FdW2T7yX0q7oW/LEE+3l/b38+ie6SVFn+bZJpTqLYPByKzccoGT5v+12z6e66+xdst1j85VdrFTyRPzEh9BdsquTlj/bcsnuXrziqVLDomI9unB3PI+EX4tw26Bk11Mr90O7u2StVyXFP7se5yX/9RNLCRg3M2EBAAAAACokCQsAAAAAUCFJWAAAAACACknCAgAAAABUSBIWAAAAAKBCkrAAAAAAABWShAUAAAAAqJAkLAAAAABAhSRhAQAAAAAqJAkLAAAAAFAhSVgAAAAAgApJwgIAAAAAVEgSFgAAAACgQpKwAAAAAAAVkoQFAAAAAKiQJCwAAAAAQIUkYQEAAAAAKiQJCwAAAABQIUlYAAAAAIAKScICAAAAAFRIEhYAAAAAoEKSsAAAAAAAFZKEBQAAAACokCQsAAAAAECFJGEBAAAAACokCQsAAAAAUCFJWAAAAACACknCAgAAAABUSBIWAAAAAKBCkrAAAAAAABWShAUAAAAAqJAkLAAAAABAhSRhAQAAAAAqJAkLAAAAAFAhSVgAAAAAgApJwgIAAAAAVEgSFgAAAACgQpKwAAAAAAAVkoQFAAAAAKiQJCwAAAAAQIUkYQEAAAAAKiQJCwAAAABQIUlYAAAAAIAKScICAAAAAFRIEhYAAAAAoEKSsAAAAAAAFZKEBQAAAACokCQsAAAAAECFJGEBAAAAACokCQsAAAAAUCFJWAAAAACACknCAgAAAABUSBIWAAAAAKBCtXa7Pe42AJOrVquNuwkAAAAMjUQQjIWZsAAAAAAAFZKEBQAAAACokCQsAAAAAECFJGEBAAAAACokCQv002636/V6Sqler7ephj08AkV/piL2cNXs4arZw1XzY1c1e7hq9nDV7OGqlffwCE8ogRMkYQEAAAAAKiQJCwAAAABQIUlYAAAAAIAKScICAAAAAFRoy7gbADDvWq3WuJsAG+UOD0w7fZhpZzjBtNOHgZlnJiwAAAAAQIUkYQEAAAAAKiQJCwAAAABQIUlYAAAAAIAKScICAAAAAFSo5lawAAAAAADVMRMWAAAAAKBCkrAAAAAAABWShAUAAAAAqJAkLAAAAABAhSRhAQAAAAAqJAkLAAAAAFAhSVgAAAAAgApJwsI8ajQatZUajcaE1AYDGlbHa7VaYVWtVmvobYay6g6eRc1DqQ16GW4fzo/GDsVUbYh92HCC8Wq1WhsfSDitg8q1gTlTr9fDo0G9Xh97bTCgYXW8ZrPZ5ydSN6Y61R08yzUPpakQGm4f7nM0bjabQ288tIfah/sPJ/RhRqDTnzcyinBaByNgdA7zpfhxrdfrnRFhvV4vB8dYGwxoWB2vfMpUVNVsNstjUN2YKlR38OxKBAyvybDCcPtw19G46yXksKjCEPvwIMMJfZhKFZ1w3UMIp3UwGkbnMEf6/DwXP7GDjxGHWxsMaIgdr8/IsnxCNZx2w7JKD55d01g23FgIDL0P9+qxG08rQGi4fbjPJnJYVG0oswec1sHIWBMW5kjx+7qwsND1VBHpfzlVdbXBgIbY8RYXF1NK9Xo9X6+t0WgUg06LYTFc1R08G41Gp1dDpYbbh4tjbL5JcSjWsRmu4fbhon/mA4ZigKEPM3SdNVsXFhY23ruc1sHI1NqlPz4Ds61zk5Yw5VQ8m1Ia8LAw3NpgQMPqeEW6qldVq74WrE9FB89Wq9U5U2o2m8UpkyMwVahiONGrfKvV6pz5Lyws+JMYw2JIzAwIb7+5vlGrPgwjYyYszItVf497rcU+gtpgQDoe0666PtxJvNbrdYkqKlVRH+61Vefm8p37zq+jWsgZSzAbuq5xXnc9vhEwSpKwMC/WcWHgyGqDAQ2x4y0sLHRuOJBfeNVh9itVqOjg2Sls1jYjMNw+bJDA6A39OFwsmpEfgYuINBYTy2kdjNKWcTcAGLVeKadJqA0GtPGO12g0+g8l+yyPBRs3xH7VarU6a2voq4xSFcOJYvGBIuicn+oMqw8Xi3J2em/RaYtVYob4WlAdvRRGQBIW5k6v85lWqxUuLTTK2mBAVXe8Iqvl4m4qMqw+XJzk66uM2NCHE/md5RYXFzvXK+jbVGFYfbjRaHQW415cXAxvkdRsNvVhJp/TOhgByxEAwAqNRsPUFaZFZ+KVhQiYduUMbGetmM7jxcXFhYUF3ZsJ12g0ei044C9kABQkYQHguM6f+otEgKkrTLgib+WvBUy74mrudrvduRNXu90uslqDL1kIY5H/FaH8hwRjCQA6JGEBIHVuvV1ksur1ervddtbEJCsWzfDXAmZD3pNbrVafWx7BhCgysJ3BQ2tZ8YcEeVgAOiRhgeOGe3rjZImxWF/H66RfizOoZrOpAzMug/c9S8EymdZ3/OzVk4u/jZkMy8isqQ+XM7D5hv6QwAzQdWGIJGFh7vQ6XV/f6c1wa4MBDbHjdV1C2JkSu6HGwQCG1YcXFxdrmeLZPALDMpoBgAMy1RluH+6VqPKHBKaF0zoYgS3jbgAwcYa7tqCVChmLATte/wksMEYOnky74fbh8KbzUKlB+vCqPbNIbOnDTDsjE9g4SViYF507Dg1ScpBZJ8OtDQY03I4nA8voDbEP97oTdyqd6vcpA+sz3ONwsRTMqnRmhmVcg1h9mMnktA5GqdZut8fdBmBEit/X8IvfeXbwbNRwa4MBDbHj6aWMxQgOnv1fAjaoiuFEr/L+WkYVhtiHiy7a6x6JrVarWMJbH6Y6Gxk/OK2DkbEmLMyR4i/w+S/oOv6wOdzaYEDD6nhFYZdWMWIOnky7KoYTq962yLGaIariONxr3cwirg8zsYxMYHTawDwpvvvNZrMIlkeNXeXLV05tvDYYiqF04yJYX035VWAohnso7lP/MBsNJSMYTrRXHqireBfMsyH24T4dVR9mZFbtaU7rYBJYExbmS7PZ7PwdfmFhofglLpZjW+u9L4dbGwxoKB2vKD/IcoRmATBcDp5Mu+qGE6k0N7bzrGtgqcIQ+3CxtPHi4mKtVuvqwB36MBPOyARGZNxZYGDU+lwtlRdedfrVmmqDYdl4Nx78h9LsFaow3ENxlzUVhvUZzXDCEZjqDLEPN5vNXvfd0ocZjVX7m9M6mARuzAVzqmtm3wb/Pj/c2mBAOh7TTh9m2hlOMO2G2OtarVZXGmthYcHFNEwXx2Go1P8PO0jvBp+ANXIAAAAASUVORK5CYII=", + "text/plain": [ + "" + ] + }, + "metadata": { + "image/png": { + "width": "70%" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "fig.show(width='70%')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "44e22c8f-d7a4-4712-b678-48be425e163f", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a4076f67-bfdc-4c6f-963b-da9544d0da41", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/driver/check/.ipynb_checkpoints/dplrw_results-checkpoint.ipynb b/driver/check/.ipynb_checkpoints/dplrw_results-checkpoint.ipynb new file mode 100644 index 0000000000..e842de13d9 --- /dev/null +++ b/driver/check/.ipynb_checkpoints/dplrw_results-checkpoint.ipynb @@ -0,0 +1,663 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "cf1bab3d-ca36-498f-983d-9ac15198597a", + "metadata": { + "jupyter": { + "source_hidden": true + } + }, + "outputs": [], + "source": [ + "import xarray\n", + "import pygmt\n", + "import pandas\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib.colors import ListedColormap,LinearSegmentedColormap\n", + "from matplotlib.ticker import MultipleLocator\n", + "from IPython.display import display" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "b0efb38e-f221-4943-a019-581e93556deb", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xarray.open_dataset(\"../data/MIROC_outputs/ctrl_MIROC-COSP2.nc\")" + ] + }, + { + "cell_type": "raw", + "id": "bc8c7853-38c7-4cc9-8550-4bfe379c03d3", + "metadata": {}, + "source": [ + "print(ds.info())" + ] + }, + { + "cell_type": "markdown", + "id": "b8f95c55-be27-4e36-a6c7-05b04049a4d0", + "metadata": {}, + "source": [ + "### config" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "3a3345fc-48d9-4848-9c58-f15f9cd18508", + "metadata": {}, + "outputs": [], + "source": [ + "# variables\n", + "\n", + "vname='Doppler velocity'\n", + "#vname='radar reflectivity'\n", + "#vname='terminal velocity'\n", + "#vname='vertical air motion'\n", + "#vname='Ze-Doppler'\n", + "#vname='Ze-terminal'" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "69ff28b8-67d2-44c3-9d8e-a911178c77d1", + "metadata": {}, + "outputs": [], + "source": [ + "# meridional zone\n", + "\n", + "zone='tropics'\n", + "#zone='mid-north'\n", + "#zone='pol-north'\n", + "#zone='mid-south'\n", + "#zone='pol-south'" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "3ffbf5f0-78b4-4c4b-92b4-9c4366d502d9", + "metadata": {}, + "outputs": [], + "source": [ + "# cloud regime\n", + "#ctype='ALL'\n", + "ctype='stratiform'\n", + "#ctype='convective'" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "85cafa90-23d6-4e47-9192-3914b4f5c04e", + "metadata": {}, + "outputs": [], + "source": [ + "# only for Doppler or terminal velocity\n", + "\n", + "zonal_mean_flag = True\n", + "# True: zonal mean\n", + "# False: CFED" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "55690fe9-ec39-4e75-bb81-d63e519ddc1c", + "metadata": {}, + "outputs": [], + "source": [ + "# only for terminal velocity\n", + "\n", + "weight_factor='reflectivity'\n", + "#weight_factor='mass'\n", + "#weight_factor='number'" + ] + }, + { + "cell_type": "markdown", + "id": "7d8737ab-22e8-48cb-a8a6-9836451780c2", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "### internal process" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "65ec4419-02fe-4e9a-9f3d-50513d55cb91", + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "# data access\n", + "\n", + "if vname=='Doppler velocity':\n", + " if zonal_mean_flag:\n", + " var=ds['dplrw_Z']\n", + " else:\n", + " var=ds['dplrw_T']\n", + "elif vname=='radar reflectivity':\n", + " var=ds['Zef94_T']\n", + " zonal_mean_flag = False\n", + "elif vname=='terminal velocity':\n", + " if zonal_mean_flag:\n", + " var=ds['vfall_Z']\n", + " else:\n", + " var=ds['vfall_T']\n", + "elif vname=='vertical air motion':\n", + " if zonal_mean_flag:\n", + " var=ds['gridw_Z']\n", + " else:\n", + " var=ds['gridw_T']\n", + "elif vname=='Ze-Doppler':\n", + " var=ds['ZefVd_2']\n", + " zonal_mean_flag = False\n", + "elif vname=='Ze-terminal':\n", + " var=ds['ZefVd_2']\n", + " zonal_mean_flag = False" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "ddafada6-a47f-4209-9c0c-f6e4f927f017", + "metadata": {}, + "outputs": [], + "source": [ + "#grids\n", + "\n", + "lat=ds[\"latitude\"].values\n", + "lon=ds[\"longitude\"].values\n", + "\n", + "temp=ds[\"lvtemp_grid\"].values\n", + "zgrd=ds[\"lvdBZe_grid\"].values\n", + "vgrd=ds[\"lvdplr_grid\"].values\n", + "hght=ds[\"levStat\"].values" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "f4bc95c9-dfba-446e-8f8f-5658a52f3b40", + "metadata": {}, + "outputs": [], + "source": [ + "# target region\n", + "west=0. ; east=360.\n", + "\n", + "if zone=='tropics':\n", + " south=-20.0 ; north= 20.0\n", + "elif zone=='mid-north':\n", + " south= 20.0 ; north= 65.0\n", + "elif zone=='pol-north':\n", + " south= 65.0 ; north= 90.0\n", + "elif zone=='mid-south':\n", + " south=-65.0 ; north=-20.0\n", + "elif zone=='pol-south':\n", + " south=-90.0 ; north=-65.0" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "3a89e0da-5511-44b5-87cf-207dc9218307", + "metadata": {}, + "outputs": [], + "source": [ + "# location mask\n", + "lon_mask = (lon >= west) & (lon <= east)\n", + "lat_mask = (lat >= south)&(lat <= north)\n", + "\n", + "mask = lon_mask & lat_mask\n", + "\n", + "index = np.where(mask)[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "0fff3516-6f6c-4fc1-8f69-f2f61f4cac2c", + "metadata": {}, + "outputs": [], + "source": [ + "# cloud regime\n", + "if ctype=='ALL':\n", + " regime=0\n", + "elif ctype=='stratiform':\n", + " regime=1\n", + "elif ctype=='convective':\n", + " regime=2" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "aff2506a-5aae-4e4a-8212-d49d8eb9fef4", + "metadata": {}, + "outputs": [], + "source": [ + "# moment\n", + "if weight_factor=='reflectivity':\n", + " nmlz=1\n", + "elif weight_factor=='mass':\n", + " nmlz=2\n", + "elif weight_factor=='number':\n", + " nmlz=3" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "d969c24b-398a-4b8f-9795-bc36da1c0ad4", + "metadata": {}, + "outputs": [], + "source": [ + "if zonal_mean_flag:\n", + " pass\n", + "else:\n", + " if vname=='terminal velocity':\n", + " sel_work = var.isel(loc=index).isel(regimeID=regime).isel(nrmlzdID=nmlz)\n", + " else:\n", + " sel_work = var.isel(loc=index).isel(regimeID=regime)\n", + "\n", + " if vname=='radar reflectivity':\n", + " window = 2.0\n", + " xtics = 5.0 ; ytics = 10.0\n", + " vmax = 0.2\n", + " origin='upper'\n", + "\n", + " extent = [ -40.0, 30.0, 20.0, -80.0 ]\n", + " zlower = np.searchsorted(vgrd,-40.0)\n", + " zupper = np.searchsorted(vgrd, 30.0)\n", + " tlower = np.searchsorted(temp,-80.0)\n", + " tupper = np.searchsorted(temp, 20.0)\n", + " sel = sel_work[tlower:tupper,zlower:zupper]\n", + " elif vname=='Ze-Doppler' or vname=='Ze-terminal':\n", + " window = 2.0*0.2\n", + " xtics = 5.0 ; ytics = 1.0\n", + " vmax = 3\n", + " origin='lower'\n", + "\n", + " extent = [ -40.0, 30.0, -6.0, 6.0 ]\n", + " zlower = np.searchsorted(zgrd,-40.0)\n", + " zupper = np.searchsorted(zgrd, 30.0)\n", + " vlower = np.searchsorted(vgrd, -6.0)\n", + " vupper = np.searchsorted(vgrd, 6.0)\n", + " sel = sel_work[zlower:zupper,vlower:vupper]\n", + " else:\n", + " window = 0.2\n", + " xtics = 1.0 ; ytics = 10.0\n", + " vmax = 2.0\n", + " origin='upper'\n", + "\n", + " extent = [ -6.0, 6.0, 20.0, -80.0 ]\n", + " vlower = np.searchsorted(vgrd, -6.0)\n", + " vupper = np.searchsorted(vgrd, 6.0)\n", + " tlower = np.searchsorted(temp,-80.0)\n", + " tupper = np.searchsorted(temp, 20.0)\n", + " sel = sel_work[tlower:tupper,vlower:vupper]" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "c661218d-216c-4051-9143-720c20a8c947", + "metadata": {}, + "outputs": [], + "source": [ + "if zonal_mean_flag:\n", + " pass\n", + "else:\n", + " if vname=='Ze-Doppler' or vname=='Ze-terminal':\n", + " smpl = sel.sum(dim='loc', skipna=True).values\n", + " smpl = smpl.T\n", + " nrm = window * smpl.sum()\n", + " nrm = np.broadcast_to(nrm,smpl.shape)\n", + " else:\n", + " smpl = sel.sum(dim='loc', skipna=True).values\n", + " nrm = window * smpl.sum(axis=1, keepdims=True)\n", + " nrm = np.broadcast_to(nrm,smpl.shape)\n", + "\n", + " zero_check = (nrm < window)\n", + " cfed = np.zeros_like(smpl)\n", + "\n", + " cfed[~zero_check] = smpl[~zero_check]/nrm[~zero_check]\n", + " cfed[zero_check] = np.nan\n", + " if vname=='Ze-Doppler' or vname=='Ze-terminal':\n", + " cfed = cfed * 100." + ] + }, + { + "cell_type": "markdown", + "id": "f7fca1b0-e94f-41f0-a093-10c8fcb33ad9", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "f5ac58f0-3955-4da5-8641-261d4b534b89", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(40, 72)\n" + ] + } + ], + "source": [ + "if not zonal_mean_flag:\n", + " pass\n", + "else:\n", + " j_list = ( (lat + 90.0)//2.5 ).astype(int)\n", + " Nlev = hght.size\n", + " \n", + " if vname=='terminal velocity':\n", + " sel = var.isel(regimeID=regime).isel(nrmlzdID=nmlz)\n", + " else:\n", + " sel = var.isel(regimeID=regime)\n", + " \n", + " tmp = sel.sum(axis=1).values\n", + " smpl = np.zeros((Nlev, 72), dtype=var.dtype)\n", + " np.add.at(smpl, (slice(None), j_list), tmp)\n", + " \n", + " tmp = ( sel * vgrd[None,:,None] ).sum(axis=1).values\n", + " totl = np.zeros((Nlev, 72), dtype=var.dtype)\n", + " np.add.at(totl, (slice(None), j_list), tmp)\n", + " \n", + " zero_check = (smpl < 1.0)\n", + " zmn_work = np.zeros_like(smpl)\n", + " \n", + " zmn_work[~zero_check] = totl[~zero_check]/smpl[~zero_check]\n", + " zmn_work[zero_check] = np.nan\n", + " print(zmn_work.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "b2d2372b-bf50-4cd9-8387-bb066ec8d4f9", + "metadata": {}, + "outputs": [], + "source": [ + "if not zonal_mean_flag:\n", + " pass\n", + "else:\n", + " window = 0.2\n", + " xtics = 30.0 ; ytics = 2.0\n", + " origin='lower'\n", + "\n", + " extent = [ -90.0, 90.0, 0.0, 14.0 ]\n", + " hlower = np.searchsorted(hght[::-1], 0.0)\n", + " hupper = np.searchsorted(hght[::-1], 14000.0)\n", + " zmn = zmn_work[hlower:hupper,:]" + ] + }, + { + "cell_type": "markdown", + "id": "df06376c-0eee-4d88-98dc-8d4982ab3afd", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "### make figure" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "4f0215d7-c0c7-496d-9de9-77b79724dfdb", + "metadata": {}, + "outputs": [], + "source": [ + "colors=np.array(\n", + " [\n", + " [248,248,248,1],#white\n", + " [160,210,255,1],\n", + " [ 33,140,255,1],\n", + " [ 0, 65,255,1],\n", + " [ 0,185, 0,1],\n", + " [250,245, 0,1],\n", + " [255,153, 0,1],\n", + " [255, 40, 0,1],\n", + " [180, 0,104,1],\n", + " [ 45, 45, 45,1],\n", + " ],dtype=np.float64\n", + ")\n", + "colors[:,:3] /=256\n", + "color_listed=ListedColormap(colors)\n", + "color_linear=LinearSegmentedColormap.from_list('color_linear',colors=colors)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "f7e346ae-df53-4cc6-affe-3ef1193dfc51", + "metadata": {}, + "outputs": [], + "source": [ + "tmp=np.array(\n", + " [\n", + " [ 1, 64, 38,1],\n", + " [ 71,108, 25,1],\n", + " [154,125, 66,1],\n", + " [206,185,156,1],\n", + " [242,239,246,1],\n", + " [236,196,225,1],\n", + " [204,124,186,1],\n", + " [164, 65,138,1],\n", + " [101, 2, 75,1],\n", + " ],dtype=np.float64\n", + ")\n", + "tmp[:,:3] /=256\n", + "near0=LinearSegmentedColormap.from_list('lower',colors=tmp)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "45ecf13f-9b8e-4b94-b176-099acb1855f7", + "metadata": {}, + "outputs": [], + "source": [ + "tmp=np.array(\n", + " [\n", + " [ 26, 51, 51,1],\n", + " [ 35, 85,130,1],\n", + " [ 61,144,199,1],\n", + " [120,197,204,1],\n", + " [231,255,232,1],\n", + " ],dtype=np.float64\n", + ")\n", + "tmp[:,:3] /=256\n", + "lower=LinearSegmentedColormap.from_list('near0',colors=tmp)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "72913185-cab3-4fef-8434-98768042a687", + "metadata": {}, + "outputs": [], + "source": [ + "N1 = 128\n", + "N2 = 256\n", + "\n", + "lower_linear = lower(np.linspace(0, 1, N1))\n", + "near0_linear = near0(np.linspace(0, 1, N2))\n", + "\n", + "hoge = np.vstack([lower_linear, near0_linear])\n", + "\n", + "zmn_color = ListedColormap(hoge)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "0b29f7e6-d7a8-4ee1-bc10-62e4a3ae2209", + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "if zonal_mean_flag:\n", + " pass\n", + "else:\n", + " plt.ioff()\n", + " \n", + " fig, ax = plt.subplots(figsize=(16,9))\n", + " im = ax.imshow(cfed,\n", + " extent=extent,\n", + " interpolation='nearest',\n", + " origin=origin,\n", + " vmin=0, vmax=vmax,\n", + " cmap=color_linear,\n", + " aspect='auto')\n", + "\n", + " if vname=='Ze-Doppler' or vname=='Ze-terminal':\n", + " ax.set_title(\"2d-PDF: \"+vname, fontsize=32, pad=16)\n", + " else:\n", + " ax.set_title(\"CFED: \"+vname, fontsize=32, pad=16)\n", + "\n", + " if vname=='radar reflectivity' or vname=='Ze-Doppler' or vname=='Ze-terminal':\n", + " ax.set_xlabel(\"reflectivity (dB Ze)\",fontsize=22)\n", + " else:\n", + " ax.set_xlabel(\"velocity (m/s)\",fontsize=22)\n", + "\n", + " if vname=='Ze-Doppler' or vname=='Ze-terminal':\n", + " ax.set_ylabel(\"velocity (m/s)\",fontsize=22)\n", + " else:\n", + " ax.set_ylabel(\"Temperature (degC)\",fontsize=22)\n", + " \n", + " ax.xaxis.set_major_locator(MultipleLocator(xtics))\n", + " ax.yaxis.set_major_locator(MultipleLocator(ytics))\n", + " ax.tick_params(axis='both', which='major', labelsize=18)\n", + " \n", + " cbar = fig.colorbar(im, ax=ax,\n", + " orientation='vertical',\n", + " pad=0.02,\n", + " fraction=0.045,\n", + " shrink=1.0)\n", + " cbar.set_label(\"\", fontsize=13)\n", + " cbar.ax.tick_params(labelsize=16)\n", + " \n", + " \n", + " fig.tight_layout()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "d13229d3-98c2-4419-b993-2f1b09654904", + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "if not zonal_mean_flag:\n", + " pass\n", + "else:\n", + " plt.ioff()\n", + " \n", + " fig, ax = plt.subplots(figsize=(16,9))\n", + " im = ax.imshow(zmn,\n", + " extent=extent,\n", + " interpolation='nearest',\n", + " origin=origin,\n", + " vmin=-4.0, vmax=2.0,\n", + " cmap=zmn_color,\n", + " aspect='auto')\n", + "\n", + " ax.set_title(\"zonal mean: \"+vname, fontsize=32, pad=16)\n", + "\n", + " ax.set_xlabel(\"latitude\",fontsize=22)\n", + " ax.set_ylabel(\"height (km)\",fontsize=22)\n", + " \n", + " ax.xaxis.set_major_locator(MultipleLocator(xtics))\n", + " ax.yaxis.set_major_locator(MultipleLocator(ytics))\n", + " ax.tick_params(axis='both', which='major', labelsize=18)\n", + " \n", + " cbar = fig.colorbar(im, ax=ax,\n", + " orientation='vertical',\n", + " pad=0.02,\n", + " fraction=0.045,\n", + " shrink=1.0)\n", + " cbar.set_label(\"\", fontsize=13)\n", + " cbar.ax.tick_params(labelsize=16)\n", + " \n", + " \n", + " fig.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "id": "7289897a-0a71-4d38-9147-403391c657ad", + "metadata": {}, + "source": [ + "### results" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "11581c37-1a75-41ce-9f19-fe27c7436016", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABi4AAAN5CAYAAACfb8OmAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAArx5JREFUeJzs3Qd4bFW5MOA1k9MrVXrvggoIVpCqFBGUJsULqFgRRRQvWIALKihcUVRUsCACUlQQwYZIV0BAOtKkHHo/vSQz+3/W9iZ/knOSM0lWTlYm78uzyGTOzJo1u81kf/tbX6UoiiIAAAAAAABkoDrUAwAAAAAAAGgncAEAAAAAAGRD4AIAAAAAAMiGwAUAAAAAAJANgQsAAAAAACAbAhcAAAAAAEA2BC4AAAAAAIBsCFwAAAAAAADZELgAAAAAAACyIXABAAwrlUqlSwPI0dlnn93lWHXIIYcM9ZBYAkb6er/mmmu6vP9tt912qIcEAAxTo4Z6AAAAMJLFE33bbbfdYh83evToMHbs2DBlypSwwgorhNVWWy1stNFGYdNNNw3veMc7wsorr7xExgsAADDYBC4AAGAYaG1tLdusWbPC008/Hf75z3+Gyy67rOPfN9tss3DAAQeEQw89NCy11FJDOlaARn37298Or776asfvRxxxhGMYACBwAQAAzSAGMmI74YQTwlFHHRW+8IUvlBkaALkHLh5//PGO3+P0WoKvAICMCwAAyMxXv/rVsOyyy3a5r16vl1clx/biiy+G2267Ldx7772hVqt1edzMmTPDscceGy6++OJwySWXhHXWWWcJjx4AAGBgBC4AACAzBx54YFhzzTUX+7g4bdSVV14ZTjvttHD99dd3+be77747vO1tbwvXXntt2HDDDQdxtAD/EYtxF0VhcQAAA1YdeBcAAMBQmDRpUnjf+94XrrvuujJA0b1A9/PPPx923nnnLvPHAwAA5E7gAgAAmsA73vGOssbFFlts0eX+OHf84YcfPmTjAgAA6CuBCwAAaBKvec1rwm9+85uF6mOcd955ZU0MAACA4UCNCwAYQnF++r/97W/hqaeeCi+88EJoaWkpTzyuscYa4S1veUsYM2bMoLzus88+W77uo48+GubPnx+WWWaZcj79rbfeOkycOHHA/cf3c//994d///vfYfr06aG1tTUstdRS5cnUzTbbLKy//vphuItzeN9xxx1li9PxxN/jND1vfetbw3rrrbfY58dlcvPNN4d77rknvPzyy+VyX2WVVcJ222230EnngXjllVfC3//+9/Dcc8+V29ioUaPC8ssvX45xyy23LLe5gYrTEN13333hoYceKt/LnDlzwuTJk8PSSy8dNthgg7D55puXrzsYYmHqf/zjH+Guu+4qC1aPGzeufH9vetObytceiVZbbbXw/e9/P+y3334d98XtM9bBOPfcc/vcX3xuzOR44IEHym1o9uzZYbnlliuPVXF7jz8H6/h4ww03lNvVjBkzyu1p1VVXLY9T8XZqbW1t4ZZbbin3yZdeeimMHz++3KdjBsvaa68dhlI8Tt90001h2rRp5TpYsGBBuZ3H5bHVVluFCRMmJH/NuN5jnZS4bz3zzDPlGOJyf/e7391Q/ZXhdBx/8MEHy+Uat7P4ebjiiiuW9WEGa9tuVDyuxu0xji1+lsaxxfUej92rr7568teL+1r7sTQey+NxO67z+Jn9+te/vvwcBwBYYgoAGOEOPvjgWEUySfvZz37W0Gv+5S9/KXbcccdizJgxPfY1adKkYu+99y7uuuuuPr2f4447rks/8fd2t9xyS7HTTjsVlUplka8Zx/PBD36wePLJJ/v0mvPnzy9++9vfFoccckixxhprLHY5veY1rym+8IUvFM8880zRV937GizbbLNNl9e5+uqry/trtVpxxhln9Po+3/GOdxS33377IvudPn168cUvfrFYZpllFvnclpaWYv/99y+eeuqpfo+9ra2t3Bbf8pa3lP31NM44ho9//OPF008/3efX+Pvf/14ceeSRxRve8IYet6f2NnHixPI9/fOf/0y2vufNm1d89atfLbelnl53/fXXL375y18WuYvbVvexP/roowPqM24D3bfRcePGFbNmzWq4j7hdfPKTn+x1Gcd1/8Y3vrE4++yzy32jUfH9de4njrXdE088URx00EE9Hh9Hjx5d7LbbbsW9997bp2XSfXm0L+PZs2cXxx57bLHsssv2+D632GKL4ne/+12fXi/ug537iJ81fXXttdeW73XChAk9jm3s2LHlY2699dYky2Pu3LnFSSedVKy66qoD+pzryXrrrZesvze/+c1d+jr11FMbet4jjzxSHHrooYvdtrfccsvi4osvXqLr/ZVXXimOOeaYYvXVV+/1uPra1762OO2008rP34GI+9unPvWpYrXVVuv19arVark8vvGNbxTPPfdcw8ez+Fm6KI18V+iptW8zcd9daqmlFvlZ3VfxM6X7MeCPf/xjv/oCANIQuABgxFuSgYtXX321PMHUlz7jyYLDDjusaG1tHVDg4uSTT+71JHbnttxyyxX/+Mc/Gt42VlhhhX4tr3hCu68nhbr3sSQDF3H97bDDDg29t3gy8de//nWXPu++++5i7bXXbuj5K664YnH//ff3edxxvcUTWn1ZD/Gk6E9/+tOGX+P9739/v/eReEKuLye4F7W+//3vfxebbLJJw68ZT1DGE/kDOSYMt8BFFE8+d+/3sssua+i5p59+eq8nyxfVXv/61xcPPvjggAIXf/jDH4rJkyc39HoxsPGtb31rQCfq4wnsDTbYoOH3eMABBzR8onggJ7Cff/75Ytddd+3T8o8n2uNnRaPb+qKWx0MPPVRsuOGGvb7OQAMXX/va1xo6sb049913X5d+Ro0a1esJ9Sh+jn7+858vg199WbZbb7118cILLwz6er/ooot6DGr31NZcc83ipptuavg1Oi+Lo446qtcLKHpq2267bRaBi+iII47o8m/x86k/zjnnnC79rLPOOkW9Xu9XXwBAGmpcAMASEqfaiFOcXH755Yv890mTJpVTk3RXr9fLaV/22GOPMHfu3H699gknnBCOPvroclqddnEKiDjtxKKmCorTROy8887l9EKNThW0KO2vMWXKlFCpVBb69zjlzD777BPOOeeckLs4Tcpuu+0Wrrrqqi73xymRFjVNS3z8gQceWE5DEsWpSOI0UHH6rHZxmcSpNxY1JViczmuXXXYpp11q1KWXXhq22WabcnqR7uJrTZ06dZFTgcXX+NCHPhROPvnkAa3v+BpxXcepRXqaguqkk04KH/nIR0J/Pfnkk+V7jNOndF8PPU1z9uMf/zgcd9xxYaSJ21t3cdqwxfn85z8fPv3pTy9y2xs9enSP08XEKWbe/va3l1N39ceNN94Y3vve94aZM2d2uT++3qKmGovTJR155JENb7fdxel3dtxxx3IKrEaOxdH5558f9t577/K1B0scT5wq8Pe///0i/z1u54taBzHOFz8r4jKM0171Z4q/uM3861//6nJ/XBZx/0rloIMOCtXq//8z9LrrrutyXGzUz372sy6/xymsepvaKW5X73nPe8Kpp55aTtXX3dixY3v8TLz++uvLadHi8WewnH766eH9739/OUVTd3FM8bi6qM/Rxx57LGy//fY9bi89TSG40047hVNOOaXHbTkey3ta7/+JKefhk5/8ZJflEmv8xOkb++qHP/xhl98/9rGPLXJ5AwBLUKIACAAMW3/961+LH/zgB31uH/jABxa6CjBesbco8QrYrbbaaqHHxytb43NefvnljsfGKYK++93vllfcd3/8Rz7ykT5nXMTpgtqn8ll66aXL6XXilartVxLGsV133XXFu971roVeL77HRsTsgpjN8fa3v728yjsu0+5Xp8ZpGOJUVfGK+6lTp3Z5nXhl97/+9a+GXqv7GJdUxsWb3vSmjttxuoxf/epX5bRP7R577LHiS1/60kJX8sZlEt97exZEXBf77bdfeVVq5yu349RSe+2110LvL04r1Ygbb7yxvOK483Pj+j766KOLm2++uViwYEHHY1988cXi/PPPL6d56n7F9u9///vFvlacbiw+fqONNiqvXo5T6MSrtTtfnRqzKmLGyHe+852FpoaJ7Re/+EVD76v789761rd23I7TrcUMghkzZnQ8Pk4/Fq/C776NxWXTaAZLs2RcxO0r7pud+41X8ffmRz/60UJjiVNMxe2w83EjTid0xRVXlOug++NXXnnlchvrS8ZFnLInXjne/vv2229fXH755eXrtG9P99xzT3mF+KKulm9kSpfuV3h3nmYoXl0dr+LuPO54LI6ZJ4uaTijuV4Nx5X18/e5T9sRtNx6L//znP3fZ1uOyufLKK4s99thjofH993//d5+Xx8Ybb9xxOx4bzj333C7H8fja8bgXp4kbqJ133rnLa3/lK1/p0/Pj51b3z8hLL720x8fH7fbd7373QsspHufjdHKdp8uL21qcduszn/nMQvtPPJ4vLqOlP+s9br/dp9yLn6kxg+a2227reM14HI/Hi3333XeRGYyNZDzFvuL+1f358ZgZP8Ni9kbnz6Z4O34+fe973yu22267Mgu0tyyZRjMu4vbV/n2qe5ZJ/J7S2/ev7t8X2j+T2tvXv/71oi/uvPPOLs+P673RDBsAYPAIXABAP8QTaN3nVY51DeIJ6kanbIlTjvT0+CgGM972trf1eaqX7oGLzifbn3322V5P7MQaFZ2fE6eQiFOWLE4MRvTlRGscR+dAQKMnd6KhCly0t3iivrfpI2JAoPtzdt99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1tcg8HDKumikSHfczuL0ZO1iwGPTTTcd9PEBAI0TuACAHsTpR7oHKGJh4DjtAP/fkUceGW677bYuiyRODROvoo3Ta8X5o+OVnnHqkxhw6VzwOBYRZWB6KrY8UD0FFWKAKk6/0f2EZ5zy5ec//3m45ZZbyimkYjZFPNHYLEWuh6M4pU737cOJuTwt6f04J/HY0f0Ys6jMqMsvv7xL1kDM7tl+++2HZLmSr5hd0bngePye0T2AG/3oRz/q8nuKTBwAIC1TRQHAIsTClvGP37a2ti6FXLtPGbU4Sy+99EIZBbNmzerzHMrd56mPU7L098rMlB5++OGFro793Oc+V04j1EhB8LgsGHhB0s51VH7/+9/3u0B3IydBv/KVr3S5L2bbxDn/G5lmxvpesv76178udF9PdXm6H6v6Wwuk+7Eqbp+NSPV63d9H6tccyOv1pvty+sIXvhC+8Y1vhJEgFjyPU5i11414+umnw5///OeFjmPdp4k65JBDFjvVUffl+qY3vamse5GLJbnfdT9G51xTaiDGjBlTXnTyta99rUsti9NOO63HYEZcXvvuu+8SHysA0DsZFwCwiJPx7373u8sMgXZvf/vbwy9/+ctF1i7ozaJO5j722GMDLpwcT3bkMGVOnDu68xW92267bTj11FMbClpEL7744iCObmToXhcg1Zz7ixIza+Ic8Z2nGrn44osbnhvf+l5y4hXr3a8oHj9+fNhuu+0W+fju67A/x6n4mp23j74ELuLUO/3ZPrqPsy91Gh5//PEl+nq57Me5iZ+r//Vf/9VrkCLWquhchD1+/sXAxXBfrin2u0V9R1jUftd9WcTn5Dw940DEWhWdv6/FbMDO00J1nz4qbkux0DsAkBeBCwDodnJkp5126jIdxWtf+9rwu9/9rjzp15/5u7sXw7311lv73E/357z+9a/PYr3dddddXX7/wAc+0OfMFgam+9Q/cXqgJbW+d9tttz5dcW59Lzmx6Gz3IEK8orin49jrXve6AR+n7r///oXm/u/Lser222/v82t2397f8IY3DOrrdX9OX14vl/04R91rVVx22WVd6j+ce+65XTIgt9lmm4YKWXdfrjEw0D07YSil2O9ilsaDDz642P3ujW9840LPu+eee0IzWnXVVcss2XZxW4qZge3f8+JFF52DYIpyA0CeBC4AoNM0Nrvuumv497//3eWP3z/+8Y8Dmg7krW99a5ffL7nkkj49P2Y0xFoRjUz3sqQ9//zzC9W2aFS80jNOa8TAvPOd7+zye7wqebDmtR/I+o5iAJDBN23atHD44Yd3uS+enDviiCN6fE73Y8rf/va3hdb34vz617/u8ns8fvZlG/ntb3/bp9e76aabukyT1l5gd7Beb968eeFPf/pTv1+vL/txrA0Up0waKTbccMMun5WxsHznQtzdMzC618Xoydprr122zllBnTM3hlr3/S4GG/saUIvfKTof80ePHh223HLLhR4X98d11lmny30xIJSD7lmai6pxkqpI949//OOy/lLn6Q7XW2+9Ab8eAJCewAUAhFD+EbvXXnt1OWEQp8GJJzj6enK2uzjtVGexz0ceeaTh58eCpN2ngeje51DOJd3fObPjFEP9nRaD/y/OAz9hwoQuV713vpo0l/UdT6a3X/HK4InBhj333HOhKXHiVCi9FeaOV7BPnDix4/d4dXv36VR6EzMt4gnBgRyn4nR8na+yX5zuNYfiye9111234effd9994dprr2348eedd16XbT5ORZOqnkz8nIn1FzoHdkdKjYuesi7agxUxU+vee+/tuD/WiIqf143ae++9u/wel2suRcs33njjsMYaa3S577vf/W7Dz4/v43vf+16X+2LB8p6mPepexyHus30NUA6G7nW/UmTFxGnxYsZsu1tuuaXMaDnrrLO6PE5RbgDIl8AFACNe/MM/Xr0Zi4G2i3/0x6kqNtlkkwEvn/3337/LPNbxhGD8Q7mRuaXjVA6f+cxnutwXr6RMdZXvQMUrOLsHWRoRr5L+9Kc/PUijGlnidGSf/OQnu9wXt6/+zN/frqeTet3Xd7z6vPP0LT2JV88edNBBYcGCBWE4iCf5Y4ZC5zYcXH/99WHzzTdfaLqZeJX1t7/97V6fO2XKlHDwwQcvdIK3+xQ0PTn22GPDk08+2eW+vu7jMWjx3//93w09NgYcYiBhoCcgY2ZKvLp/cWL9jS9+8Ytd7tt9993DKqusElKJy7B7YOaKK67od3+5nJxv1Pvf//4uQdhYUydOZXT22Wf3+rjF+dznPtclKBezWY455piQg1hc/LDDDutyX6zH0GhALW4j3ff33va7+H2ic1Aj7nNxv2/kOD6YVlxxxS6/xwB8Ct2Xbayl0vmzceWVVy73YwAgTwIXAIx48URZ5+kS4omEOEXF1ltvnWTZxDnlP//5z3e578orrwyHHnpol+kKuotX9sYrlrtnW3Q/uTWUYjHuzuKJxMVNwxGn4orPy+Eqz2bahuMJmHZxDu+4/cYT2X0Rr0CPJ3+PPvroHq/K73wSP67LxW2Psch9vDr6mmuu6dNYaExcvnGqmLhPveMd7whPPfVUl3+PNXbiPhkDE42c4O18QjgWs33Xu9612Ayx//3f/y1bZ3Gdd77auVHxauivf/3rvT4m1n+IWSWdT8zHoFr3K/Ybcffdd4d99tmnS+He7mL2ys4779zlmBWzLboHMgYqHu/j8u4c8IvZAj/84Q/71E+s0fS1r32tHPNwErfR7pkUMesnZuL0Z5qodq95zWsWWlcxKBePdb2t90VNFRaDCjE42J9C8j35yEc+0uXEfdyu3/e+9y22JlDMYPvsZz+70IUNvWUBrbDCCuGoo47qcl+cDjOevG802+mhhx7q8za5OJtttlmX388888xevx81KgbMOx/7/vWvf3X59/g9rPs0VQBAPnxKAzCixelrTjnllC73vf3tby9P/PbnD/M4NcEGG2yw0P3xREG8cvaGG27oMg1GPDERTxLHE1ZxaqromWeeKU9EfvWrXy1vd/bRj360LIici/e85z3lCfP2udhjFkk8ARKv+Pzwhz8cNtpoo/JEd7z/zjvvDBdccEE5DUb7yaJ4IrwvU7XQc9ZF3Gbi8own19q37fh7LDYfT97E7TpOR9MeeIjrJD4mFtz++9//Xs73HwMXi7pKtfNJr/e+971d6rScdNJJ5TQuMTgXM4Hi/OpRvKo19vnNb36z42S69d24GATsnKnVvs7iFCoxqBlPnMap7eKJ957mg48nWGPdiTXXXLOh14y1AE477bTwsY99rOO+uB5jod+4fg888MByLvi4DcXtLAaj4uM7Z6tF8Zjwox/9qM8nl2PQJE4f96UvfSlcddVV5WvGaW/Gjh1bnsyNV2HHq++/853vLJS9E1+v+3Qzi/PmN7853HzzzWXtlVgk+ctf/nJ5/FpmmWXKf4/H31/96lflsbh7oPXII48MW2yxRUgtnqSP43r44YfL3+NyjifY45X1cb3EAFU8rsbASedARdwOYoZCzHq78cYby20iTkM03MTg0y9+8YsugYvOAar4+dq9blQjYoZF3F8612GJn/GxflRcrjHIE0+edy5eH+te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vQxATJo0KRx22GHhne98Z1h11VXD2LFj040SAAAAAAAYEQYUuLjgggvKn1OnTi0DGBtssEGqcQEAAAAAQHbqoShbLuoZjSWLwMX9999fZlt8/OMfF7QYRPVa32uH9KSo15L1VR31n6rwOaq3LUjXV8JlViRM22qdPyvkaNTo8cn6amudm6yvarUlpFSppOuvKGp5bq/1PMdVrVaT9VWppBvXSJFyXY6EcTG0agm/D6TUMmp0lu+xLfHySvm9J4S0n+M5flamNBK+D+S7VeQr7fexpGdakqkk/s6f8jhWq2U6hUfC8w2VSsoNI52WhOcuipD2OFYNY7L8u3IkfFamPF6kfI9FwnMNOUu1/FMf92miwMWCBf/542bTTTdNNR4AAAAAAMhWrSjKlotaRmNJZUDh8FjLIpo/f36q8QAAAAAAACPYgAIX73rXu8qft956a6rxAAAAAABA9jUucmrNZkCBi09/+tNh3Lhx4ec//3l49tln040KAAAAAACynSqqnlErQrMZUOBivfXWCz/84Q/D7Nmzw0477RQeeeSRdCMDAAAAAABGnIaKc59zzjm9/vvee+8dLrzwwvDa17427LbbbuGtb31rWG655UK1uvi4yEEHHdT4aAEAAAAAYAgVmU3PVGQ0liUauDjkkENCpVLp9THx31tbW8Oll15atkbE5whcAAAAAAAAfQpcREWD82Q1+jgAAAAAABieNS7yOQ9ey2gsSzRw8bOf/WzwRwIAAAAAAIx4DQUuDj744BG/oAAAAAAAoBbqoRZ6L62wpMfTbBZfPRsAAAAAACC3GhcAAAAAADDS1YuibLmoZzSWVGRcAAAAAAAAzZFx8cQTT/TredVqNUyePDlMmTIlVCr5zAUGAAAAAAC9qYWibLmoZTSWLAIXa6655oACD6NGjQobb7xx2G677cJHP/rRsMEGGwxkOAAAAAAAwEifKqooin631tbWcOedd4Zvf/vbYZNNNglf/vKX07wrAAAAAAAYxBoXObVmM6CMi4MPPrj8+eSTT4arrrqqvN3S0lJmUay99tph4sSJYfbs2eHf//53uPfee0OtViszNHbYYYewwgorhJdeeincdttt4YUXXij/7aSTTgptbW3h5JNPTvPuAAAAAACAkRO4+NnPfhauu+66sNdee4UxY8aEL3zhC+Hwww8Pyy+//EKPjcGJ008/PZxy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7Wtf23E7Th8FAAAAAABkmnHxm9/8Jlx33XWhUqmUmQnXX399Wch6s8026/V5O+64Yxno+Nvf/haGyjLLLNMleNGTzpkj8X0CAAAAADBy1Yt6dq3ZDChwcf7555c/X//614dvfvObDT8vPj564IEHwlB617veVf68//77e3zMfffd13F7rbXWWiLjAgAAAACAkWpAgYtbbrmlzELYf//9+/S8FVZYofz5wgsvhKH0wQ9+sPwZa25ceumlC/17LNp96qmnlrdjdsbmm2++xMcIAAAAAEA+6hnUtKh1anE8zWZAgYv2wMPaa6/dp+eNHj26/LlgwYIwlLbeeuuw9957l7cPPfTQ8Otf/zq0tbWVvz/xxBNlQOauu+4qf4/Fx2OxbgAAAAAAYPCMGsiTx40bVwYf+hqAaA94LL300mGonX322eH5558va3XEIMbYsWPDhAkTwiuvvNLxmOOOOy4cfPDBQzpOAAAAAACGXr3+n5aLekZjSWVAKQQrrbTSYmtELMpNN92UTc2IiRMnhquvvjqcddZZ4R3veEf5+6xZs8qpofbbb79w4403huOPP36ohwkAAAAAACPCqIFOtfSvf/0rXHzxxeGEE04o610szosvvlhOyRQfu80224QcxCmg4lRRsTW7er2WrK9KJV1fRbUljAS1Wrrp0WptrSFHsTZMKkXC7bVezTf0nPR9Juwr5bja2tJt+5VMjxcpl33OqgmXf62W736ZykjZLkaClNt+yuNrSpXE06Km3P5Hwr6U8j3WEn7uhrETR8R6TPp9LOQp5XaR699vqb/zV6sJt9lann9z5ToldkvLmJClWtq/w1syPS4m/buySLe9VirptteWUWOy/AzJ9e9dFlYvKmXLRT2jsaQyoD3+Ax/4QPnzoYceKmtALE6cUio+Z86cOWXg4pBDDhnIywMAAAAAAE2mOtCMi3e/+92hKIqyDsTHPvax8PDDDy/0uBiouOSSS8Kb3/zmcOWVV5ZBixjA2HDDDQfy8gAAAAAAsETVivxasxnQVFHRueeeG972treVdS5+/OMfly0W7W63/PLLh1dffbUjlTEGOTbddNNwxhlnDPSlAQAAAACAJjPgyeGmTp1aFtt+//vfXwYlYps7d25HvYuXXnop1Gq1jn/bZ599wnXXXRcmTJiQYvwAAAAAALDExGv0c2vNJklVm8mTJ4df/vKX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KaBMr776ahg5cmQ48MADw+abbx5WX331UFNTk9/uuuuu4Wc/+1n4/PPPv7IcfSWko4+DVasf1AdCsc4X9aNQvOur+spOJM5xQRo/+tGPYmSheenfv39WU1PT/P/vfe97WX19fZuPnzhxYrb66qs379+7d++surq6+f/77LNPVldX5+WCdnryySeztddeu7kt1dbW5u2zZXt97bXXWn3s5MmTs0GDBjXv17Nnz6xbt27N/992222zzz//3GsCZTjzzDMXa3fdu3fP+vTps9h9a6yxRvbcc8/pK2EF0MfBqtUPOl+EYp0v6keheNdX9ZWdi4yLRG688cY8Oh8dccQR+aQjX3zxRR59v/XWW0OvXr3CAw88EM4///xWHz9r1qyw//77hxkzZuS/vnn55Zfzx86bNy9cd911+S9xxo0bF4YPH56qytAlPPvss2G//fbLI+4HH3xw3rYWLlyYt8/Yvl566aXw7//+73kWxZc1NDSEAw44IEyePDmss8464YknnsgfM3/+/DB27NjQp0+f8Nprr4Wjjz56pTw3WNXsuOOO4corrwzPP/983gYXLFiQ/7ot9ne33XZb/uu26dOnh2HDhuX94pfpKyEdfRysWv2gPhCKdb6oH4XiXV/VV3ZCKzty0hnEKF9TdH677bbLGhsbl9jnF7/4Rb49ZlC89957S2y/8MIL8+09evTI3n///SW2X3rppfn2qqqq7J133umw5wKdybx587Kvfe1reds566yz2v340aNHN0f0W/vl25133tm8ffz48YlqDV3XuHHjmtvUmDFjltiur4R09HGwavWD+kAo1vmifhSKd31VX9n5yLhI4JVXXsmj81Gcn6KycsnDesopp4T+/fvnUfkxY8Yssf32229vjiZuvPHGS2w/66yz8rH1Gxsbwx133JGi2tDp/frXvw7vv/9+GDhwYLjiiiva/fj4y7cojmu6yy67LLG9ZXttasPAstt5552b1z/88MMltusrIR19HKxa/aA+EIp1vqgfheJdX9VXdj4CFwlMmTKleX3LLbdsdZ+qqqqw6aab5uuPP/74YtveeeedMHXq1Hx96NChrT4+Bi3iJN2tPR5oXVOnddhhh4Xu3bu36zDF4aBi2vDS2mVFRUXYd999tUtIOAFbk0022WSxbfpKSEcfB6tWP6gPhGKdL+pHoXjXV/WVnZPARWIxI+Krtr355puL3d/y/1tttVWbj2/a9tZbbyWoKXRudXV1YeLEifn69ttvnwcHTz311LDBBhuE2trasPbaa+fzVzzyyCOtPv7tt98OpVKp7Hb5ySefhM8//7xDngt09rYa55GJ8zkdc8wx+X1f//rX8/bZkr4S0tHHwarVD+oDoVjni/pRKN71VX1l5yRwkcCgQYOa178clGiyaNGi8H//93/Nk8XESZ6aTJs2rXl9vfXWa/PvNG2LE7jNnTs3RdWh04ongLHdRTH9NwYY/ud//id89tln+WRO8fbhhx8O+++/f55qmGVxmMSwzO3yy48Bli7+qi1mLcXbOORaHBIxTrq26667hgkTJoRu3botV5vUV0Lb9HGwavWD+kAo1vmifhSKd31VX9k5CVwksN122+XR+CjOfB/HWfuyn//85/lFlCYt1+fMmdO83rNnzzb/TsttLR8DLCme+DW55JJLQk1NTbjnnnvyoF/cFlMQY0pwNHr06HDNNdcs9njtEjpWHEs49p3xxLBJnE/m2muvDRtuuOES+2uTkI72BKtWP6jNQrHOF7VJKN71Ve2yc+qygYtbb701/4XLsi6PPfZYc1nV1dXhpz/9aXPKYIzIv/rqq3kUMA4fc+WVV4YLLrgg7wibtDbBDHR1Kdtl0zBPTes33XRTOPTQQ5vbYTwhHDt2bNhmm23y/1966aWtdorQlaVsk639yi32kfHkME7ANmrUqPD666+HHXfcsblPBYDOSj8IK5fzRSge11f5MlfPEznjjDPCueeem6+PGzcuHyMxpveus8464fzzz8/TneJtk9VWW615vU+fPotN8tSWlttaPgZYUss28o1vfCMMGzZsiX1iALGp3c6YMSO88sor2iWsBGuttVY455xz8kBHDHhcfPHFeWp+S/pKSEd7glWrH9RmoVjni9okFO/6qnbZOVWHLurII4/MMyOWVb9+/Za4L2ZWxM4uphG+/PLLebpSbFgHHnhgGD58eLjiiivy/TbaaKN8sqcm6667bvP6Rx99FPr27dvq34zbori9d+/ey1x36ArtsuUY+Jtvvnmbj9lyyy2b12M68E477dRquxw8ePBS2+WXHwOdQUf0lUsTsy1222238Ic//CH86le/Wuxv6yshHX0cFFNb/aA+ENJbnvNF/Sh0rGW5vqqv7Jy6bOAiRuu+PPFnCnEytbi0ZuLEifntt7/97cXuj5NAtZx8Zosttmj18U0T07TsOKEzSdkuBwwYkH8ZbRlYaE3LSdbiL9yaxHYYf2ETU4hj2xs6dOhS22Ucpzj+TehMOqqvLOck8t13313sfn0lpKOPg+JqrR/UB0J6y3O+qB+Fjtfe66v6ys7JUFErSBy/e/z48fn6scceu9i2TTfdtHkCtrbGA583b154+umn8/W99967w+sLnUFTW4lzz7Tlrbfeal7feOONm9d79uzZ3Em21S7jl9iYutjybwHL5/333291SER9JaSjj4NVqx/UB0Kxzhf1o1C866v6ys5J4GIFaGxsDN///vfzybpj+u8+++yz2PYYtW9qbHGy4DhR25ddf/31+QSmVVVV4aijjloR1YZV3gknnND8i7UHH3xwie0xmyJOCBzFX9tst912i20/7rjj8tvf//734cUXX1zi8ffcc0/zyeWXA5LAkn1hy1+stWbChAnhpZdeytf32GOPxbbpKyEtfRysOv2gPhCKd76oH4ViXV/VV3ZSGUm899572Y9//OPslVdeyRYsWJDf19jYmD3zzDPZnnvuGb+hZv3798/eeuutVh8/c+bMbODAgfl+W265ZTZx4sT8/rq6uuyGG27Iamtr822nn366Vwza4dBDD83bzuqrr57de++9WX19fX7/lClTsn/5l3/Jt8Xl1ltvXeKxcd+tt946377eeutl48ePb27bd999d9a3b99829ChQ70m8BUmTZqUbbPNNtkvf/nLvM8slUrN26ZOnZpddtllWa9evfI2NWDAgOzjjz/WV0IH0sfBqtUPOl+EYp0v6keheNdX9ZWdT0X8Z2UHTzqD119/PWy77baLzWofMyTq6+vz/8ehoB544IElftHd0iuvvJJHC2fMmNGcHrxw4cLmMmIa40MPPbTCxxuHVVkcZu2f//mf80kOo9h+YmrvF1980bzPRRddFEaMGNHq42MG1JAhQ5ozoeJj4y9vYtuMYruPv46LbR5oW2xDLYdji5Oo9e3bNyxYsCBvp03iPvfdd99ifWpL+kpIRx8Hq1Y/qA+EYp0v6keheNdX9ZWdi8BFIjNnzgzXXHNNeOqpp/I0w+nTp+eBh8033zwcfPDBeSpT7PzKGavt8ssvDw8//HD44IMPQvfu3fMJZmIa4oknnphPFgy0Tww03HzzzeHXv/51Ppn2nDlzwlprrRV23333cNZZZy02oVNr4v4xRfj+++8PkyZNytthHD/xyCOPzB8fTzyBpYvpvDH4HvvJOPTatGnT8r4yDoG45pprhm222SYcdNBB4V//9V9Djx49llqWvhLS0cfBqtUP6gOhWOeL+lEo3vVVfWXnIXABAAAAAAAUhp/vAwAAAAAAhSFwAQAAAAAAFIbABQAAAAAAUBgCFwAAAAAAQGEIXAAAAAAAAIUhcAEAAAAAABSGwAUAAAAAAFAYAhcAAAAAAEBhCFwAAAAAAACFIXABAAAAAAAUhsAFAACUafLkyaGioiJfjj/++EIdt0GDBuX1irersiIfYwAAYMWoXkF/BwAAaIdrr702zJw5M/Tv3z8MHz58uY/d66+/Hh588MF8fdiwYeEf/uEfvB4AAEAhCVwAAEBBAxdTpkwJG220UbLAxciRI/P1mJUhcAEAABSVwAUAAHQCcYglAACAzsAcFwAAAAAAQGEIXAAAAAAAAIUhcAEAAAn95S9/CVdffXX43ve+F77xjW+E3r17h9ra2rDWWmuFf/zHfwyXXHJJmD59epuPj/NPVFRU5PNbRPE2/v/Ly4gRI1p9XLxt6dZbb83vP+GEE5rvi+utldnS8ccf33z/Vw1D1fQ34hLXl+bFF18MRx11VNhggw1C9+7dw3rrrRf23XffcPfdd4dl8Yc//CGceuqpYYsttsgnMo9lxrIPOeSQcN9994Usy5apXAAAYOUxxwUAACRy++23h+OOO67VbX/961/z5emnnw5XXnlluPPOO8N+++3XpY59DLZcfPHFoVQqNd83bdq0fBk3bly45557wqWXXlpWWTNnzgzHHHNMePjhh5fY9uGHH+bL/fffnweLYgBjjTXWSPpcAACAjiNwAQAAicyfPz/POthmm23yC+abb755GDBgQL4tXkgfP358eOyxx8Ls2bPzjIDnnnsubLfddouV8atf/SovJ2YRxEDHmmuumd/3ZbHscuy5557hgQceCE8++WT4+c9/nt931lln5fevSNdcc00YOXJk8/9jRsrQoUNDnz59wttvvx1uvvnmcO+99y4W1GhLPH677rpreOutt/L/x8yWww47LM+6iNkt77//fvjNb34T/vjHP+YZGXvttVd44YUX8mwMAACg+AQuAAAgkd133z0fKurrX/96q9vPOeecPHhx0EEH5cGJ888/P/9/S3vvvXd+O3z48Py2Z8+eYdiwYctcpw033DBfYoZCkxgsWZ4y2ysGEn784x/n61VVVWHs2LHh0EMPXeLY7L///nmWxFc57bTTmoMWMYvjwgsvzMttKR7buFx11VXhjTfeyIfoigsAAFB85rgAAIBEvvnNb7YZtGgSf/1/9tln5+sTJkwIH330Uac//tddd11YuHBhvv7DH/5wiaBF1Ldv33DXXXflGRhLE7MoYuAjOumkk8JFF120RNAiqqysDKNGjcozM5rqUFdXl+gZAQAAHUngAgAAVrDddtuteT0OYdTZNWVRxGBCDFy0ZZ111glHH330Usu67bbbmtdjRsVXOfbYY/PbWbNm5RODAwAAxWeoKAAASOyZZ57J51h46aWX8mGS5syZE+rr61vdN8590Zl99tlnYcqUKc3zcqy77rpL3f873/lO+MUvftHm9jhnRRTnq4jDRTUNGdWWlhktcd849wgAAFBsAhcAAJDI3Llz84yB3/72t2U/Jk403ZlNmzatef2rhtEqZ5/Jkyfnt3HoqTjBd3t8/vnn7dofAABYOQQuAAAgkcMPPzz87ne/y9d79eoV9ttvv7DtttvmWQZxku3q6r99/X7zzTfDT37yk3y9sbGx0wdzmsRj8FXicVualpOMt9eiRYuW+bEAAMCKI3ABAAAJPPvss81Bi6233jo8/vjjYeDAga3uW1NT06mO+dKCL717925enz9//leWNW/evKVuj+XF4MWAAQPCjBkz2llTAABgVWBybgAASCAGKppceumlbQYtokmTJhX+mHfr1q3sTIXp06e3ua3lnBbvvvvuV/7dr9pn/fXXz29j8KJlNgcAANB5CFwAAEACn3zySdnzNDz66KNfWV5l5d++qmdZlqB2/7+8cstcbbXVWp3gujXPPfdcm9vWWmutMGjQoHz9z3/+82JzXrRmwoQJS93+T//0T/ltqVQK48aNW+q+AADAqkngAgAAEmg5N8PSsgaef/75sgIXTUMsfdXQSeVqOWRTOWV+85vfbF4fP358m/u98847zUNktaVpEu0YbPiv//qvNvf79NNPwx133LHUso499tjm9f/4j//IJ+kGAAA6F4ELAABIYIcddmheHzlyZKsX1P/4xz+GQw89tKyMh4033ji/jfM4TJ06dbnr11Re9Oqrr37l/t/97nebJxO//vrrWw3GxEyMQw45JDQ0NCy1rB/84Aehe/fu+frVV18dHnjggSX2mTNnTj65+ezZs5da1o477hgOO+yw5uN50EEHhb/+9a9t7h+PdZx/5Nxzz11quQAAQHGYnBsAABI4+OCDw4YbbpgHGSZOnBg222yzcPLJJ+fDRsVJqf/3f/83jB07NtTX14fjjjsu3HbbbUstb6+99goPPfRQc8bC97///bDeeus1D/kUy/2qIalaihOGr7322nlWw5gxY8Iaa6wRdt5559CzZ8/mffbdd9/m9ThHR8xuuPnmm8OsWbPygMHpp58eBg8eHOrq6sLLL7+cP4f43GLA4a677mrzb3/ta1/L5/04++yz8yBHPFZxGTp0aOjTp094++2387/zwQcf5Pfff//9S30uN910U/jLX/4S3njjjXxukTgUVQygxOez5ppr5sc4Ps8Y2IjZIh9++GHYZJNNwqhRo8o+XgAAwMpTkaUaNBcAADq5yZMnN2cuxODDrbfeutj2V155Jb/439Zk1VVVVeFnP/tZ2GmnncKQIUPy+y666KIwYsSIJfaNwzl961vfyueFaM2XHxcv3k+ZMiVstNFGeT3buuAfgylt+fKpQQxY7LPPPuHFF19sdf8ePXqEG2+8MTQ2NoYTTjghv++WW24Jxx9/fJt1vvjii9vMOImZFPH4bLrppm0e4yZxYu4zzjgjD8KUc0oT58Z46qmnvnI/AABg5TNUFAAAJLL99tvnv/I/55xz8oyLODxSnFsiXog/7bTTwksvvRR+9KMflT1nxgsvvBB++tOf5gGMfv36LTbB9rI46aSTwhNPPJFnJ8TskKbhm9oS/2bMFLn22mvzYEvfvn3zx8TshRg0eO2118IxxxxT9t+PQ2jFibyPPPLIPHuktrY2rLPOOnlwJGaj3H333aGmpqassuJxvf3228Obb74ZzjvvvDwjJGZbxOGtYhZJDODsvffeeXAnBl4ELQAAYNUh4wIAAAAAACgMGRcAAAAAAEBhCFwAAAAAAACFIXABAAAAAAAUhsAFAAAAAABQGAIXAAAAAABAYQhcAAAAAAAAhSFwAQAAAAAAFIbABQAAAAAAUBgCFwAAAAAAQGEIXAAAAAAAAIUhcAEAAAAAABSGwAUAAAAAAFAYAhcAAAAAAEBhCFwAAAAAAAChKP4fBoRjG6OX4pQAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(fig)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18ad941f-537f-49ae-a500-5c499058d324", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/driver/check/.ipynb_checkpoints/input_check-checkpoint.ipynb b/driver/check/.ipynb_checkpoints/input_check-checkpoint.ipynb new file mode 100644 index 0000000000..ecc4f0b59d --- /dev/null +++ b/driver/check/.ipynb_checkpoints/input_check-checkpoint.ipynb @@ -0,0 +1,402 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "2ad48f61-e598-4a15-89f8-a0483fe2c9fe", + "metadata": {}, + "outputs": [], + "source": [ + "import xarray\n", + "import pygmt\n", + "import pandas\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "dc10108f-956d-47bf-a02c-f42282da2ef1", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xarray.open_dataset(\"../data/inputs/UKMO/cosp_input.um_global.nc\", decode_timedelta=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "02b11a5e-09bc-4ce9-9424-70dc5f125412", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "xarray.Dataset {\n", + "dimensions:\n", + "\tlat = 36 ;\n", + "\tlon = 48 ;\n", + "\tlevel = 54 ;\n", + "\tbnds = 2 ;\n", + "\thydro = 9 ;\n", + "\n", + "variables:\n", + "\tint32 landmask(lat, lon) ;\n", + "\t\tlandmask:standard_name = land_binary_mask ;\n", + "\t\tlandmask:units = 1 ;\n", + "\t\tlandmask:um_stash_source = m01s00i030 ;\n", + "\t\tlandmask:source = Data from Met Office Unified Model ;\n", + "\t\tlandmask:um_version = 11.6 ;\n", + "\t\tlandmask:grid_mapping = latitude_longitude ;\n", + "\tint32 latitude_longitude() ;\n", + "\t\tlatitude_longitude:grid_mapping_name = latitude_longitude ;\n", + "\t\tlatitude_longitude:longitude_of_prime_meridian = 0.0 ;\n", + "\t\tlatitude_longitude:earth_radius = 6371229.0 ;\n", + "\tfloat64 cca(level, lat, lon) ;\n", + "\t\tcca:um_stash_source = m01s02i317 ;\n", + "\t\tcca:source = Data from Met Office Unified Model ;\n", + "\t\tcca:um_version = 11.6 ;\n", + "\t\tcca:grid_mapping = latitude_longitude ;\n", + "\tfloat64 level_height_bnds(level, bnds) ;\n", + "\tfloat64 sigma_bnds(level, bnds) ;\n", + "\tfloat64 dem_s(level, lat, lon) ;\n", + "\t\tdem_s:standard_name = stratiform_cloud_longwave_emissivity ;\n", + "\t\tdem_s:units = 1 ;\n", + "\t\tdem_s:um_stash_source = m01s02i376 ;\n", + "\t\tdem_s:source = Data from Met Office Unified Model ;\n", + "\t\tdem_s:um_version = 11.6 ;\n", + "\t\tdem_s:grid_mapping = latitude_longitude ;\n", + "\tfloat64 dem_c(level, lat, lon) ;\n", + "\t\tdem_c:standard_name = convective_cloud_longwave_emissivity ;\n", + "\t\tdem_c:units = 1 ;\n", + "\t\tdem_c:um_stash_source = m01s02i378 ;\n", + "\t\tdem_c:source = Data from Met Office Unified Model ;\n", + "\t\tdem_c:um_version = 11.6 ;\n", + "\t\tdem_c:grid_mapping = latitude_longitude ;\n", + "\tfloat64 dtau_s(level, lat, lon) ;\n", + "\t\tdtau_s:standard_name = atmosphere_optical_thickness_due_to_stratiform_cloud ;\n", + "\t\tdtau_s:units = 1 ;\n", + "\t\tdtau_s:um_stash_source = m01s02i375 ;\n", + "\t\tdtau_s:source = Data from Met Office Unified Model ;\n", + "\t\tdtau_s:um_version = 11.6 ;\n", + "\t\tdtau_s:grid_mapping = latitude_longitude ;\n", + "\tfloat64 dtau_c(level, lat, lon) ;\n", + "\t\tdtau_c:standard_name = atmosphere_optical_thickness_due_to_convective_cloud ;\n", + "\t\tdtau_c:units = 1 ;\n", + "\t\tdtau_c:um_stash_source = m01s02i377 ;\n", + "\t\tdtau_c:source = Data from Met Office Unified Model ;\n", + "\t\tdtau_c:um_version = 11.6 ;\n", + "\t\tdtau_c:grid_mapping = latitude_longitude ;\n", + "\tfloat64 fl_lsrain(level, lat, lon) ;\n", + "\t\tfl_lsrain:um_stash_source = m01s02i390 ;\n", + "\t\tfl_lsrain:source = Data from Met Office Unified Model ;\n", + "\t\tfl_lsrain:um_version = 11.6 ;\n", + "\t\tfl_lsrain:grid_mapping = latitude_longitude ;\n", + "\tfloat64 fl_lssnow(level, lat, lon) ;\n", + "\t\tfl_lssnow:standard_name = large_scale_snowfall_flux ;\n", + "\t\tfl_lssnow:units = kg m-2 s-1 ;\n", + "\t\tfl_lssnow:um_stash_source = m01s04i223 ;\n", + "\t\tfl_lssnow:source = Data from Met Office Unified Model ;\n", + "\t\tfl_lssnow:um_version = 11.6 ;\n", + "\t\tfl_lssnow:grid_mapping = latitude_longitude ;\n", + "\tfloat64 fl_ccrain(level, lat, lon) ;\n", + "\t\tfl_ccrain:um_stash_source = m01s02i389 ;\n", + "\t\tfl_ccrain:source = Data from Met Office Unified Model ;\n", + "\t\tfl_ccrain:um_version = 11.6 ;\n", + "\t\tfl_ccrain:grid_mapping = latitude_longitude ;\n", + "\tfloat64 height(level, lat, lon) ;\n", + "\t\theight:standard_name = height_above_reference_ellipsoid ;\n", + "\t\theight:units = m ;\n", + "\t\theight:um_stash_source = m01s15i101 ;\n", + "\t\theight:source = Data from Met Office Unified Model ;\n", + "\t\theight:um_version = 11.6 ;\n", + "\t\theight:grid_mapping = latitude_longitude ;\n", + "\tfloat64 height_half(level, lat, lon) ;\n", + "\t\theight_half:standard_name = height_above_reference_ellipsoid ;\n", + "\t\theight_half:units = m ;\n", + "\t\theight_half:um_stash_source = m01s15i102 ;\n", + "\t\theight_half:source = Data from Met Office Unified Model ;\n", + "\t\theight_half:um_version = 11.6 ;\n", + "\t\theight_half:grid_mapping = latitude_longitude ;\n", + "\tfloat64 level_height_0_bnds(level, bnds) ;\n", + "\tfloat64 sigma_0_bnds(level, bnds) ;\n", + "\tfloat64 mr_ccice(level, lat, lon) ;\n", + "\t\tmr_ccice:um_stash_source = m01s02i319 ;\n", + "\t\tmr_ccice:source = Data from Met Office Unified Model ;\n", + "\t\tmr_ccice:um_version = 11.6 ;\n", + "\t\tmr_ccice:grid_mapping = latitude_longitude ;\n", + "\tfloat64 mr_ccliq(level, lat, lon) ;\n", + "\t\tmr_ccliq:um_stash_source = m01s02i318 ;\n", + "\t\tmr_ccliq:source = Data from Met Office Unified Model ;\n", + "\t\tmr_ccliq:um_version = 11.6 ;\n", + "\t\tmr_ccliq:grid_mapping = latitude_longitude ;\n", + "\tfloat64 mr_lsice(level, lat, lon) ;\n", + "\t\tmr_lsice:units = 1 ;\n", + "\t\tmr_lsice:grid_mapping = latitude_longitude ;\n", + "\tfloat64 mr_lsliq(level, lat, lon) ;\n", + "\t\tmr_lsliq:units = 1 ;\n", + "\t\tmr_lsliq:grid_mapping = latitude_longitude ;\n", + "\tfloat64 mr_ozone(level, lat, lon) ;\n", + "\t\tmr_ozone:standard_name = mass_fraction_of_ozone_in_air ;\n", + "\t\tmr_ozone:units = 1 ;\n", + "\t\tmr_ozone:um_stash_source = m01s02i260 ;\n", + "\t\tmr_ozone:source = Data from Met Office Unified Model ;\n", + "\t\tmr_ozone:um_version = 11.6 ;\n", + "\t\tmr_ozone:grid_mapping = latitude_longitude ;\n", + "\tfloat64 pfull(level, lat, lon) ;\n", + "\t\tpfull:standard_name = air_pressure ;\n", + "\t\tpfull:units = Pa ;\n", + "\t\tpfull:um_stash_source = m01s00i408 ;\n", + "\t\tpfull:source = Data from Met Office Unified Model ;\n", + "\t\tpfull:um_version = 11.6 ;\n", + "\t\tpfull:grid_mapping = latitude_longitude ;\n", + "\tfloat64 phalf(level, lat, lon) ;\n", + "\t\tphalf:standard_name = air_pressure ;\n", + "\t\tphalf:units = Pa ;\n", + "\t\tphalf:um_stash_source = m01s00i407 ;\n", + "\t\tphalf:source = Data from Met Office Unified Model ;\n", + "\t\tphalf:um_version = 11.6 ;\n", + "\t\tphalf:grid_mapping = latitude_longitude ;\n", + "\tfloat64 psfc(lat, lon) ;\n", + "\t\tpsfc:standard_name = surface_air_pressure ;\n", + "\t\tpsfc:units = Pa ;\n", + "\t\tpsfc:um_stash_source = m01s00i409 ;\n", + "\t\tpsfc:source = Data from Met Office Unified Model ;\n", + "\t\tpsfc:um_version = 11.6 ;\n", + "\t\tpsfc:grid_mapping = latitude_longitude ;\n", + "\tfloat64 qv(level, lat, lon) ;\n", + "\t\tqv:standard_name = specific_humidity ;\n", + "\t\tqv:units = kg kg-1 ;\n", + "\t\tqv:um_stash_source = m01s00i010 ;\n", + "\t\tqv:source = Data from Met Office Unified Model ;\n", + "\t\tqv:um_version = 11.6 ;\n", + "\t\tqv:grid_mapping = latitude_longitude ;\n", + "\tfloat64 Reff(hydro, level, lat, lon) ;\n", + "\t\tReff:long_name = effective_radius_of_hydrometeor ;\n", + "\t\tReff:units = m ;\n", + "\t\tReff:grid_mapping = latitude_longitude ;\n", + "\tfloat64 rh(level, lat, lon) ;\n", + "\t\trh:standard_name = relative_humidity ;\n", + "\t\trh:units = % ;\n", + "\t\trh:um_stash_source = m01s30i113 ;\n", + "\t\trh:source = Data from Met Office Unified Model ;\n", + "\t\trh:um_version = 11.6 ;\n", + "\t\trh:grid_mapping = latitude_longitude ;\n", + "\tfloat64 skt(lat, lon) ;\n", + "\t\tskt:standard_name = surface_temperature ;\n", + "\t\tskt:units = K ;\n", + "\t\tskt:um_stash_source = m01s00i024 ;\n", + "\t\tskt:source = Data from Met Office Unified Model ;\n", + "\t\tskt:um_version = 11.6 ;\n", + "\t\tskt:grid_mapping = latitude_longitude ;\n", + "\tfloat64 sunlit(lat, lon) ;\n", + "\t\tsunlit:um_stash_source = m01s02i330 ;\n", + "\t\tsunlit:source = Data from Met Office Unified Model ;\n", + "\t\tsunlit:um_version = 11.6 ;\n", + "\t\tsunlit:grid_mapping = latitude_longitude ;\n", + "\tfloat64 T_abs(level, lat, lon) ;\n", + "\t\tT_abs:standard_name = air_temperature ;\n", + "\t\tT_abs:units = K ;\n", + "\t\tT_abs:um_stash_source = m01s30i111 ;\n", + "\t\tT_abs:source = Data from Met Office Unified Model ;\n", + "\t\tT_abs:um_version = 11.6 ;\n", + "\t\tT_abs:grid_mapping = latitude_longitude ;\n", + "\tfloat64 tca(level, lat, lon) ;\n", + "\t\ttca:units = 1 ;\n", + "\t\ttca:grid_mapping = latitude_longitude ;\n", + "\tfloat64 u_wind(lat, lon) ;\n", + "\t\tu_wind:um_stash_source = m01s30i001 ;\n", + "\t\tu_wind:source = Data from Met Office Unified Model ;\n", + "\t\tu_wind:um_version = 11.6 ;\n", + "\t\tu_wind:grid_mapping = latitude_longitude ;\n", + "\tfloat64 level_height_1_bnds(bnds) ;\n", + "\tfloat64 sigma_1_bnds(bnds) ;\n", + "\tfloat64 v_wind(lat, lon) ;\n", + "\t\tv_wind:um_stash_source = m01s30i002 ;\n", + "\t\tv_wind:source = Data from Met Office Unified Model ;\n", + "\t\tv_wind:um_version = 11.6 ;\n", + "\t\tv_wind:grid_mapping = latitude_longitude ;\n", + "\tfloat64 emsfc_lw() ;\n", + "\t\temsfc_lw:long_name = Surface emissivity at 10.5 micron (fraction) ;\n", + "\t\temsfc_lw:units = 1 ;\n", + "\tfloat32 lat(lat) ;\n", + "\t\tlat:units = degrees ;\n", + "\t\tlat:long_name = lat ;\n", + "\tfloat32 lon(lon) ;\n", + "\t\tlon:units = degrees ;\n", + "\t\tlon:long_name = lon ;\n", + "\tfloat64 forecast_period() ;\n", + "\t\tforecast_period:units = hours ;\n", + "\t\tforecast_period:standard_name = forecast_period ;\n", + "\tobject forecast_reference_time() ;\n", + "\t\tforecast_reference_time:standard_name = forecast_reference_time ;\n", + "\tobject time() ;\n", + "\t\ttime:standard_name = time ;\n", + "\tint32 level(level) ;\n", + "\t\tlevel:axis = Z ;\n", + "\t\tlevel:units = 1 ;\n", + "\t\tlevel:long_name = level ;\n", + "\t\tlevel:positive = up ;\n", + "\tfloat64 level_height(level) ;\n", + "\t\tlevel_height:bounds = level_height_bnds ;\n", + "\t\tlevel_height:units = m ;\n", + "\t\tlevel_height:long_name = level_height ;\n", + "\t\tlevel_height:positive = up ;\n", + "\t\tlevel_height:standard_name = atmosphere_hybrid_height_coordinate ;\n", + "\t\tlevel_height:axis = Z ;\n", + "\t\tlevel_height:formula_terms = a: level_height b: sigma orog: surface_altitude ;\n", + "\tfloat64 sigma(level) ;\n", + "\t\tsigma:bounds = sigma_bnds ;\n", + "\t\tsigma:units = 1 ;\n", + "\t\tsigma:long_name = sigma ;\n", + "\tfloat64 surface_altitude(lat, lon) ;\n", + "\t\tsurface_altitude:units = m ;\n", + "\t\tsurface_altitude:standard_name = surface_altitude ;\n", + "\t\tsurface_altitude:um_stash_source = m01s00i033 ;\n", + "\t\tsurface_altitude:source = Data from Met Office Unified Model ;\n", + "\t\tsurface_altitude:um_version = 11.6 ;\n", + "\tfloat64 level_height_0(level) ;\n", + "\t\tlevel_height_0:bounds = level_height_0_bnds ;\n", + "\t\tlevel_height_0:units = m ;\n", + "\t\tlevel_height_0:long_name = level_height ;\n", + "\t\tlevel_height_0:positive = up ;\n", + "\t\tlevel_height_0:standard_name = atmosphere_hybrid_height_coordinate ;\n", + "\t\tlevel_height_0:axis = Z ;\n", + "\t\tlevel_height_0:formula_terms = a: level_height_0 b: sigma_0 orog: surface_altitude ;\n", + "\tfloat64 sigma_0(level) ;\n", + "\t\tsigma_0:bounds = sigma_0_bnds ;\n", + "\t\tsigma_0:units = 1 ;\n", + "\t\tsigma_0:long_name = sigma ;\n", + "\tint32 hydro(hydro) ;\n", + "\t\thydro:units = 1 ;\n", + "\t\thydro:long_name = hydrometeor_index ;\n", + "\tint32 level_0() ;\n", + "\t\tlevel_0:units = 1 ;\n", + "\t\tlevel_0:long_name = level ;\n", + "\t\tlevel_0:positive = up ;\n", + "\tfloat64 level_height_1() ;\n", + "\t\tlevel_height_1:bounds = level_height_1_bnds ;\n", + "\t\tlevel_height_1:units = m ;\n", + "\t\tlevel_height_1:long_name = level_height ;\n", + "\t\tlevel_height_1:positive = up ;\n", + "\t\tlevel_height_1:standard_name = atmosphere_hybrid_height_coordinate ;\n", + "\t\tlevel_height_1:axis = Z ;\n", + "\t\tlevel_height_1:formula_terms = a: level_height_1 b: sigma_1 orog: surface_altitude ;\n", + "\tfloat64 sigma_1() ;\n", + "\t\tsigma_1:bounds = sigma_1_bnds ;\n", + "\t\tsigma_1:units = 1 ;\n", + "\t\tsigma_1:long_name = sigma ;\n", + "\n", + "// global attributes:\n", + "\t:Conventions = CF-1.5 ;\n", + "}" + ] + } + ], + "source": [ + "ds.info()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "3bab77fc-adea-4019-aa7f-2f644f1c0fe1", + "metadata": {}, + "outputs": [], + "source": [ + "Re = ds[\"Reff\"].values" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "f59cc93c-1af3-4d7a-8975-916deb11111e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(9, 54, 36, 48)\n" + ] + } + ], + "source": [ + "print(Re.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "79232327-c8ef-47b1-9187-2e25040becd6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 2555.67200062, 2579.45250599, 2612.77552208, 2655.67127004,\n", + " 2708.17875217, 2770.34556388, 2842.2278931 , 2923.89076484,\n", + " 3015.40755162, 3116.86064765, 3228.34110315, 3349.9476308 ,\n", + " 3481.78939363, 3623.98259556, 3776.65271298, 3939.93387565,\n", + " 4113.96950232, 4298.91040074, 4494.91666141, 4702.15767454,\n", + " 4920.81019898, 5151.06028593, 5393.10329876, 5647.1419457 ,\n", + " 5913.38757075, 6192.06284309, 6483.39507758, 6787.62359741,\n", + " 7104.9943558 , 7435.76263219, 7780.19305938, 8138.55753557,\n", + " 8511.13730095, 8898.22368594, 9300.11745156, 9717.11858314,\n", + " 10149.55686776, 10597.74965445, 11062.05278729, 11542.81645459,\n", + " 12040.41520099, 12555.24096946, 13087.7113953 , 13638.27861956,\n", + " 14207.42265373, 14795.69285374, 15403.65395338, 16031.99387819,\n", + " 16681.44646124, 17352.87798226, 18046.2905 , 18756.7035 ,\n", + " 19483.887 , 20228.776 ])" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "zlev=ds[\"height\"].values\n", + "zlev[:,1,1]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a9b7fe64-2571-40d8-b91e-81d0850cfe25", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b8f57645-805a-421b-97db-73a413e636f2", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/driver/check/COSP2_global-map.ipynb b/driver/check/COSP2_global-map.ipynb new file mode 100644 index 0000000000..172fc48830 --- /dev/null +++ b/driver/check/COSP2_global-map.ipynb @@ -0,0 +1,260 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "cf1bab3d-ca36-498f-983d-9ac15198597a", + "metadata": { + "jupyter": { + "source_hidden": true + } + }, + "outputs": [], + "source": [ + "import xarray\n", + "import pygmt\n", + "import pandas\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "id": "5292ce3c-d43f-4ffd-8151-ba2d81658dc3", + "metadata": {}, + "source": [ + "## This is global map figure" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "1050bc03-232b-4b98-a74b-e0018328d31d", + "metadata": {}, + "outputs": [], + "source": [ + "# valid only for variables with following shape: (loc).\n", + "\n", + "vname='cltatlid'\n", + "vmin=0.\n", + "vmax=100." + ] + }, + { + "cell_type": "markdown", + "id": "2317395a-d769-479a-806a-eee0285f3d1e", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "### internal work" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b0efb38e-f221-4943-a019-581e93556deb", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xarray.open_dataset(\"../data/MIROC_outputs/ctrl_MIROC-COSP2.nc\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "65ec4419-02fe-4e9a-9f3d-50513d55cb91", + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "\n", + "var=ds[vname].values\n", + "\n", + "lat=ds[\"latitude\"].values\n", + "lon=ds[\"longitude\"].values" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "5df1e741-aa79-4bde-b5fa-e0bf3e5dcbbd", + "metadata": {}, + "outputs": [], + "source": [ + "mask = (var >= vmin) & (var <= vmax)\n", + "data = np.column_stack([lon[mask], lat[mask], var[mask]])" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "e77e1cd0-4ccf-4a6c-b700-5c1eb56a2fa9", + "metadata": {}, + "outputs": [], + "source": [ + "check_rows = np.isfinite(data).all(axis=1)\n", + "Nerror = np.where(~check_rows)[0]\n", + "\n", + "if Nerror.size > 0:\n", + " raise ValueError(\"invalid data\")\n", + "\n", + "if data.size == 0:\n", + " raise RuntimeError(\"no valid points\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "4c550b99-7ca3-464f-a6f1-38b3f124d014", + "metadata": {}, + "outputs": [], + "source": [ + "fig = pygmt.Figure()\n", + "region = [-180, 180, -75, 75]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "4965afac-3f2c-448c-ace7-2886ffb00fdd", + "metadata": {}, + "outputs": [], + "source": [ + "tbl_block = pygmt.blockmean(\n", + " data=data,\n", + " region=region,\n", + " spacing=\"1.5d\"\n", + ")\n", + "\n", + "grid = pygmt.surface(\n", + " data=tbl_block,\n", + " region=region,\n", + " spacing=\"1.5d\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "bddcfba4-0c3d-4060-ae86-64738174caa3", + "metadata": {}, + "outputs": [], + "source": [ + "gxyz = pygmt.xyz2grd(\n", + " data=data,\n", + " region=region,\n", + " spacing=\"1.5d\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "34824734-03a7-4643-98b7-b98c8f41b400", + "metadata": {}, + "outputs": [], + "source": [ + "fig.coast(\n", + " region=region,\n", + " projection=\"W15c\",\n", + " frame=\"afg\",\n", + " land=\"lightgray\",\n", + " water=\"white\"\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "4e557933-95ff-482e-a729-aa6b5996ab3e", + "metadata": {}, + "outputs": [], + "source": [ + "fig.grdimage(\n", + " grid=gxyz,\n", + " cmap=\"turbo\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "de1908e4-92e5-4591-9181-0c41b65aa48f", + "metadata": {}, + "outputs": [], + "source": [ + "fig.colorbar(frame='af+l\"Total Cloud Cover (%)\"')" + ] + }, + { + "cell_type": "markdown", + "id": "1dd9302c-8fcd-4870-a667-d21bd295da05", + "metadata": {}, + "source": [ + "### result" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "5b18919b-7518-469c-8b1b-c6d21c99d612", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "metadata": { + "image/png": { + "width": "80%" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "fig.show(width=\"80%\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fe996e44-9a38-4f18-bd8d-50735fb5b8b6", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ee5ac3d9-4e0d-48f0-9b2e-481bda326725", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/driver/check/COSP2_zonal-mean.ipynb b/driver/check/COSP2_zonal-mean.ipynb new file mode 100644 index 0000000000..bc07f697df --- /dev/null +++ b/driver/check/COSP2_zonal-mean.ipynb @@ -0,0 +1,208 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "54f959e2-ee4f-4720-ad04-e37b8dcd8bde", + "metadata": { + "jupyter": { + "source_hidden": true + } + }, + "outputs": [], + "source": [ + "import xarray\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib.colors import ListedColormap,LinearSegmentedColormap\n", + "from matplotlib.ticker import MultipleLocator\n", + "import matplotlib.ticker as mticker" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "2f901612-cbe6-4dfe-acd8-12d0097973f7", + "metadata": {}, + "outputs": [], + "source": [ + "# valid only for variables with following shape: (levStat, loc).\n", + "\n", + "vname=\"clatlid\"\n", + "\n", + "vmin=0.\n", + "vmax=100." + ] + }, + { + "cell_type": "markdown", + "id": "8e71e2f0-fc47-4140-98b4-e0d7492d835b", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "### internal work" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "9a2a0996-b59b-4f5f-a74c-06ac6e3f075c", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xarray.open_dataset(\"../data/MIROC_outputs/ctrl_MIROC-COSP2.nc\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "3e978297-3afd-426e-bb95-6512458516f9", + "metadata": {}, + "outputs": [], + "source": [ + "lat = ds[\"latitude\"]\n", + "lon = ds[\"longitude\"]\n", + "lev = ds[\"levStat\"]\n", + "\n", + "var = ds[vname]\n", + "var = var.where((var >= vmin) & (var <= vmax))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "2d26d842-eed2-4663-bab1-aef67eb24d3b", + "metadata": {}, + "outputs": [], + "source": [ + "var = var.assign_coords(latitude=(\"loc\", lat.data))\n", + "var_zonal = var.groupby(\"latitude\").mean(\"loc\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "96bbc0ad-da9c-4386-b9b5-426387b422a3", + "metadata": {}, + "outputs": [], + "source": [ + "colors=np.array(\n", + " [\n", + " [248,248,248,1],#white\n", + " [160,210,255,1],\n", + " [ 33,140,255,1],\n", + " [ 0, 65,255,1],\n", + " [ 0,185, 0,1],\n", + " [250,245, 0,1],\n", + " [255,153, 0,1],\n", + " [255, 40, 0,1],\n", + " [180, 0,104,1],\n", + " [ 45, 45, 45,1],\n", + " ],dtype=np.float64\n", + ")\n", + "colors[:,:3] /=256\n", + "color_listed=ListedColormap(colors)\n", + "color_linear=LinearSegmentedColormap.from_list('color_linear',colors=colors)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "7158e1b2-3ad4-407a-9dff-4d0311afa2c2", + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "\n", + "fig, ax = plt.subplots(figsize=(12,7))\n", + "\n", + "pcm = ax.pcolormesh(\n", + " var_zonal.latitude,\n", + " var_zonal.levStat,\n", + " var_zonal,\n", + " shading=\"auto\",\n", + " vmin=vmin,\n", + " vmax=vmax,\n", + " cmap=color_linear\n", + ")\n", + "\n", + "ax.set_title(\"zonal mean: \"+vname, fontsize=32, pad=16)\n", + "\n", + "ax.xaxis.set_major_locator(MultipleLocator(30.))\n", + "ax.set_xlabel(\"latitude\",fontsize=22)\n", + "\n", + "ax.yaxis.set_major_locator(MultipleLocator(3000.))\n", + "ax.yaxis.set_major_formatter(\n", + " mticker.FuncFormatter(lambda y, pos: f\"{y/1000:g}\")\n", + ")\n", + "ax.set_ylabel(\"level (km)\",fontsize=22)\n", + "ax.tick_params(axis='both', which='major', labelsize=18)\n", + "\n", + "cbar = fig.colorbar(pcm, ax=ax, pad=0.02)\n", + "cbar.set_label(\"\", fontsize=13)\n", + "cbar.ax.tick_params(labelsize=16)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "97208430-407f-44b8-8f52-16c38e312aaa", + "metadata": {}, + "source": [ + "### Figure" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "be27ca04-76ab-46e4-90fb-711aae66ad44", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA8UAAAKrCAYAAADYuy/yAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAm1VJREFUeJzt3QeYFOX9wPHf7t7tFe44uihSbIgtKPauEVEUu8YuoEax/aOiRqIRjAqxm0SNMYKIkaCIJWoExdiwIfYCVkA6AnJwXNnb8n/e1+zlyvu7u7nbvdu7+X6eZ7jl3Zl33pl5Z3bffVsgkUgkBAAAAAAAHwq2dgIAAAAAAGgtFIoBAAAAAL5FoRgAAAAA4FsUigEAAAAAvkWhGAAAAADgWxSKAQAAAAC+RaEYAAAAAOBbFIoBAAAAAL5FoRgAAAAA4FsUigGgHQgEAjUWAA3r169fjftm0aJF7e60HXLIITWO8bXXXqt3/cmTJ9dYf8SIEWlPI88vAK2NQjEAAAAAwLeyWjsBAAAAqOnjjz+WZ555pur/u+66qxx//PGcJgBIAwrFAAAAGVgovvHGG6v+P3z4cArFAJAmNJ8GAAAAAPgWNcUAAACwzMBaLTG4FgBkEmqKAQAAAAC+RaEYAAAAAOBbFIoBAAAAAL5Fn2IAGaekpETefvttWbZsmfz4448SCoWkR48e0rdvX9lnn30kHA6nZb8rV660+124cKFUVFRIly5dpF+/fnLggQdKhw4dmh2/OZ758+fL999/L8XFxVJZWSmdOnWSrl27ym677Sb9+/eXti6RSNhRc82yevVq+/8ttthC9t13X9luu+0a3N6ck/fee08+//xzWbdunT3vvXr1kkMPPdSep1T56aef5J133pFVq1bZPJaVlSXdu3e3adxzzz1tnmuu9evXy5dffinffPONPZbS0lIpLCyUzp07y/bbby+DBg2y+02HWCwm77//vnz66aeyZs0ayc3Ntce311572X23deb+effdd+09a47P3K8dO3aUPn36yE477STbbLNNi6TD5Nevv/5aFixYICtWrJANGzZIdna2fXaYfG+eV+Z6+5G5t5LPcXO9zHkYMGCA7LfffjY/AkBGSQCAw/DhwxPmEZGK5eGHH27UOZ49e3Zi8ODBiXA4rMZVUFCQOPnkkxOffvqpp+s2duzYGvGY/yfNnTs3ccQRRyQCgYBznyY9I0eOTCxdutTTPisqKhLPPvtsYsSIEYm+ffs2eJ569OiRuOaaaxIrVqxIeFU7rnQ5+OCDa+zn1VdfteGxWCxx//3313ucBx10UOLDDz90xltcXJz43e9+l+jSpYtz21AolDj99NMTy5Yta3Lao9GozYv77LOPjU9Lp0nDqFGjEsuXL/e8j3feeSdx5ZVXJgYOHKjmp+TSoUMHe0wfffRRyq53eXl54uabb7Z5Sdtv//79E//85z8TbU0kEkk88MADib322qve62eWLbfcMnHBBRck3n333XrjrJ1fFy5c2GA6TL6455577DPDXMP60mHywO6775549NFHE5WVlQ3GbfJnU5+z5li83LONTYP5LPBi3rx59jmuXSNzzi699NLEmjVrWvz5BQAanjwAWr1QvH79+sSwYcM8xRkMBhOXXHJJo75o1lco/uMf/9jgF+zk0q1bt8T777/f6Byz2WabNel8mS+N06dP95QzW+pLpesLtrl+hx12WKOOLScnJzFjxowacX722WeJrbfeulHb9+zZMzF//nzP6TbXbccdd/R0HfLz8xOTJk1q9D5OPfXUJt8jY8aMsT8sNOd6f//994mdd9650fs8//zz7Q8FzXkmtJSZM2cm+vTp06Rzu2jRopQVip9//nn77GlKOvbYY4/EkiVL2nWh2DxXG/s8Nfdy8nnaWvkKAJLoUwygVZkmh6Z58vPPP+98v6CgQPLy8uqEx+Nxue++++S4446TsrKyJu37D3/4g1x77bW2qWmSac5qmj66ms+aZppHHnmkbRbY2OazLsl9mOaegUCgzvubNm2SU045RaZMmSKZzjRbHTZsmLzyyis1wk0z4fz8fOf6Z555pm1ebZimp6ZptGlSnmTOiWlW7momb5rLDh061DZFbqxnnnlGDj74YNuUuTazr6KiImfzeLOPc889V/74xz8263qbfZhrbZqPas2yJ0yYIL/+9a+lqZYuXWqP0TQ7r30dtKb/Dz30kIwdO1Yy3V133SVHH320/PDDD873c3Jy1HvW+LnMlRobN260zx4X0yTYNPHXmgbPmzdP9t57b5uH26Pf/va3cuONN9Z4nla/RuYeqM6chyFDhtjuBQDQ2uhTDMBp+PDhtj+cV2+99Zb84x//qBGmfVk1X55+9atfyWeffVYj3PQ7+93vfmcLW8n+eMuXL5ennnpKbrnllhpfKv/973/Lb37zG3nwwQc9pXPWrFm276ph9jF69Gg58cQT7b5NIcakzfSHu/nmm+Wll16q2m7t2rVy1VVXyaOPPtqo/ZhjN+fRHIv5QrzLLrtIt27dahQSTb/Pp59+Wu6//37b9y7poosusttkch/QG264QebOnWtfm7645ovx4YcfXvUFePHixfL3v/9dbrvtNtv/0igvL5dLL73UFqRPOOEE+2ODOeennnqqXHjhhbbPYbJA/NFHH9lrPmPGjKp9Llq0yIaZpSHmGpofGKLRaFWYud5mP2bfpi+36QOavLbmWt96663yySefVK1v8uLAgQNtYbwxdthhB1uIM4XUnXfe2faFT/74YQpU5ocAs5977723RoFg0qRJ9geCs846S7wy99GSJUvs68GDB8v//d//ySGHHGILxYa5Z/75z3/aQkv1PGaO1ezP5PtMNHnyZHtv1maunUm3OUZTIE4yBWdT+DQ/spkfQ0zf8XQwP9qYH8iOOOII2XXXXe35q14YNv3UTZ91c02fffbZqnDzHDPpnj17tjNe0/f+r3/9q31ttq/+w5h5jpjnsiZ5rVvD448/bu/x6swzwPzoeNppp8lWW21lw0yf6xdffNH+CGTuMXN9zj777FZKNQBUU1VnDADN9Pnnnyc6depUpx+p6efoMmHChDrN5s444wx1fWPdunWJ/fbbr852//rXvzw1n04ue+65Z2LlypXqdvF43PYJrt3HePXq1Q2eD9MktjF9FJNMOkx/yaY0XWyp5oe1m2Iml6uuusqeK83UqVPrbHPsscfav7m5uYmnnnqq3v2apr7Vt+3evbvtY1qftWvXJnr37l1jO9PMu77rbZgm+RdffHGN7Uwf3U2bNtW73Z///Gfbp7ixTD43/V6r78c0I29MM2rXNcjKyko8+OCD9W73ySefJAoLC2tsd/nll2dk82kzboDJG7W7MLz++uuN2t5crz/96U+JVatWpaz59Jw5cxITJ05MlJWVNfo4TJNr0xTfSxPmVPTtbanm0+Y+M/dj9W222WabxOLFi+u9x84991y1aTUAtDSePABSwvSVM4PbVP9iY/o3/vTTT871S0tLE127dq2xvvny1pg+wqYPa79+/eoUbr0Wik2ByXyha0hJSUmd/sF///vfE+lgBp8xX/yr98FtTBpbs1Bs+tI2htbvuKGCXHIg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TzxR+vbtK4FAwC7jxo1rVBxPPvmkHHPMMbLFFltIOByWDh06yPbbby+//vWv5eOPP077MQAAAABAY0efTvfiR226+fTcuXPlqKOOatK2FRUVcsopp8hzzz1XFVZQUCCRSES+/vpru0yaNEnuuOMOueKKK1KYagAAAABApmjzPwV07txZDjvsMLn66qvln//8p/Ts2bNR240fP76qQHzxxRfL0qVLZePGjVJWVibz5s2TAw44QOLxuIwePVo++OCDNB8FAAAAADTQp7gFFj9q0zXFBx54oKxbt65G2LXXXtuobadMmWL/HnzwwXLfffdVhQeDQdl9993l+eefly233FJKSkpsE2sTBgAAAABoX9p0oTgUavo8XStWrLB/99hjD+f7RUVF0r9/f/nwww9twRgAAAAAWksoEZCsNPf5jSUC4kf+rB8Xka233tr+1ZpGFxcX237F9RWcAQAAAABtm28LxRdddJH9+9prr8kll1wiy5Yts/9PJBK2dnjYsGG2hnjfffeVs846q5VTCwAAAMDP6FOcPr4tFJuC8DXXXGP7EN9///22/3BhYaHk5uba/sPffvut7Z/8yiuvNNhM24xkvWHDhhoLAAAAACDz+bZQbArDEyZMsNMumamYDFMzbKZkMsrLy20T6k2bNjUYl4nH9EFOLr179057+gEAAAD4B/MUp49vC8Vr1qyxUzmNGDHCNpGeM2eOrF+/3g7A9dRTT0n37t3lr3/9q+y9995VTas1Y8aMsQXo5LJkyZIWOw4AAAAAgE9Hn26O4cOH2/7EZkqmWbNmSSDw80hrpqb3hBNOkP3331922mkn+f77720z6kcffVSNKycnxy4AAAAAgLbFlzXF8+fPl3//+9/29ejRo6sKxNX16NFDzjnnHPva1BybAbgAAAAAoNWaT8fTvCR8WTz0Z6H4yy+/rHq9zTbbqOttt9129m9paamsXr26RdIGAAAAAGg5WX4dZCtp8eLFsuOOOzrXW7VqVdXr5GBcAAAAANDSQvGgZAXSW6cZpabYPwYNGlT12gym5WJGnZ4yZYp9/Ytf/EI6dOjQYukDAAAAALSMNt98+qeffrIjSSeXeDxe1eS5eriZbimpb9++cswxx9jXzz33nJx99tny3Xff2X7DlZWV8vbbb8shhxxiB9lK9jsGAMBPYglvCwAgvZiSKX0CiTY+glS/fv1s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sWPH2qbQLm+99ZaceOKJkpWVJVOnTpVf/vKXEg6HbfiVV14p5513nn1tBtDKVBSKAQAAACDDhQIxCQXiad5Hwv5dsmRJjdpdrZbYjCp9wgkn2DmFTW3x3nvvXfXesGHDbE3xLrvsIpMmTZKzzjpLDj300Kom02ZOY01JSYn9Wz0N6dTmB9oynbRffPFFOwS4+YXCjFZmJoo2i/ZrRpJ5P7lufYuZYwsAAAAA/KBjx441Fq1QbPoQ//jjj7L11lvXKBAnVQ+fPXu2/duvX7+qAnWyKXVtplBefd10a/M1xXPnzrUdu5vDzKfVpUsX9X3TFAAAAAAAWkswGJVgML39P4LirY/MDz/80GCNblFRkf27bt26qj7IZj5iU7k5b948W3tcmwk3Bg0aJC2hzdcUG507d5bDDjtMrr76avnnP/8pPXv29LT9fvvtJytXrlSXlvqFAgAAAADail69etm/CxYskOLi4jrvmymaPvzwQ/t6q622sn9Nf+Ojjz7avjZ9kGtbvHixvP322/a1aZrdEtp8odjMi2V+dTDV8bfddpucdtppniaRBgAAAIC20ac4/YsXZv5hM4q0mYv417/+dVVfYCMSicgVV1xha5NNy9yTTz656r1rr73WdlN9+OGHZebMmVXhpvbYDMwVi8XkpJNOkgEDBkhLaPPtgs0cWAAAAACAltW9e3d54IEHZOTIkTJ9+nR57bXXZM8997SFYNME2kzPFAwG5c9//rPtX5xkmkXfeeeddnRq0xX24IMPlh49esibb74pK1assE2sTbwtpc3XFAMAAAAAWsdZZ51lC8AjRoywI0u/8sordiBkMy7TmWeeaUelHjVqVJ3tTC3yyy+/LEcccYR8+umn8uyzz9r5iceMGSPvv/++dOvWrcWOoc3XFKfCF198ITvvvLN8//339pcM0zb+oIMOkosvvlh222231k4eAAAAAJ8LSVSdxz11+0g0abuBAwfaptBeDR482C6tjZpiETuv1vz58yUvL08qKirk66+/loceekh23313uf766xs8iWabDRs21FgAAAAAAJnP14Xi7bbbzg7O9dVXX0l5ebmsXbvWTiI9a9YsWyBOJBJyyy232Pbu9ZkwYYIdajy59O7du8WOAQAAAIBfpmRK/+JHvi4UmzbuZhqn/v37287gySHChwwZInPmzLGdxI1x48Y5hxhPMu3e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zZo1DY4ibfoTG+ZvcjTm6su4ceMaNfr05MmTbfjIkSOrwsxrV5zVmZGfk+ENNc1O7sMs5nV93nvvPTnzzDOld+/ekpubK7169ZIjjzxSnnjiCWmKN954Qy644ALZYYcd7KBkJk4T90knnSQzZsyQRCLRpHgBAMhk9CkGAGSkKVOmyPDhw53v/fjjj3Z588035fbbb5epU6fK0UcfLX5iCvI33XSTxOPxqrDly5fbZdasWTJ9+nQZP358o+IyI3OfffbZ8vzzz9d5b+nSpXZ56qmn7A8RpnDcrVu3lB4LAACtiUIxACAjlZaW2trSgQMH2sLYgAEDpEuXLvY9U0ibPXu2zJw5UzZs2GBrMt9++20ZNGhQjTgefPBBG4+p/TSF6O7du9uw2kzcjfHLX/5Snn76afnPf/4jf/nLX2zYZZddZsNb0t133101+rVhatKHDh0qhYWFMn/+fJk0aZI8+eSTNQrMGnP+9t9/f/nyyy/t/02N/CmnnGJri02t/Pfffy///Oc/5dNPP7U1yYMHD5Z3333X1iIDANAeUCgGAGSkAw880Daf3nbbbZ3vjx492haMjzvuOFvwveaaa+z/qxsyZIj9m5yGKT8/384r3FR9+vSxi6lZTTIF8ebE6ZUppP7ud7+zr0OhkEybNk1OPvnkOudm2LBhtna3IRdeeGFVgdjUPl9//fU23urMuTXLnXfeKZ988olttm4WAADaA/oUAwAy0k477aQWiJNMreWVV15pX7/yyiuybNkyae/uvfdeKS8vt6+vuOKKOgVio2PHjvL444/bmuP6mNpfU6g2zjvvPBk7dmydArERDAbljjvusDXKyTRUVFSk6IgAAGhdFIoBAG3aAQccUPXaNOtt75K1v6agagrFms0331zOOuuseuN65JFHql6bmuCGnHPOOfZvcXGxHeQLAID2gObTAICMNmfOHNunde7cubbp8MaNG6WystK5rulr3J6tXr26aiRt0w96iy22qHf9ww47TP7617+q75s+wobpH2yaUCebUWuq18SbdU1fbwAA2joKxQCAjFRSUmJrOp999tlGb2MGjWrPzMjSSQ01LW/MOsnpoUxzbDNYlxfr1q3ztD4AAJmKQjEAICOdeuqp8u9//9u+7tChg51yabfddrO1o2bArKysnz/CPv/8c/n9739vX8diMWnvPxQkmXPQEHPe6lN9wDCvIpFIk7cFACCTUCgGAGSct956q6pAvMsuu8hLL70kPXv2dK6bnZ0t7Ul9BfuCgoKq12bE7YZs2rSp3vdNfKZgbKa6Wrt2rceUAgDQPjDQFgAg45hCcNL48ePVArGxcOFCyXQ5OTmNrmFds2aN+l71PsTffvttg/ttaJ0tt9zS/jUF4+q10AAA+AmFYgBAxlm5cmWj+8W++OKLDcZnRmo2EolEClL3v/gaG2fnzp2rXjc0bdTbb7+tvtejRw/p16+ffb1gwYIafYxdzDRV9Tn44IPt33g8LrNmzap3XQAA2isKxQCAjFO9L2x9tZ3vvPNOowrFyWbHDTUnbqzqzZgbE6eZczlp9uzZ6npfffVVVbNxTXJALFOQ/dOf/qSut2rVKnnssccaNcWS8Yc//KFq/mMAAPyEQjEAIOPsueeeVa9vvPFGZ2Ht008/lZNPPrlRNbVbbbWV/Wv6zf7www/NTl8yPuPDDz9scP3DDz+8amCw++67z1nQNzXIJ510kkSj0XrjuvTSS+0USsZdd90lTz/9dJ11zLRVZqCyhkbj3muvveSUU06pOp/HHXec/Pjjj+r65lyb/t5XXXVVvfECANCWMNAWACDjnHjiidKnTx9bgJ03b55sv/32cv7559um1GaAqddff12mTZtm5ysePny4PPLII/XGN3jwYPnXv/5VVdM6atQo6dWrV1UzaBNvY6Y4SjKDf2222Wa2NvYf//iHdOvWTfbZZ58aI0IfeeSRVa9Nn2hTKztp0iQpLi62hdGLLrpIfvGLX0hFRYW8//779hjMsZnC7OOPP67ue+utt7b9rK+88kpbgDbnyixDhw6VwsJCmT9/vt3PkiVLbPhTTz1V77FMnDhRvv76a/nkk09sX27TPNsUzs3xdO/e3Z5jc5ym0Gxquc1c0Ntss43ccccdjT5fAABktAQAAK1g4cKFporXLsOHD6/z/rx58xLdunWrWqf2EgqFEn/84x8Tr776alXY2LFjnfsqKSlJDBgwQI2r9nZ9+/a14eav5qGHHlLjc328rl+/PrH33nur6+fl5SWmTJmSePjhh6vCzGvNDTfckAgEAmp8p5xySuLrr7+u9xwnbdy4MXH22WfXG1/15eCDD1bjAgCgraH5NAAgI+2+++62dnL06NG2ptg0GTZ9efv37y8XXnihzJ07V3772982uo/yu+++KzfccIPsscceUlRUVGOwrKY477zz5OWXX7a1qqZWO9mkWWP2aWq477nnHtl7772lY8eOdhtT63rxxRfLRx99JGeffXaj92+alZtBuU4//XRb6x0Oh2XzzTeXI444wtaiP/HEE42ersqc1ylTptg5n6+++mpbk21qiU2Tb1P73bdvXxkyZIiMGzdO3nvvPXnttdcanU4AADJdwJSMWzsRAAAAAAC0BmqKAQAAAAC+RaEYAAAAAOBbFIoBAAAAAL5FoRgAAAAA4FsUigEAAAAAvkWhGAAAAADgWxSKAQAAAAC+RaEYAAAAAOBbFIoBAAAAAL5FoRgAAAAA4FsUigEAAAAAvkWhGAAAAADgWxSKAQAAAAC+RaEYAAAAAOBbFIoBAAAAAOJX/w+WOECBEpCrQQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(fig)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9bb7d525-f727-4fbd-bc95-126111f52d0c", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/driver/check/EC_check.ipynb b/driver/check/EC_check.ipynb new file mode 100644 index 0000000000..dd8cd18dcf --- /dev/null +++ b/driver/check/EC_check.ipynb @@ -0,0 +1,582 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "887c003d-0904-4443-b0a8-d2c2675e4263", + "metadata": { + "jupyter": { + "source_hidden": true + } + }, + "outputs": [], + "source": [ + "import xarray\n", + "import pygmt\n", + "import pandas\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib.colors import ListedColormap,LinearSegmentedColormap\n", + "from matplotlib.ticker import MultipleLocator\n", + "from IPython.display import display" + ] + }, + { + "cell_type": "markdown", + "id": "4065b987-8ecd-4aa5-aa85-760c8a90cd14", + "metadata": {}, + "source": [ + "### config" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cb5587d5-bcc4-4023-b0ae-e28743fc0e76", + "metadata": {}, + "outputs": [], + "source": [ + "# variables\n", + "\n", + "#vname='Doppler velocity'\n", + "vname='radar reflectivity'\n", + "#vname='terminal velocity'\n", + "#vname='vertical air motion'\n", + "#vname='Ze-Doppler'\n", + "#vname='Ze-terminal'" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "5a951cf4-47ec-439a-bd6a-5b71e6ff3239", + "metadata": {}, + "outputs": [], + "source": [ + "# meridional zone\n", + "\n", + "zone='tropics'\n", + "#zone='mid-north'\n", + "#zone='pol-north'\n", + "#zone='mid-south'\n", + "#zone='pol-south'" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "25a7ea7c-98c0-4b2d-8174-d2995d734cb4", + "metadata": {}, + "outputs": [], + "source": [ + "# cloud regime\n", + "#ctype='ALL'\n", + "ctype='stratiform'\n", + "#ctype='convective'" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "950f2697-2451-4634-816b-139f78f8e0ea", + "metadata": {}, + "outputs": [], + "source": [ + "# only for Doppler or terminal or air velocity\n", + "\n", + "zonal_mean_flag = False\n", + "# True: zonal mean\n", + "# False: CFED" + ] + }, + { + "cell_type": "markdown", + "id": "414f7d1c-1b87-4fce-a618-92cb0b56a08c", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "### internal process" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "3295478a-ad57-45a5-924d-89965bf9a1cc", + "metadata": {}, + "outputs": [], + "source": [ + "Nlvdplr = 80\n", + "Nlvtemp = 57\n", + "NlvdBZe = 35\n", + "\n", + "temp = -79.0 + 2.0 * np.arange(Nlvtemp)\n", + "zgrd = -39.0 + 2.0 * np.arange(NlvdBZe)\n", + "vgrd = -7.9 + 0.2 * np.arange(Nlvdplr)\n", + "\n", + "Nlvhght = 60\n", + "hght = 0.125 + 0.25 * np.arange(Nlvhght)\n", + "\n", + "Nlvglat = 144\n", + "glat = -89.375 + 1.25 * np.arange(Nlvglat)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "125d2e01-a852-416d-a93c-86052f30bfdc", + "metadata": {}, + "outputs": [], + "source": [ + "# target region\n", + "\n", + "if zone=='tropics':\n", + " rgnID = 0\n", + "elif zone=='mid-north':\n", + " rgnID = 1\n", + "elif zone=='pol-north':\n", + " rgnID = 2\n", + "elif zone=='mid-south':\n", + " rgnID = 3\n", + "elif zone=='pol-south':\n", + " rgnID = 4" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "62a61e04-41b7-4dc0-af99-b8dfcc7b42b7", + "metadata": {}, + "outputs": [], + "source": [ + "# data access\n", + "\n", + "if vname=='Doppler velocity':\n", + " if zonal_mean_flag:\n", + " var=np.fromfile(\"../data/EarthCARE/vd_zonal_mean.grd\", dtype=np.float32)\n", + " var = var.reshape( (5,8,Nlvhght,Nlvglat) )\n", + " else:\n", + " var=np.fromfile(\"../data/EarthCARE/cfed_Vd.bin\", dtype=np.float32)\n", + "elif vname=='radar reflectivity':\n", + " var=np.fromfile(\"../data/EarthCARE/cfed_Ze.bin\", dtype=np.float32)\n", + " zonal_mean_flag = False\n", + "elif vname=='terminal velocity':\n", + " if zonal_mean_flag:\n", + " var=np.fromfile(\"../data/EarthCARE/vd_zonal_mean.grd\", dtype=np.float32)\n", + " var = var.reshape( (5,8,Nlvhght,Nlvglat) )\n", + " else:\n", + " var=np.fromfile(\"../data/EarthCARE/cfed_Vf.bin\", dtype=np.float32)\n", + "elif vname=='vertical air motion':\n", + " if zonal_mean_flag:\n", + " var=np.fromfile(\"../data/EarthCARE/vd_zonal_mean.grd\", dtype=np.float32)\n", + " var = var.reshape( (5,8,Nlvhght,Nlvglat) )\n", + " else:\n", + " var=np.fromfile(\"../data/EarthCARE/cfed_Wa.bin\", dtype=np.float32)\n", + "elif vname=='Ze-Doppler':\n", + " var=np.fromfile(\"../data/EarthCARE/pdf2_zv.bin\", dtype=np.float32)\n", + " zonal_mean_flag = False\n", + "elif vname=='Ze-terminal':\n", + " var=np.fromfile(\"../data/EarthCARE/cfed_zf.bin\", dtype=np.float32)\n", + " zonal_mean_flag = False" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "5f3a14a2-0e88-40be-9248-240a590fd3a1", + "metadata": {}, + "outputs": [], + "source": [ + "if zonal_mean_flag:\n", + " pass\n", + "else:\n", + " if vname=='radar reflectivity':\n", + " var = var.reshape( (5,5,Nlvtemp,NlvdBZe) )\n", + " window = 2.0\n", + " extent = [ -40.0, 30.0, 20.0, -80.0 ]\n", + " iy = np.where((temp >= -80.0) & (temp <= 20.0))[0]\n", + " ix = np.where((zgrd >= -40.0) & (zgrd <= 30.0))[0]\n", + " xtics = 5.0 ; ytics = 10.0\n", + " vmax = 0.2\n", + " origin='upper'\n", + " elif vname=='Ze-Doppler' or vname=='Ze-terminal':\n", + " var = var.reshape( (5,5,Nlvdplr,NlvdBZe) )\n", + " window = 2.0*0.2\n", + " extent = [ -40.0, 30.0, -6.0, 6.0 ]\n", + " iy = np.where((vgrd >= -6.0) & (vgrd <= 6.0))[0]\n", + " ix = np.where((zgrd >= -40.0) & (zgrd <= 30.0))[0]\n", + " xtics = 5.0 ; ytics = 1.0\n", + " vmax = 3\n", + " origin='lower'\n", + " else:\n", + " var = var.reshape( (5,5,Nlvtemp,Nlvdplr) )\n", + " window = 0.2\n", + " extent = [ -6.0, 6.0, 20.0, -80.0 ]\n", + " iy = np.where((temp >= -80.0) & (temp <= 20.0))[0]\n", + " ix = np.where((vgrd >= -6.0) & (vgrd <= 6.0))[0]\n", + " xtics = 1.0 ; ytics = 10.0\n", + " vmax = 2.0\n", + " origin='upper'" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "02c2d337-fb7c-4c23-a78b-111110b75c4c", + "metadata": {}, + "outputs": [], + "source": [ + "# cloud regime\n", + "if zonal_mean_flag:\n", + " pass\n", + "else:\n", + " if ctype=='ALL':\n", + " sel = var[rgnID,0:3,:,:].sum(axis=0)\n", + " elif ctype=='stratiform':\n", + " sel = var[rgnID,3,:,:]\n", + " elif ctype=='convective':\n", + " sel = var[rgnID,2,:,:]\n", + "\n", + "# warm:0 upper:1 conv:2 strat:3 other:4 all:5 w/o warm:6" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "5410286f-6ef3-4f4f-8545-9d9c00c979cb", + "metadata": {}, + "outputs": [], + "source": [ + "if zonal_mean_flag:\n", + " pass\n", + "else:\n", + " if vname=='Ze-Doppler' or vname=='Ze-terminal':\n", + " smpl = sel.sum()\n", + " smpl = smpl.T\n", + " nrm = 1e-2 * window * smpl.sum()\n", + " else:\n", + " smpl = ( sel.sum(axis=1) * window )[:,None]\n", + " nrm = np.broadcast_to(smpl,sel.shape)\n", + " \n", + " zero_check = (nrm < window)\n", + " work = np.zeros_like(sel)\n", + " \n", + " work[~zero_check] = sel[~zero_check]/nrm[~zero_check]\n", + " work[zero_check] = np.nan\n", + " cfed = work[np.ix_(iy,ix)]" + ] + }, + { + "cell_type": "markdown", + "id": "7c08110a-4bf0-420b-9d4d-5d05368ccc7b", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "43319578-dbc9-4500-88fa-5192ce01bbcf", + "metadata": {}, + "outputs": [], + "source": [ + "if not zonal_mean_flag:\n", + " pass\n", + "else:\n", + " if vname=='Doppler velocity':\n", + " sumID = 0 ; numID = 1\n", + " elif vname=='terminal velocity':\n", + " sumID = 2 ; numID = 3\n", + " elif vname=='vertical air motion':\n", + " sumID = 4 ; numID = 5\n", + "\n", + " if ctype=='ALL':\n", + " totl = var[0:3,sumID,:,:].sum(axis=0)\n", + " smpl = var[0:3,numID,:,:].sum(axis=0)\n", + " elif ctype=='stratiform':\n", + " totl = var[3,sumID,:,:]\n", + " smpl = var[3,numID,:,:]\n", + " elif ctype=='convective':\n", + " totl = var[2,sumID,:,:]\n", + " smpl = var[2,numID,:,:]\n", + "\n", + " zero_check = (smpl < 1.0)\n", + " zmn_work = np.zeros_like(smpl)\n", + " \n", + " zmn_work[~zero_check] = totl[~zero_check]/smpl[~zero_check]\n", + " zmn_work[zero_check] = np.nan" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "843e2f9c-a5d2-42ba-be18-29d4a07ffe0e", + "metadata": {}, + "outputs": [], + "source": [ + "if not zonal_mean_flag:\n", + " pass\n", + "else:\n", + " window = 0.2\n", + " xtics = 30.0 ; ytics = 2.0\n", + " origin='lower'\n", + "\n", + " extent = [ -90.0, 90.0, 0.0, 15.0 ]\n", + " zmn = zmn_work" + ] + }, + { + "cell_type": "markdown", + "id": "e316738a-98f2-4d0c-ad2f-73b2184e6b36", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "### make figure" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "21c37598-91ff-4b32-a1bb-cd565146fcc9", + "metadata": {}, + "outputs": [], + "source": [ + "colors=np.array(\n", + " [\n", + " [248,248,248,1],#white\n", + " [160,210,255,1],\n", + " [ 33,140,255,1],\n", + " [ 0, 65,255,1],\n", + " [ 0,185, 0,1],\n", + " [250,245, 0,1],\n", + " [255,153, 0,1],\n", + " [255, 40, 0,1],\n", + " [180, 0,104,1],\n", + " [ 45, 45, 45,1],\n", + " ],dtype=np.float64\n", + ")\n", + "colors[:,:3] /=256\n", + "color_listed=ListedColormap(colors)\n", + "color_linear=LinearSegmentedColormap.from_list('color_linear',colors=colors)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "e594689e-b171-4ff0-876b-ab02247e8ee0", + "metadata": {}, + "outputs": [], + "source": [ + "tmp=np.array(\n", + " [\n", + " [ 1, 64, 38,1],\n", + " [ 71,108, 25,1],\n", + " [154,125, 66,1],\n", + " [206,185,156,1],\n", + " [242,239,246,1],\n", + " [236,196,225,1],\n", + " [204,124,186,1],\n", + " [164, 65,138,1],\n", + " [101, 2, 75,1],\n", + " ],dtype=np.float64\n", + ")\n", + "tmp[:,:3] /=256\n", + "near0=LinearSegmentedColormap.from_list('lower',colors=tmp)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "e20b3b56-8732-400a-9ed0-8fb9d706bd6a", + "metadata": {}, + "outputs": [], + "source": [ + "tmp=np.array(\n", + " [\n", + " [ 26, 51, 51,1],\n", + " [ 35, 85,130,1],\n", + " [ 61,144,199,1],\n", + " [120,197,204,1],\n", + " [231,255,232,1],\n", + " ],dtype=np.float64\n", + ")\n", + "tmp[:,:3] /=256\n", + "lower=LinearSegmentedColormap.from_list('near0',colors=tmp)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "036d42bd-7b01-4dd1-8832-103e506fd51b", + "metadata": {}, + "outputs": [], + "source": [ + "N1 = 128\n", + "N2 = 256\n", + "\n", + "lower_linear = lower(np.linspace(0, 1, N1))\n", + "near0_linear = near0(np.linspace(0, 1, N2))\n", + "\n", + "hoge = np.vstack([lower_linear, near0_linear])\n", + "\n", + "zmn_color = ListedColormap(hoge)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "63251813-c7d4-4e45-a235-8341f6135216", + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "if zonal_mean_flag:\n", + " pass\n", + "else:\n", + " plt.ioff()\n", + " \n", + " fig, ax = plt.subplots(figsize=(16,9))\n", + " im = ax.imshow(cfed,\n", + " extent=extent,\n", + " interpolation='nearest',\n", + " origin=origin,\n", + " vmin=0, vmax=vmax,\n", + " cmap=color_linear,\n", + " aspect='auto')\n", + " \n", + " if vname=='Ze-Doppler' or vname=='Ze-terminal':\n", + " ax.set_title(\"2d-PDF: \"+vname, fontsize=32, pad=16)\n", + " else:\n", + " ax.set_title(\"CFED: \"+vname, fontsize=32, pad=16)\n", + "\n", + " if vname=='radar reflectivity' or vname=='Ze-Doppler' or vname=='Ze-terminal':\n", + " ax.set_xlabel(\"reflectivity (dB Ze)\",fontsize=22)\n", + " else:\n", + " ax.set_xlabel(\"velocity (m/s)\",fontsize=22)\n", + "\n", + " if vname=='Ze-Doppler' or vname=='Ze-terminal':\n", + " ax.set_ylabel(\"velocity (m/s)\",fontsize=22)\n", + " else:\n", + " ax.set_ylabel(\"Temperature (degC)\",fontsize=22)\n", + " \n", + " ax.xaxis.set_major_locator(MultipleLocator(xtics))\n", + " ax.yaxis.set_major_locator(MultipleLocator(ytics))\n", + " ax.tick_params(axis='both', which='major', labelsize=18)\n", + " \n", + " cbar = fig.colorbar(im, ax=ax,\n", + " orientation='vertical',\n", + " pad=0.02,\n", + " fraction=0.045,\n", + " shrink=1.0)\n", + " cbar.set_label(\"\", fontsize=13)\n", + " cbar.ax.tick_params(labelsize=16)\n", + " \n", + " \n", + " fig.tight_layout()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "59fc2653-f03d-4c20-9206-7589e180b816", + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "if not zonal_mean_flag:\n", + " pass\n", + "else:\n", + " plt.ioff()\n", + " \n", + " fig, ax = plt.subplots(figsize=(16,9))\n", + " im = ax.imshow(zmn,\n", + " extent=extent,\n", + " interpolation='nearest',\n", + " origin=origin,\n", + " vmin=-4.0, vmax=2.0,\n", + " cmap=zmn_color,\n", + " aspect='auto')\n", + " \n", + " ax.set_title(\"zonal mean: \"+vname, fontsize=32, pad=16)\n", + "\n", + " ax.set_xlabel(\"latitude\",fontsize=22)\n", + " ax.set_ylabel(\"height\",fontsize=22)\n", + " \n", + " ax.xaxis.set_major_locator(MultipleLocator(xtics))\n", + " ax.yaxis.set_major_locator(MultipleLocator(ytics))\n", + " ax.tick_params(axis='both', which='major', labelsize=18)\n", + " \n", + " cbar = fig.colorbar(im, ax=ax,\n", + " orientation='vertical',\n", + " pad=0.02,\n", + " fraction=0.045,\n", + " shrink=1.0)\n", + " cbar.set_label(\"\", fontsize=13)\n", + " cbar.ax.tick_params(labelsize=16)\n", + " \n", + " \n", + " fig.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "id": "bfc0da8a-a5c5-40b8-a0f7-ac1496802524", + "metadata": {}, + "source": [ + "### results" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "009c34ad-ecaf-426e-8917-5be596ed7295", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABjAAAAN5CAYAAACmCHL9AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA91xJREFUeJzs3Qd0VNXWwPGdTAoJCYFQpSMqHaSKFBVBAQFFxAIWmopdbE9ABRQF9aF+2AsqdgSlKk1AkKJIURFREOkgvYQSUudb++jkTZKZMJNJOZn8f2vdNe3euWfunYRw9t17hzidTqcAAAAAAAAAAABYJLSwBwAAAAAAAAAAAJAVAQwAAAAAAAAAAGAdAhgAAAAAAAAAAMA6BDAAAAAAAAAAAIB1CGAAAAAAAAAAAADrEMAAAAAAAAAAAADWIYABAAAAAAAAAACsQwADAAAAAAAAAABYhwAGAAAAAAAAAACwTlhhDwAAABQdW7dulQ0bNsjOnTslISFBUlJSJC4uTkqXLi3VqlWTZs2aSWxsbGEPEygUNWvWlO3bt2f6edHnEBxOnTolH374ocydO1d+/vlnOXTokJw4cSLTOk6nM+N+//795YMPPsh4/P7775vn4J9LLrlElixZkvH422+/Nc/ZICQkxOv5BwAAQN4ggAEAAHK0dOlS+eijj2TWrFmyd+/eHNcNDQ2VunXrypVXXik333yz1K9f/4xHd9SoUfLkk0/myVnIacI46+RyoPr16ycTJ070edLN2/GKjIyUEiVKSPny5aVixYpy7rnnmuPWpk0badGihYSHh+fZmAHkjv4sX3/99bJv3z4OIQAAAFCACGAAAACPfvzxRxkyZIh8//33Ph+h9PR0k6Ghy7PPPitt27Y1t+3ateMoezleiYmJZjly5Ihs2rTJBIxcSpUqJVdddZXceuutctFFF3EMgUKwfv166dq1q/k5he80S2X69OkZj88//3zp2bNnsT6Eejz0uLjo8dDjAgAAAO8IYAAAgEzS0tJk5MiRMmbMmBzLYWj2QJkyZSQpKSlbGRWX5cuXS/v27eU///mPPPfccxxpP2mZLs1+0UUzMl555RVTpgtAwbn//vszBS+io6Old+/e0rhxYylZsiSnwgudqHfPrtOsNQIY0zOVFdPMQAIYAAAAOSOAAQAAMmhPiz59+siXX36Z7ajUqFFDrrnmGnMlcpMmTaRs2bImiKE0gPH777/L4sWLZcqUKbJq1apM227cuNHnoxwfHy/PPPNMrs6KjslX3bp1k+7du0tu1alTx6/1W7dubSbwPNXVP3r0qFm2bNkiP/zwg6mtn9WKFSukVatW8vTTT8vQoUNzPW4AvtOfyUWLFmU8joqKkpUrV0rDhg05jAAAAEABIIABAAAyDBgwIFvwQht0P/HEE3LPPfdIRESEx6MVExMjLVu2NMsjjzxiJvgef/xxWbBggd9HV5uA33HHHfl+VrS/REHsxz3g4ev+tJTUu+++K++8844pLeWeHTNs2DDZs2ePvPzyy/k4WgCuLDJ3GsQleFGwNDBuK5p2AwAA5L9/LpsEAADFnk6If/LJJ5mOQ9WqVc2V/w8++KDX4IUnF1xwgXzzzTem9JEGJOCf8847z5Tc2rlzp9x+++3ZXtdSUi+99BKHFchnf/zxR6bHTZs25ZgDAAAABYgABgAAkG3btpkr+7OWY1q2bJnUq1cv10fopptuMs3Azz77bI5yLmh9/bfeeksmTJggISEhmV579NFHTdkuAPlHS7tlzUgDAAAAUHAIYAAAABk1apTpxZD1Kn/texGounXryrhx4zjKARg0aJApzZW1X4kGMQDkn6y/F119fwAAAAAUDHpgAABQzO3duzdb6agOHTqYZt55hUm/wGlj89mzZ8v69esznvvqq6/kzz//lHPPPVeKmu3bt8vq1atlx44dcvLkSZNtcuGFF5pm5zk5cOCAbNiwQTZv3myujj99+rTExcVJmTJlpFGjRqY/QV5+344dOybfffed7Nq1Sw4fPmxKommJr7Zt2+Z5eTT9LFqySJve79u3T44fPy4lSpQwje2rVatmjo32m8kvut+ffvpJdu/eLYmJiVKqVCm59NJLC6zng34PtIm99oDR3i96HitVqiT9+/f3aXvNSPrtt9/Md0S312yJChUqSKtWraR69epFuseBfp7vv//efC/084WFhUn58uXNz772HnI4HHm2L/3Mv/76q/k+HDx40Ow7MjLSZOVpLx/9OcvP7yEAAACQiRMAABRr48aN0xm6TMuUKVMKbP8jR47MtO8aNWrky370fd33o/vNTxdffHGm/fXr1y/g95wwYUK2c/X44487baOf1X2M77//fsZrn3/+ubNZs2bZPoe3Y5SamupcsGCB884773TWqVPH43bu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qVKl5Isvvsh05bL2jch6lXlWuo1ere+i53nGjBnmSnZvdB3N8MhtiRktCdO7d29xOBw+b3PrrbfKiBEjMh5rKRjXFe/+uuCCC0y9/8jISCks2vvC159fzUp45JFHsmX3PPzww2fs66JZJl9//XWm8ljaf+PAgQNiixdffFF27tyZ8VivzP/qq69Mhk5ONEPi1VdfNb1RXDTLRD+fNz/99JN88sknmZ677bbbzDZavswXzZo1Czg7Ia9l/Vn88ssvTbk0X79fH330UY7vV9jKlStn+gi5aAxFM7N8pRkb7m6//XaPJfgAAABswl8rAAAUYydOnMj2XGFOzuPMPJ0fT30AbDNu3DiJiYkpkH1pCaKszYW1lExOsk4CamkX7Q3gazPpguobofSzuffGONNn80bLbfkTPMlrWq5JF19NnjzZBDjdJ/i1hJavNIih5adctCRS1gnrwvxd/Prrr2c81vOipcG0740vNICjJc3cz6f2OvAma58MbQA+fvx4Keq0lJ42I3fRUmhaQswX2th63759mUppaX8I22Qtc6c9O7KWgvRk48aNmX5XaHks7UEDAABgOwIYAAAUY8nJydme89asFXbwFATwdB7dab8AvVLXfSlI2vdCe14UpKzNzrM2q3enNfOXLl2a6Tntp+ArbbZ9ww03SEHRYEndunUDauSuV89rX5HCpFd/+0OzRdzde++9Z8y8yCrredLsHBvMmzdPjhw5kvFYe3lo/wl/aBDCvYeR9kg5fPiwx98X2i/G3YMPPihRUVESDLJmTWRtyu1N1vU0iOmpEbwNQZpWrVplPD548KDpSeJv9kXPnj0z9XsBAACwlX1/kQEAgALjfhW3LVfzawmrZ555xq9tKleu7Pd+tGGxP1d/uyvMkjueyqEU5nh80b59+zydCDx27JgpCaXlf7Qxs15lnTUoow2O3bmX5slKmxG7b68Nwv1tiq6Tgf6UcsmpjM2mTZtMA2L9bHq+tVF7Vu4BC91Gy4jVqlXL5/106NBBCpMGHnxprO5eKkubR7vLzdXxGvjRiXrX8dNG0zbIGkg5UwPunAJTK1euNPf1O62BO23G7U5fd//+aAmhvn37SrC46aabZOjQoaZhtasx+p9//innnnuu1200CKDlumwuH5U1wOreRF2DE/q5vdHzrQ3E3d155535OkYAAIC8QgADAIBizNPV/Do5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DxO80JOkmRwnT54020+aNEliY2NN9Oumm27y+0QBAAAAAAAAAILP9OnTzQS/BhxWrlxpggtffvml/Pnnn6bKz7Jly+SJJ57w+f2aN28ukydPloMHD5ogyGeffWYCCTo3rfPWP/74ozz44IPZttN5bK1MpLfDhg0zgQud19Zbfaxz3fq6+8X+LrfffruZT9esD83g0P1rNaOvvvpKQkNDTYBm3bp1fh8bMjDcdOjQQRYvXiznnHOO/P777yba5U5Ta+rWrWtSZW644QZz4t29++67cuutt5r7K1askAsvvDDT67p+3759zX2NVOnJBAAAAAAAAAAUX5oRsWrVKnn66aflsccey/TasmXLTGaDlnLSjAZtVxCIjz/+WG6++WaTzXHs2LGMbA31+uuvy9133y3nnXeemR/XwINLenq61KtXzwQp3nzzTRk8eHDGaxs2bDDZGg6HQ/766y/TmsGdzpnr3LmnOfUzIQPDzd9//21utbZY1uCF0pN5/vnnm/snTpzI9voHH3yQEQjJGrxQeoJq1apl7n/44Yd+nSgAAAAAAAAAQHDZvXu3CV4o18Xv7tq1ayfVqlUzLQpmz54d8P60xYHSLArN0HDnqjqk89juwQulj6+//npzf+rUqR63a9u2bbbghfvnmjVrlt/9PAhguNFG3eqXX34x5aCy0oP7888/m/stWrTI9Jqm1Wh9MNW1a1ePBzskJES6dOli7mvNMgAAAAAAAABA8aVlnVR8fHzGxe9Ztfh3Ltq1biC0LJWKiIgw+/Q0lqxz32cah6/baQkq1/59lT3NoBjTBt5z5swxNbr69OljOrVrOSm1ceNGGTp0qCkfVbt2bdPI252m1GgajdLGJt64Xtu7d68cPnw425fERSNqrsbfSt9b1y9btqwJhAAAAAAAAACALZxOpxw/flwqV66c7er9/HT69GlJTk4W245F1jlcLQGlS1Zbt241t9WrV/f6ftWqVcu0biDjev7558397t27ZxqPnrtDhw7lOBbXOA4cOGCCEdrU25fPUKpUKbMkJCSYdevXr+/zmAlguNEG3Nqg+9FHH5UvvvjCLK7O7ppSo13ZNcihtcj0gLvbs2dPxv0qVap4PeDur+k23gIYGjx58sknfT6RAAAAAAAAAFDYdu7cKVWrVi2w4EVsbKzHajqFSZtxZ21BMHLkSBk1alS2dTVwoFzB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3Q4ePGiKG9WuXdvkByxVqpQZ6jZ9+nRTkAjpaWGot99+2wxNrFevnsm1GB0dLZUqVZKbbrrJFIfKjA5dzM5xv2zZMro/wH3vxvnef5qjc9GiRWZobNeuXc3QW/exmtEoy7Q43wev79043wcW5/K8xXk6/3FM230e5xyev/3O75bg/2bneyD/+57vgeBfo+Fcj1xzoUD56aefXEWKFNGrr54pM3v27HFVq1bNs2zRokVd0dHRnn83atTIdfTo0Xxrf0Hx8MMPp+pj7fO4uLhUz5UpU8a1evXqDNd//vnnzTKRkZGusmXL+px2796d758t1PterV+/3lW6dGnP8sWKFXNFRER4/n3NNde4EhIS8vVzFQTefeTu+9jY2FTPde7c2XX69OkM13/77bfNMuHh4Zke9998802+f7ZQ73vF+T5nvvzyy1T97D3puTwrnO+D1/eK833gcS7PO5yng4Nj2t7zOOfw/O93frcE9zc73wPB6Xu+B4J7jYZzPQKBERgFiBYD79OnjykI3rJlyyyXT05Oluuvv97U9tACLVqpXiu/6x0b7733nsTFxcmmTZtMBBupNW/eXF599VX59ttv5dixY3L27Fk5efKkuVti5syZpsD74cOHTaRfC+D4csUVV5iiN76matWq0fUB7nt9TosR6R0aenfAunXrzLp67E+YMMHcKbBkyRIZMGAAfZ/BOUP7f9KkSabQkvb9qVOnTC2fe++91yyjd3vdf//9mfZd5cqVMz3udSQMAtv3nO9zp2TJktK+fXt54okn5D//+Y+UK1fO721wvs//vud8n7c4lwcW5+ng45i26zzOOTw4/e7G75b8/83O90Dw/6/K90D+X6PhXI+ACUgYBPli3LhxJrJ5xx13eO6cyGwXTp8+3bNMRpHQOXPmeF5ftmxZHrc+tCxZssTTd7NmzUr3unv/XHnllUFpX2Hu+2effda8FhMT49q1a1e610eMGGFedzgcrh07duRTqwuGL774ItPX77//fk/f79271+edLVWrVs3DVoam3PY95/ucS05OTvecHsP+jsDgfJ//fc/5Pm9wLs8bnKeDh2PazvM45/Dg9Du/W4L3m53vgeD1Pd8DwbtGw7kegcIIjAJCo8rPPPOMyTH32muvZWsdjYSqtm3bZjhio3v37lK9enUz/8477wS4xaGtRYsWnvnff/89qG0pbLLqe/ex7H18e+vfv7+pBeN0OmX27Nl53NqCRc8VmXHf2aLWr1+fDy0qPHLb95zvc87hcORibQSz7znfoyDhPI1QlJvzOOfw4PQ7gvebne+B4PU9gneNhnM9AoUARgFx3333mRQ4Y8eONcOzsqJpolatWmXmO3funOEyWuSrU6dOZn7p0qUBbnFoW7FihWf+4osvDmpbCpvM+n7Hjh2yd+/eTI97DV64Uxhx3PunSJEinnkNACH/ZNb3nO9RGHG+R0HCeRpIjXM4Cttvdr4Hgtf3CN41Gs71CCQCGAXAtGnTZPny5dKhQwfp1atXttbZvn27qZmh6tev73M592ual/7o0aMBanFoSkhIMPVEtI7CXXfdZZ675JJLTJ0RX7Zt22b6uGjRoubCee3atU0wSmuPIPB9v3XrVs98do77H3/8kd3gh6+++soz36BBA5/L/fXXX9KkSRNzzMfExEiNGjVMrR3v9RG4vud8bwfO9/mL833e41weOJyn7cAxbQ/O4cHH75b8/c3O94Ad/1fleyB/r9FwrkcgEcCw3P79+01hLr0IOGXKlGyvd+DAAc98xYoVfS7n/Zr3OkgdydfRKvqoKYk0BZEWLmrVqpUJLEVHR/vsLi1kpD9WdP/pCf7nn3+W6dOnm4u7zz77LN0c4L7397jXwlNa+AtZO378uIwcOdLM6wgWDcb5oncYbdy4UaKiokwgVVPgabouHfbbp08fU4ANget7zvd24Hyfvzjf5z3O5YHDedoOHNP24BwefPxuyd/f7HwP2PF/Vb4H8vcaDed6BBIBDMvdf//9cuLECXnhhRfMXczZFR8f75nXu/998X7Nex38rVy5clK2bFmJjY31PKcXYseNGydVqlTJsKtq1qwpo0aNMkPmzp07J0eOHDEpwJYsWWKCFy6XS4YPHy5jxoyhqwPY9xz3eUODEHpXxR9//GF+qOhdFhmpUKGCPP/88/L999+b415HdbmHS+sIMvX222/LwIED86ilhbPvOe6Di/N9cHDc5x3O5YHH8RpcHNP24W8iePjdEpzf7Bzzwf3/Et8DwblGw3GPgApYOXC43n77bZd2aU6nRYsWperFd9991zz/j3/8w5WUlJTqteeff96zXkZmz57tef2XX37xuXeWLl3qWW716tUFdi8Guu99OXjwoGv06NGukiVLusLCwlxDhw71u61nz551NWvWzLxvsWLFXMePH3cVZDb1/fDhwz3bTfs3423q1Kme5Q4cOOAqqPKr7/v16+dZ580338xRW51Op+vGG2802wgPD3f9/PPProLMpr7nfB/4vq9atapZVr9rc4Pzfd71fWE739twPgrFc3l+KWzn6YKEYzrwsnMe5xwenH4vbL9b8lNWv9n5Hghe32eF74Gcy+oaDed6BBIjMCx18OBBGTBggDgcDlMDIyIiwq/14+LiPPN6B7Qv3q95r4OMXXTRRTJo0CBZvHixGTb34osvymeffeZXd+ldASNGjDDzmr5Ih9khMH3PcR94jz/+uOcultdee82kgMqJ8PBwGT16tOcumU8//TSg7SzMfc9xby/O93mH4z44OJfnDMervTimg4O/CTvxuyXvfrNzzNv7f1W+B/LuGg3HPQLJv6viyFSPHj2kS5cuOe6lEiVKeOYHDx5s0g49+OCDUqdOnXR5+hMTEz3z7tc037xO7iFy3nU0GjZsmOF76mtu3usU5r7PjubNm0vr1q3lm2++kalTp/r93i1btvTM79q1Swoym/o+7XFfvHjxTI97fV0LTRdUed33Tz75pCfNmQYfNKiaG1rUq0yZMibnLsd94Pqe833ennNyi/N93vR9YTvf2/Q9HErn8vxS2M7TBQ3HdP7jHG6vUPrdkh+y+5ud74Hg9X128D2QO76u0XCuRyARwAggLVaTWUFnf2jRWzV58mQzZcYd1Xz00UdN3jlVt25dE0nWO523bt0qnTt3znBdfc2dx65UqVJSUAWy77PLXQh6586dUpjZ1Pf169dPdWzr30Fmx329evWkIMvLvn/iiSc8Iya0noveWQE7+57zPUL5fO9LYTvfF5T9gowVtvM0kBXO4QgF/vxm53sgeH2P4F2j4VyPQCKFVIjS4tytWrUy8zqcKyNaSFqLSquOHTvma/tCgfuOlJyk3lqzZo1nvnr16gFtV2Hu+1q1ankKR/k67rWY+ooVK8w8x73vobjePwj1B2Ig/Prrr+aOXcVxH7i+53xvN873eYPzffBwLvcf52m7cUznP87h9uJ3S978Zud7wO7/q/I9kDfXaDjXI6ACWlED+SarIt5q+vTp5nUtprNmzZp0r7///vuebSxbtiyPW1xwJCcnu1JSUjJdRvtL+1X77sknn0z1Wlbrnjt3znX55ZebdWNjY13Hjh0LSLtDQW77Xj377LPmtaJFi7p2796d7vVXXnnFvO5wOFw7duwIaPtDwaBBgzznBS3IlV1Z7Td9/eabb/YUfv3pp58C0NrQktO+V5zvg1MIk/N9cIuQcr4PPM7leYfzdHBwTNt7Huccnv/9zu+W4P5m53sgOH3P90Bwr9FwrkegEMAI4QBGUlKSq0GDBmaZihUreoIUTqfT9cEHH7iKFy9uXuvcuXM+ttx+etH7sssuc/373/92/frrr6lO1nv37nWNHDnSBB6070qVKuX6448/Uq3/1Vdfudq3b+965513XPv27fM8n5iYaPZBs2bNPPtOL6YjcH2vjh8/7ipXrpxZpl69eq7169eb5xMSElyTJk1yRUVFmdcefPBBuj6NJ554wnNsjh071u+/Gz220+47Pd98++23rmuuucazbfo+sH2vON/nztGjR11//fWXZ6pcubLZF7pfvJ+Pj49PtR7n++D1veJ8H3icy/MO5+ng4JjOezk9j3MOz/9+53dLcH+z8z0QnL7neyC412g41yNQCGCEcADDfbKpVq2aZ1m9K71IkSKefzdq1Mj8+EHqPnP3j056wbtMmTKek7J7ql69umvjxo3puu7LL79MtVxMTIxZPzIy0vOc3oE+ZMgQuj3Afe+mQYvSpUt7lo+Li0vV/x07djQjYfC33377LdXxWbZs2UynV199NdN9Fx0dbfadPno/f88995gf7whc33O+D9xdi1lNvXv3TrUe5/vg9b0b5/vA4lyet/hdnv84pu0+j3MOz99+53dL8H+z8z2Q/33P90Dwr9FwrkcgUMQ7xFWrVk1++OEHkyNw/vz5pjh4ZGSkXHrppdKjRw/p37+/REVFBbuZVqlQoYLMnTtXvvrqK1m7dq0cOHDA5O13OBymvsJll10mN954o/Ts2VNiYmLSrd+gQQPT399++61s2bLFrHv8+HGT91KLiLZp00b69u1rlkNg+96tSZMmsm3bNnnllVfks88+k3379klsbKwpItW7d2/p06ePKaaJv2lhUe/5gwcPZto9p06dSvXvsmXLyhtvvGGO+82bN8tff/0lx44dkyJFiph6F1dccYXpd3dtHgSu79043+c/zvfBx/k+sDiX5y3O0/mPY9punMPzF79bgv+bne+B/O97vgeCf42Gcz0CIUyjGAHZEgAAAAAAAAAAQIBwCzIAAAAAAAAAALAOAQwAAAAAAAAA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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(fig)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "51b015e1-d4d4-4bf6-ab3e-e1df9e55e344", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/driver/check/MIROC_check.ipynb b/driver/check/MIROC_check.ipynb new file mode 100644 index 0000000000..7930b45ddc --- /dev/null +++ b/driver/check/MIROC_check.ipynb @@ -0,0 +1,262 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "2ad48f61-e598-4a15-89f8-a0483fe2c9fe", + "metadata": {}, + "outputs": [], + "source": [ + "import xarray\n", + "import pygmt\n", + "import pandas\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "dc10108f-956d-47bf-a02c-f42282da2ef1", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xarray.open_dataset(\"../data/MIROC_inputs/ctrl_MIROCinput.nc\", decode_timedelta=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "eaf47183-d94f-49f7-a397-ce248957a526", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "xarray.Dataset {\n", + "dimensions:\n", + "\tlat = 128 ;\n", + "\tlon = 256 ;\n", + "\tlevel = 40 ;\n", + "\thydro = 9 ;\n", + "\n", + "variables:\n", + "\tfloat64 landmask(lat, lon) ;\n", + "\tfloat64 skt(lat, lon) ;\n", + "\tfloat64 orography(lat, lon) ;\n", + "\tfloat64 sunlit(lat, lon) ;\n", + "\tfloat64 pfull(level, lat, lon) ;\n", + "\tfloat64 height(level, lat, lon) ;\n", + "\tfloat64 height_half(level, lat, lon) ;\n", + "\tfloat64 T_abs(level, lat, lon) ;\n", + "\tfloat64 qv(level, lat, lon) ;\n", + "\tfloat64 rh(level, lat, lon) ;\n", + "\tfloat64 gwvel(level, lat, lon) ;\n", + "\tfloat64 tca(level, lat, lon) ;\n", + "\tfloat64 cca(level, lat, lon) ;\n", + "\tfloat64 mr_lsliq(level, lat, lon) ;\n", + "\tfloat64 mr_lsice(level, lat, lon) ;\n", + "\tfloat64 mr_ccliq(level, lat, lon) ;\n", + "\tfloat64 mr_ccice(level, lat, lon) ;\n", + "\tfloat64 fl_lsrain(level, lat, lon) ;\n", + "\tfloat64 fl_lssnow(level, lat, lon) ;\n", + "\tfloat64 fl_ccrain(level, lat, lon) ;\n", + "\tfloat64 fl_ccsnow(level, lat, lon) ;\n", + "\tfloat64 dtau_s(level, lat, lon) ;\n", + "\tfloat64 dtau_c(level, lat, lon) ;\n", + "\tfloat64 dem_s(level, lat, lon) ;\n", + "\tfloat64 dem_c(level, lat, lon) ;\n", + "\tfloat64 mr_ozone(level, lat, lon) ;\n", + "\tfloat64 phalf(level, lat, lon) ;\n", + "\tfloat64 gcumf(level, lat, lon) ;\n", + "\tfloat64 Reff(hydro, level, lat, lon) ;\n", + "\tfloat64 lon(lon) ;\n", + "\tfloat64 lat(lat) ;\n", + "\n", + "// global attributes:\n", + "}" + ] + } + ], + "source": [ + "ds.info()" + ] + }, + { + "cell_type": "markdown", + "id": "47c43a93-1549-4475-bb14-62e92a04287b", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "4afebca7-6d9a-42e4-87f8-22381a3240cb", + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "data=ds[\"tca\"]\n", + "data.load()\n", + "\n", + "zid=10\n", + "hid=1" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "f18b7b21-31f7-4d84-b9b7-8a2f0c188704", + "metadata": {}, + "outputs": [], + "source": [ + "var = data.isel(level=zid)\n", + "#var = data.isel(level=zid,hydro=hid)\n", + "\n", + "#lat = ds[\"lat\"].values\n", + "#lon = ds[\"lon\"].values" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "faf8c56f-18c9-4d70-97b8-37c086594c59", + "metadata": {}, + "outputs": [], + "source": [ + "region = [ -180, 180, -75, 75 ]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "663f115e-1c8f-42d8-b233-3b7331f2c602", + "metadata": {}, + "outputs": [], + "source": [ + "lon, lat = np.meshgrid(var.lon, var.lat)\n", + "ll = np.column_stack([lon.ravel(), lat.ravel(), var.values.ravel()])\n", + "\n", + "grid = pygmt.xyz2grd(\n", + " data=ll,\n", + " region=region,\n", + " spacing=\"1.5d\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "e06f7d7f-9135-4007-85f5-9e91f679b585", + "metadata": {}, + "outputs": [], + "source": [ + "fig = pygmt.Figure()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "67a53630-fc07-4cbf-b5fc-eabc5b57a137", + "metadata": {}, + "outputs": [], + "source": [ + "fig.coast(\n", + " region=region,\n", + " projection=\"W15c\", # Robinson 投影(15 cm 幅)\n", + " land=\"lightgray\",\n", + " water=\"white\",\n", + " frame=\"af\"\n", + ")" + ] + }, + { + "cell_type": "raw", + "id": "9fce5808-e758-4045-a8bc-8ba746f09c6f", + "metadata": {}, + "source": [ + "pygmt.makecpt(cmap=\"turbo\", series=[float(var.min()), float(var.max())])" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "34d714ca-db20-4b4b-8081-9f540e4ccd3d", + "metadata": {}, + "outputs": [], + "source": [ + "fig.grdimage(\n", + " grid=grid,\n", + " cmap=\"turbo\",\n", + " shading=True,\n", + ")\n", + "\n", + "fig.colorbar(frame=\"af\", position=\"JBC+w10c/0.5c+h\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "431e1d02-99ff-4ca5-a28d-f4db72f1d58f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "metadata": { + "image/png": { + "width": "70%" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "fig.show(width='70%')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "44e22c8f-d7a4-4712-b678-48be425e163f", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a4076f67-bfdc-4c6f-963b-da9544d0da41", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/driver/check/dplrw_results.ipynb b/driver/check/dplrw_results.ipynb new file mode 100644 index 0000000000..e842de13d9 --- /dev/null +++ b/driver/check/dplrw_results.ipynb @@ -0,0 +1,663 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "cf1bab3d-ca36-498f-983d-9ac15198597a", + "metadata": { + "jupyter": { + "source_hidden": true + } + }, + "outputs": [], + "source": [ + "import xarray\n", + "import pygmt\n", + "import pandas\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib.colors import ListedColormap,LinearSegmentedColormap\n", + "from matplotlib.ticker import MultipleLocator\n", + "from IPython.display import display" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "b0efb38e-f221-4943-a019-581e93556deb", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xarray.open_dataset(\"../data/MIROC_outputs/ctrl_MIROC-COSP2.nc\")" + ] + }, + { + "cell_type": "raw", + "id": "bc8c7853-38c7-4cc9-8550-4bfe379c03d3", + "metadata": {}, + "source": [ + "print(ds.info())" + ] + }, + { + "cell_type": "markdown", + "id": "b8f95c55-be27-4e36-a6c7-05b04049a4d0", + "metadata": {}, + "source": [ + "### config" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "3a3345fc-48d9-4848-9c58-f15f9cd18508", + "metadata": {}, + "outputs": [], + "source": [ + "# variables\n", + "\n", + "vname='Doppler velocity'\n", + "#vname='radar reflectivity'\n", + "#vname='terminal velocity'\n", + "#vname='vertical air motion'\n", + "#vname='Ze-Doppler'\n", + "#vname='Ze-terminal'" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "69ff28b8-67d2-44c3-9d8e-a911178c77d1", + "metadata": {}, + "outputs": [], + "source": [ + "# meridional zone\n", + "\n", + "zone='tropics'\n", + "#zone='mid-north'\n", + "#zone='pol-north'\n", + "#zone='mid-south'\n", + "#zone='pol-south'" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "3ffbf5f0-78b4-4c4b-92b4-9c4366d502d9", + "metadata": {}, + "outputs": [], + "source": [ + "# cloud regime\n", + "#ctype='ALL'\n", + "ctype='stratiform'\n", + "#ctype='convective'" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "85cafa90-23d6-4e47-9192-3914b4f5c04e", + "metadata": {}, + "outputs": [], + "source": [ + "# only for Doppler or terminal velocity\n", + "\n", + "zonal_mean_flag = True\n", + "# True: zonal mean\n", + "# False: CFED" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "55690fe9-ec39-4e75-bb81-d63e519ddc1c", + "metadata": {}, + "outputs": [], + "source": [ + "# only for terminal velocity\n", + "\n", + "weight_factor='reflectivity'\n", + "#weight_factor='mass'\n", + "#weight_factor='number'" + ] + }, + { + "cell_type": "markdown", + "id": "7d8737ab-22e8-48cb-a8a6-9836451780c2", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "### internal process" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "65ec4419-02fe-4e9a-9f3d-50513d55cb91", + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "# data access\n", + "\n", + "if vname=='Doppler velocity':\n", + " if zonal_mean_flag:\n", + " var=ds['dplrw_Z']\n", + " else:\n", + " var=ds['dplrw_T']\n", + "elif vname=='radar reflectivity':\n", + " var=ds['Zef94_T']\n", + " zonal_mean_flag = False\n", + "elif vname=='terminal velocity':\n", + " if zonal_mean_flag:\n", + " var=ds['vfall_Z']\n", + " else:\n", + " var=ds['vfall_T']\n", + "elif vname=='vertical air motion':\n", + " if zonal_mean_flag:\n", + " var=ds['gridw_Z']\n", + " else:\n", + " var=ds['gridw_T']\n", + "elif vname=='Ze-Doppler':\n", + " var=ds['ZefVd_2']\n", + " zonal_mean_flag = False\n", + "elif vname=='Ze-terminal':\n", + " var=ds['ZefVd_2']\n", + " zonal_mean_flag = False" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "ddafada6-a47f-4209-9c0c-f6e4f927f017", + "metadata": {}, + "outputs": [], + "source": [ + "#grids\n", + "\n", + "lat=ds[\"latitude\"].values\n", + "lon=ds[\"longitude\"].values\n", + "\n", + "temp=ds[\"lvtemp_grid\"].values\n", + "zgrd=ds[\"lvdBZe_grid\"].values\n", + "vgrd=ds[\"lvdplr_grid\"].values\n", + "hght=ds[\"levStat\"].values" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "f4bc95c9-dfba-446e-8f8f-5658a52f3b40", + "metadata": {}, + "outputs": [], + "source": [ + "# target region\n", + "west=0. ; east=360.\n", + "\n", + "if zone=='tropics':\n", + " south=-20.0 ; north= 20.0\n", + "elif zone=='mid-north':\n", + " south= 20.0 ; north= 65.0\n", + "elif zone=='pol-north':\n", + " south= 65.0 ; north= 90.0\n", + "elif zone=='mid-south':\n", + " south=-65.0 ; north=-20.0\n", + "elif zone=='pol-south':\n", + " south=-90.0 ; north=-65.0" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "3a89e0da-5511-44b5-87cf-207dc9218307", + "metadata": {}, + "outputs": [], + "source": [ + "# location mask\n", + "lon_mask = (lon >= west) & (lon <= east)\n", + "lat_mask = (lat >= south)&(lat <= north)\n", + "\n", + "mask = lon_mask & lat_mask\n", + "\n", + "index = np.where(mask)[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "0fff3516-6f6c-4fc1-8f69-f2f61f4cac2c", + "metadata": {}, + "outputs": [], + "source": [ + "# cloud regime\n", + "if ctype=='ALL':\n", + " regime=0\n", + "elif ctype=='stratiform':\n", + " regime=1\n", + "elif ctype=='convective':\n", + " regime=2" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "aff2506a-5aae-4e4a-8212-d49d8eb9fef4", + "metadata": {}, + "outputs": [], + "source": [ + "# moment\n", + "if weight_factor=='reflectivity':\n", + " nmlz=1\n", + "elif weight_factor=='mass':\n", + " nmlz=2\n", + "elif weight_factor=='number':\n", + " nmlz=3" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "d969c24b-398a-4b8f-9795-bc36da1c0ad4", + "metadata": {}, + "outputs": [], + "source": [ + "if zonal_mean_flag:\n", + " pass\n", + "else:\n", + " if vname=='terminal velocity':\n", + " sel_work = var.isel(loc=index).isel(regimeID=regime).isel(nrmlzdID=nmlz)\n", + " else:\n", + " sel_work = var.isel(loc=index).isel(regimeID=regime)\n", + "\n", + " if vname=='radar reflectivity':\n", + " window = 2.0\n", + " xtics = 5.0 ; ytics = 10.0\n", + " vmax = 0.2\n", + " origin='upper'\n", + "\n", + " extent = [ -40.0, 30.0, 20.0, -80.0 ]\n", + " zlower = np.searchsorted(vgrd,-40.0)\n", + " zupper = np.searchsorted(vgrd, 30.0)\n", + " tlower = np.searchsorted(temp,-80.0)\n", + " tupper = np.searchsorted(temp, 20.0)\n", + " sel = sel_work[tlower:tupper,zlower:zupper]\n", + " elif vname=='Ze-Doppler' or vname=='Ze-terminal':\n", + " window = 2.0*0.2\n", + " xtics = 5.0 ; ytics = 1.0\n", + " vmax = 3\n", + " origin='lower'\n", + "\n", + " extent = [ -40.0, 30.0, -6.0, 6.0 ]\n", + " zlower = np.searchsorted(zgrd,-40.0)\n", + " zupper = np.searchsorted(zgrd, 30.0)\n", + " vlower = np.searchsorted(vgrd, -6.0)\n", + " vupper = np.searchsorted(vgrd, 6.0)\n", + " sel = sel_work[zlower:zupper,vlower:vupper]\n", + " else:\n", + " window = 0.2\n", + " xtics = 1.0 ; ytics = 10.0\n", + " vmax = 2.0\n", + " origin='upper'\n", + "\n", + " extent = [ -6.0, 6.0, 20.0, -80.0 ]\n", + " vlower = np.searchsorted(vgrd, -6.0)\n", + " vupper = np.searchsorted(vgrd, 6.0)\n", + " tlower = np.searchsorted(temp,-80.0)\n", + " tupper = np.searchsorted(temp, 20.0)\n", + " sel = sel_work[tlower:tupper,vlower:vupper]" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "c661218d-216c-4051-9143-720c20a8c947", + "metadata": {}, + "outputs": [], + "source": [ + "if zonal_mean_flag:\n", + " pass\n", + "else:\n", + " if vname=='Ze-Doppler' or vname=='Ze-terminal':\n", + " smpl = sel.sum(dim='loc', skipna=True).values\n", + " smpl = smpl.T\n", + " nrm = window * smpl.sum()\n", + " nrm = np.broadcast_to(nrm,smpl.shape)\n", + " else:\n", + " smpl = sel.sum(dim='loc', skipna=True).values\n", + " nrm = window * smpl.sum(axis=1, keepdims=True)\n", + " nrm = np.broadcast_to(nrm,smpl.shape)\n", + "\n", + " zero_check = (nrm < window)\n", + " cfed = np.zeros_like(smpl)\n", + "\n", + " cfed[~zero_check] = smpl[~zero_check]/nrm[~zero_check]\n", + " cfed[zero_check] = np.nan\n", + " if vname=='Ze-Doppler' or vname=='Ze-terminal':\n", + " cfed = cfed * 100." + ] + }, + { + "cell_type": "markdown", + "id": "f7fca1b0-e94f-41f0-a093-10c8fcb33ad9", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "f5ac58f0-3955-4da5-8641-261d4b534b89", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(40, 72)\n" + ] + } + ], + "source": [ + "if not zonal_mean_flag:\n", + " pass\n", + "else:\n", + " j_list = ( (lat + 90.0)//2.5 ).astype(int)\n", + " Nlev = hght.size\n", + " \n", + " if vname=='terminal velocity':\n", + " sel = var.isel(regimeID=regime).isel(nrmlzdID=nmlz)\n", + " else:\n", + " sel = var.isel(regimeID=regime)\n", + " \n", + " tmp = sel.sum(axis=1).values\n", + " smpl = np.zeros((Nlev, 72), dtype=var.dtype)\n", + " np.add.at(smpl, (slice(None), j_list), tmp)\n", + " \n", + " tmp = ( sel * vgrd[None,:,None] ).sum(axis=1).values\n", + " totl = np.zeros((Nlev, 72), dtype=var.dtype)\n", + " np.add.at(totl, (slice(None), j_list), tmp)\n", + " \n", + " zero_check = (smpl < 1.0)\n", + " zmn_work = np.zeros_like(smpl)\n", + " \n", + " zmn_work[~zero_check] = totl[~zero_check]/smpl[~zero_check]\n", + " zmn_work[zero_check] = np.nan\n", + " print(zmn_work.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "b2d2372b-bf50-4cd9-8387-bb066ec8d4f9", + "metadata": {}, + "outputs": [], + "source": [ + "if not zonal_mean_flag:\n", + " pass\n", + "else:\n", + " window = 0.2\n", + " xtics = 30.0 ; ytics = 2.0\n", + " origin='lower'\n", + "\n", + " extent = [ -90.0, 90.0, 0.0, 14.0 ]\n", + " hlower = np.searchsorted(hght[::-1], 0.0)\n", + " hupper = np.searchsorted(hght[::-1], 14000.0)\n", + " zmn = zmn_work[hlower:hupper,:]" + ] + }, + { + "cell_type": "markdown", + "id": "df06376c-0eee-4d88-98dc-8d4982ab3afd", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "### make figure" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "4f0215d7-c0c7-496d-9de9-77b79724dfdb", + "metadata": {}, + "outputs": [], + "source": [ + "colors=np.array(\n", + " [\n", + " [248,248,248,1],#white\n", + " [160,210,255,1],\n", + " [ 33,140,255,1],\n", + " [ 0, 65,255,1],\n", + " [ 0,185, 0,1],\n", + " [250,245, 0,1],\n", + " [255,153, 0,1],\n", + " [255, 40, 0,1],\n", + " [180, 0,104,1],\n", + " [ 45, 45, 45,1],\n", + " ],dtype=np.float64\n", + ")\n", + "colors[:,:3] /=256\n", + "color_listed=ListedColormap(colors)\n", + "color_linear=LinearSegmentedColormap.from_list('color_linear',colors=colors)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "f7e346ae-df53-4cc6-affe-3ef1193dfc51", + "metadata": {}, + "outputs": [], + "source": [ + "tmp=np.array(\n", + " [\n", + " [ 1, 64, 38,1],\n", + " [ 71,108, 25,1],\n", + " [154,125, 66,1],\n", + " [206,185,156,1],\n", + " [242,239,246,1],\n", + " [236,196,225,1],\n", + " [204,124,186,1],\n", + " [164, 65,138,1],\n", + " [101, 2, 75,1],\n", + " ],dtype=np.float64\n", + ")\n", + "tmp[:,:3] /=256\n", + "near0=LinearSegmentedColormap.from_list('lower',colors=tmp)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "45ecf13f-9b8e-4b94-b176-099acb1855f7", + "metadata": {}, + "outputs": [], + "source": [ + "tmp=np.array(\n", + " [\n", + " [ 26, 51, 51,1],\n", + " [ 35, 85,130,1],\n", + " [ 61,144,199,1],\n", + " [120,197,204,1],\n", + " [231,255,232,1],\n", + " ],dtype=np.float64\n", + ")\n", + "tmp[:,:3] /=256\n", + "lower=LinearSegmentedColormap.from_list('near0',colors=tmp)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "72913185-cab3-4fef-8434-98768042a687", + "metadata": {}, + "outputs": [], + "source": [ + "N1 = 128\n", + "N2 = 256\n", + "\n", + "lower_linear = lower(np.linspace(0, 1, N1))\n", + "near0_linear = near0(np.linspace(0, 1, N2))\n", + "\n", + "hoge = np.vstack([lower_linear, near0_linear])\n", + "\n", + "zmn_color = ListedColormap(hoge)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "0b29f7e6-d7a8-4ee1-bc10-62e4a3ae2209", + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "if zonal_mean_flag:\n", + " pass\n", + "else:\n", + " plt.ioff()\n", + " \n", + " fig, ax = plt.subplots(figsize=(16,9))\n", + " im = ax.imshow(cfed,\n", + " extent=extent,\n", + " interpolation='nearest',\n", + " origin=origin,\n", + " vmin=0, vmax=vmax,\n", + " cmap=color_linear,\n", + " aspect='auto')\n", + "\n", + " if vname=='Ze-Doppler' or vname=='Ze-terminal':\n", + " ax.set_title(\"2d-PDF: \"+vname, fontsize=32, pad=16)\n", + " else:\n", + " ax.set_title(\"CFED: \"+vname, fontsize=32, pad=16)\n", + "\n", + " if vname=='radar reflectivity' or vname=='Ze-Doppler' or vname=='Ze-terminal':\n", + " ax.set_xlabel(\"reflectivity (dB Ze)\",fontsize=22)\n", + " else:\n", + " ax.set_xlabel(\"velocity (m/s)\",fontsize=22)\n", + "\n", + " if vname=='Ze-Doppler' or vname=='Ze-terminal':\n", + " ax.set_ylabel(\"velocity (m/s)\",fontsize=22)\n", + " else:\n", + " ax.set_ylabel(\"Temperature (degC)\",fontsize=22)\n", + " \n", + " ax.xaxis.set_major_locator(MultipleLocator(xtics))\n", + " ax.yaxis.set_major_locator(MultipleLocator(ytics))\n", + " ax.tick_params(axis='both', which='major', labelsize=18)\n", + " \n", + " cbar = fig.colorbar(im, ax=ax,\n", + " orientation='vertical',\n", + " pad=0.02,\n", + " fraction=0.045,\n", + " shrink=1.0)\n", + " cbar.set_label(\"\", fontsize=13)\n", + " cbar.ax.tick_params(labelsize=16)\n", + " \n", + " \n", + " fig.tight_layout()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "d13229d3-98c2-4419-b993-2f1b09654904", + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "if not zonal_mean_flag:\n", + " pass\n", + "else:\n", + " plt.ioff()\n", + " \n", + " fig, ax = plt.subplots(figsize=(16,9))\n", + " im = ax.imshow(zmn,\n", + " extent=extent,\n", + " interpolation='nearest',\n", + " origin=origin,\n", + " vmin=-4.0, vmax=2.0,\n", + " cmap=zmn_color,\n", + " aspect='auto')\n", + "\n", + " ax.set_title(\"zonal mean: \"+vname, fontsize=32, pad=16)\n", + "\n", + " ax.set_xlabel(\"latitude\",fontsize=22)\n", + " ax.set_ylabel(\"height (km)\",fontsize=22)\n", + " \n", + " ax.xaxis.set_major_locator(MultipleLocator(xtics))\n", + " ax.yaxis.set_major_locator(MultipleLocator(ytics))\n", + " ax.tick_params(axis='both', which='major', labelsize=18)\n", + " \n", + " cbar = fig.colorbar(im, ax=ax,\n", + " orientation='vertical',\n", + " pad=0.02,\n", + " fraction=0.045,\n", + " shrink=1.0)\n", + " cbar.set_label(\"\", fontsize=13)\n", + " cbar.ax.tick_params(labelsize=16)\n", + " \n", + " \n", + " fig.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "id": "7289897a-0a71-4d38-9147-403391c657ad", + "metadata": {}, + "source": [ + "### results" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "11581c37-1a75-41ce-9f19-fe27c7436016", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABi4AAAN5CAYAAACfb8OmAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAArx5JREFUeJzs3Qd4bFW5MOA1k9MrVXrvggoIVpCqFBGUJsULqFgRRRQvWIALKihcUVRUsCACUlQQwYZIV0BAOtKkHHo/vSQz+3/W9iZ/knOSM0lWTlYm78uzyGTOzJo1u81kf/tbX6UoiiIAAAAAAABkoDrUAwAAAAAAAGgncAEAAAAAAGRD4AIAAAAAAMiGwAUAAAAAAJANgQsAAAAAACAbAhcAAAAAAEA2BC4AAAAAAIBsCFwAAAAAAADZELgAAAAAAACyIXABAAwrlUqlSwPI0dlnn93lWHXIIYcM9ZBYAkb6er/mmmu6vP9tt912qIcEAAxTo4Z6AAAAMJLFE33bbbfdYh83evToMHbs2DBlypSwwgorhNVWWy1stNFGYdNNNw3veMc7wsorr7xExgsAADDYBC4AAGAYaG1tLdusWbPC008/Hf75z3+Gyy67rOPfN9tss3DAAQeEQw89NCy11FJDOlaARn37298Or776asfvRxxxhGMYACBwAQAAzSAGMmI74YQTwlFHHRW+8IUvlBkaALkHLh5//PGO3+P0WoKvAICMCwAAyMxXv/rVsOyyy3a5r16vl1clx/biiy+G2267Ldx7772hVqt1edzMmTPDscceGy6++OJwySWXhHXWWWcJjx4AAGBgBC4AACAzBx54YFhzzTUX+7g4bdSVV14ZTjvttHD99dd3+be77747vO1tbwvXXntt2HDDDQdxtAD/EYtxF0VhcQAAA1YdeBcAAMBQmDRpUnjf+94XrrvuujJA0b1A9/PPPx923nnnLvPHAwAA5E7gAgAAmsA73vGOssbFFlts0eX+OHf84YcfPmTjAgAA6CuBCwAAaBKvec1rwm9+85uF6mOcd955ZU0MAACA4UCNCwAYQnF++r/97W/hqaeeCi+88EJoaWkpTzyuscYa4S1veUsYM2bMoLzus88+W77uo48+GubPnx+WWWaZcj79rbfeOkycOHHA/cf3c//994d///vfYfr06aG1tTUstdRS5cnUzTbbLKy//vphuItzeN9xxx1li9PxxN/jND1vfetbw3rrrbfY58dlcvPNN4d77rknvPzyy+VyX2WVVcJ222230EnngXjllVfC3//+9/Dcc8+V29ioUaPC8ssvX45xyy23LLe5gYrTEN13333hoYceKt/LnDlzwuTJk8PSSy8dNthgg7D55puXrzsYYmHqf/zjH+Guu+4qC1aPGzeufH9vetObytceiVZbbbXw/e9/P+y3334d98XtM9bBOPfcc/vcX3xuzOR44IEHym1o9uzZYbnlliuPVXF7jz8H6/h4ww03lNvVjBkzyu1p1VVXLY9T8XZqbW1t4ZZbbin3yZdeeimMHz++3KdjBsvaa68dhlI8Tt90001h2rRp5TpYsGBBuZ3H5bHVVluFCRMmJH/NuN5jnZS4bz3zzDPlGOJyf/e7391Q/ZXhdBx/8MEHy+Uat7P4ebjiiiuW9WEGa9tuVDyuxu0xji1+lsaxxfUej92rr7568teL+1r7sTQey+NxO67z+Jn9+te/vvwcBwBYYgoAGOEOPvjgWEUySfvZz37W0Gv+5S9/KXbcccdizJgxPfY1adKkYu+99y7uuuuuPr2f4447rks/8fd2t9xyS7HTTjsVlUplka8Zx/PBD36wePLJJ/v0mvPnzy9++9vfFoccckixxhprLHY5veY1rym+8IUvFM8880zRV937GizbbLNNl9e5+uqry/trtVpxxhln9Po+3/GOdxS33377IvudPn168cUvfrFYZpllFvnclpaWYv/99y+eeuqpfo+9ra2t3Bbf8pa3lP31NM44ho9//OPF008/3efX+Pvf/14ceeSRxRve8IYet6f2NnHixPI9/fOf/0y2vufNm1d89atfLbelnl53/fXXL375y18WuYvbVvexP/roowPqM24D3bfRcePGFbNmzWq4j7hdfPKTn+x1Gcd1/8Y3vrE4++yzy32jUfH9de4njrXdE088URx00EE9Hh9Hjx5d7LbbbsW9997bp2XSfXm0L+PZs2cXxx57bLHsssv2+D632GKL4ne/+12fXi/ug537iJ81fXXttdeW73XChAk9jm3s2LHlY2699dYky2Pu3LnFSSedVKy66qoD+pzryXrrrZesvze/+c1d+jr11FMbet4jjzxSHHrooYvdtrfccsvi4osvXqLr/ZVXXimOOeaYYvXVV+/1uPra1762OO2008rP34GI+9unPvWpYrXVVuv19arVark8vvGNbxTPPfdcw8ez+Fm6KI18V+iptW8zcd9daqmlFvlZ3VfxM6X7MeCPf/xjv/oCANIQuABgxFuSgYtXX321PMHUlz7jyYLDDjusaG1tHVDg4uSTT+71JHbnttxyyxX/+Mc/Gt42VlhhhX4tr3hCu68nhbr3sSQDF3H97bDDDg29t3gy8de//nWXPu++++5i7bXXbuj5K664YnH//ff3edxxvcUTWn1ZD/Gk6E9/+tOGX+P9739/v/eReEKuLye4F7W+//3vfxebbLJJw68ZT1DGE/kDOSYMt8BFFE8+d+/3sssua+i5p59+eq8nyxfVXv/61xcPPvjggAIXf/jDH4rJkyc39HoxsPGtb31rQCfq4wnsDTbYoOH3eMABBzR8onggJ7Cff/75Ytddd+3T8o8n2uNnRaPb+qKWx0MPPVRsuOGGvb7OQAMXX/va1xo6sb049913X5d+Ro0a1esJ9Sh+jn7+858vg199WbZbb7118cILLwz6er/ooot6DGr31NZcc83ipptuavg1Oi+Lo446qtcLKHpq2267bRaBi+iII47o8m/x86k/zjnnnC79rLPOOkW9Xu9XXwBAGmpcAMASEqfaiFOcXH755Yv890mTJpVTk3RXr9fLaV/22GOPMHfu3H699gknnBCOPvroclqddnEKiDjtxKKmCorTROy8887l9EKNThW0KO2vMWXKlFCpVBb69zjlzD777BPOOeeckLs4Tcpuu+0Wrrrqqi73xymRFjVNS3z8gQceWE5DEsWpSOI0UHH6rHZxmcSpNxY1JViczmuXXXYpp11q1KWXXhq22WabcnqR7uJrTZ06dZFTgcXX+NCHPhROPvnkAa3v+BpxXcepRXqaguqkk04KH/nIR0J/Pfnkk+V7jNOndF8PPU1z9uMf/zgcd9xxYaSJ21t3cdqwxfn85z8fPv3pTy9y2xs9enSP08XEKWbe/va3l1N39ceNN94Y3vve94aZM2d2uT++3qKmGovTJR155JENb7fdxel3dtxxx3IKrEaOxdH5558f9t577/K1B0scT5wq8Pe///0i/z1u54taBzHOFz8r4jKM0171Z4q/uM3861//6nJ/XBZx/0rloIMOCtXq//8z9LrrrutyXGzUz372sy6/xymsepvaKW5X73nPe8Kpp55aTtXX3dixY3v8TLz++uvLadHi8WewnH766eH9739/OUVTd3FM8bi6qM/Rxx57LGy//fY9bi89TSG40047hVNOOaXHbTkey3ta7/+JKefhk5/8ZJflEmv8xOkb++qHP/xhl98/9rGPLXJ5AwBLUKIACAAMW3/961+LH/zgB31uH/jABxa6CjBesbco8QrYrbbaaqHHxytb43NefvnljsfGKYK++93vllfcd3/8Rz7ykT5nXMTpgtqn8ll66aXL6XXilartVxLGsV133XXFu971roVeL77HRsTsgpjN8fa3v728yjsu0+5Xp8ZpGOJUVfGK+6lTp3Z5nXhl97/+9a+GXqv7GJdUxsWb3vSmjttxuoxf/epX5bRP7R577LHiS1/60kJX8sZlEt97exZEXBf77bdfeVVq5yu349RSe+2110LvL04r1Ygbb7yxvOK483Pj+j766KOLm2++uViwYEHHY1988cXi/PPPL6d56n7F9u9///vFvlacbiw+fqONNiqvXo5T6MSrtTtfnRqzKmLGyHe+852FpoaJ7Re/+EVD76v789761rd23I7TrcUMghkzZnQ8Pk4/Fq/C776NxWXTaAZLs2RcxO0r7pud+41X8ffmRz/60UJjiVNMxe2w83EjTid0xRVXlOug++NXXnnlchvrS8ZFnLInXjne/vv2229fXH755eXrtG9P99xzT3mF+KKulm9kSpfuV3h3nmYoXl0dr+LuPO54LI6ZJ4uaTijuV4Nx5X18/e5T9sRtNx6L//znP3fZ1uOyufLKK4s99thjofH993//d5+Xx8Ybb9xxOx4bzj333C7H8fja8bgXp4kbqJ133rnLa3/lK1/p0/Pj51b3z8hLL720x8fH7fbd7373QsspHufjdHKdp8uL21qcduszn/nMQvtPPJ4vLqOlP+s9br/dp9yLn6kxg+a2227reM14HI/Hi3333XeRGYyNZDzFvuL+1f358ZgZP8Ni9kbnz6Z4O34+fe973yu22267Mgu0tyyZRjMu4vbV/n2qe5ZJ/J7S2/ev7t8X2j+T2tvXv/71oi/uvPPOLs+P673RDBsAYPAIXABAP8QTaN3nVY51DeIJ6kanbIlTjvT0+CgGM972trf1eaqX7oGLzifbn3322V5P7MQaFZ2fE6eQiFOWLE4MRvTlRGscR+dAQKMnd6KhCly0t3iivrfpI2JAoPtzdt99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1tcg8HDKumikSHfczuL0ZO1iwGPTTTcd9PEBAI0TuACAHsTpR7oHKGJh4DjtAP/fkUceGW677bYuiyRODROvoo3Ta8X5o+OVnnHqkxhw6VzwOBYRZWB6KrY8UD0FFWKAKk6/0f2EZ5zy5ec//3m45ZZbyimkYjZFPNHYLEWuh6M4pU737cOJuTwt6f04J/HY0f0Ys6jMqMsvv7xL1kDM7tl+++2HZLmSr5hd0bngePye0T2AG/3oRz/q8nuKTBwAIC1TRQHAIsTClvGP37a2ti6FXLtPGbU4Sy+99EIZBbNmzerzHMrd56mPU7L098rMlB5++OGFro793Oc+V04j1EhB8LgsGHhB0s51VH7/+9/3u0B3IydBv/KVr3S5L2bbxDn/G5lmxvpesv76178udF9PdXm6H6v6Wwuk+7Eqbp+NSPV63d9H6tccyOv1pvty+sIXvhC+8Y1vhJEgFjyPU5i11414+umnw5///OeFjmPdp4k65JBDFjvVUffl+qY3vamse5GLJbnfdT9G51xTaiDGjBlTXnTyta99rUsti9NOO63HYEZcXvvuu+8SHysA0DsZFwCwiJPx7373u8sMgXZvf/vbwy9/+ctF1i7ozaJO5j722GMDLpwcT3bkMGVOnDu68xW92267bTj11FMbClpEL7744iCObmToXhcg1Zz7ixIza+Ic8Z2nGrn44osbnhvf+l5y4hXr3a8oHj9+fNhuu+0W+fju67A/x6n4mp23j74ELuLUO/3ZPrqPsy91Gh5//PEl+nq57Me5iZ+r//Vf/9VrkCLWquhchD1+/sXAxXBfrin2u0V9R1jUftd9WcTn5Dw940DEWhWdv6/FbMDO00J1nz4qbkux0DsAkBeBCwDodnJkp5126jIdxWtf+9rwu9/9rjzp15/5u7sXw7311lv73E/357z+9a/PYr3dddddXX7/wAc+0OfMFgam+9Q/cXqgJbW+d9tttz5dcW59Lzmx6Gz3IEK8orin49jrXve6AR+n7r///oXm/u/Lser222/v82t2397f8IY3DOrrdX9OX14vl/04R91rVVx22WVd6j+ce+65XTIgt9lmm4YKWXdfrjEw0D07YSil2O9ilsaDDz642P3ujW9840LPu+eee0IzWnXVVcss2XZxW4qZge3f8+JFF52DYIpyA0CeBC4AoNM0Nrvuumv497//3eWP3z/+8Y8Dmg7krW99a5ffL7nkkj49P2Y0xFoRjUz3sqQ9//zzC9W2aFS80jNOa8TAvPOd7+zye7wqebDmtR/I+o5iAJDBN23atHD44Yd3uS+enDviiCN6fE73Y8rf/va3hdb34vz617/u8ns8fvZlG/ntb3/bp9e76aabukyT1l5gd7Beb968eeFPf/pTv1+vL/txrA0Up0waKTbccMMun5WxsHznQtzdMzC618Xoydprr122zllBnTM3hlr3/S4GG/saUIvfKTof80ePHh223HLLhR4X98d11lmny30xIJSD7lmai6pxkqpI949//OOy/lLn6Q7XW2+9Ab8eAJCewAUAhFD+EbvXXnt1OWEQp8GJJzj6enK2uzjtVGexz0ceeaTh58eCpN2ngeje51DOJd3fObPjFEP9nRaD/y/OAz9hwoQuV713vpo0l/UdT6a3X/HK4InBhj333HOhKXHiVCi9FeaOV7BPnDix4/d4dXv36VR6EzMt4gnBgRyn4nR8na+yX5zuNYfiye9111234effd9994dprr2348eedd16XbT5ORZOqnkz8nIn1FzoHdkdKjYuesi7agxUxU+vee+/tuD/WiIqf143ae++9u/wel2suRcs33njjsMYaa3S577vf/W7Dz4/v43vf+16X+2LB8p6mPepexyHus30NUA6G7nW/UmTFxGnxYsZsu1tuuaXMaDnrrLO6PE5RbgDIl8AFACNe/MM/Xr0Zi4G2i3/0x6kqNtlkkwEvn/3337/LPNbxhGD8Q7mRuaXjVA6f+cxnutwXr6RMdZXvQMUrOLsHWRoRr5L+9Kc/PUijGlnidGSf/OQnu9wXt6/+zN/frqeTet3Xd7z6vPP0LT2JV88edNBBYcGCBWE4iCf5Y4ZC5zYcXH/99WHzzTdfaLqZeJX1t7/97V6fO2XKlHDwwQcvdIK3+xQ0PTn22GPDk08+2eW+vu7jMWjx3//93w09NgYcYiBhoCcgY2ZKvLp/cWL9jS9+8Ytd7tt9993DKqusElKJy7B7YOaKK67od3+5nJxv1Pvf//4uQdhYUydOZXT22Wf3+rjF+dznPtclKBezWY455piQg1hc/LDDDutyX6zH0GhALW4j3ff33va7+H2ic1Aj7nNxv2/kOD6YVlxxxS6/xwB8Ct2Xbayl0vmzceWVVy73YwAgTwIXAIx48URZ5+kS4omEOEXF1ltvnWTZxDnlP//5z3e578orrwyHHnpol+kKuotX9sYrlrtnW3Q/uTWUYjHuzuKJxMVNwxGn4orPy+Eqz2bahuMJmHZxDu+4/cYT2X0Rr0CPJ3+PPvroHq/K73wSP67LxW2Psch9vDr6mmuu6dNYaExcvnGqmLhPveMd7whPPfVUl3+PNXbiPhkDE42c4O18QjgWs33Xu9612Ayx//3f/y1bZ3Gdd77auVHxauivf/3rvT4m1n+IWSWdT8zHoFr3K/Ybcffdd4d99tmnS+He7mL2ys4779zlmBWzLboHMgYqHu/j8u4c8IvZAj/84Q/71E+s0fS1r32tHPNwErfR7pkUMesnZuL0Z5qodq95zWsWWlcxKBePdb2t90VNFRaDCjE42J9C8j35yEc+0uXEfdyu3/e+9y22JlDMYPvsZz+70IUNvWUBrbDCCuGoo47qcl+cDjOevG802+mhhx7q8za5OJtttlmX388888xevx81KgbMOx/7/vWvf3X59/g9rPs0VQBAPnxKAzCixelrTjnllC73vf3tby9P/PbnD/M4NcEGG2yw0P3xREG8cvaGG27oMg1GPDERTxLHE1ZxaqromWeeKU9EfvWrXy1vd/bRj360LIici/e85z3lCfP2udhjFkk8ARKv+Pzwhz8cNtpoo/JEd7z/zjvvDBdccEE5DUb7yaJ4IrwvU7XQc9ZF3Gbi8own19q37fh7LDYfT97E7TpOR9MeeIjrJD4mFtz++9//Xs73HwMXi7pKtfNJr/e+971d6rScdNJJ5TQuMTgXM4Hi/OpRvKo19vnNb36z42S69d24GATsnKnVvs7iFCoxqBlPnMap7eKJ957mg48nWGPdiTXXXLOh14y1AE477bTwsY99rOO+uB5jod+4fg888MByLvi4DcXtLAaj4uM7Z6tF8Zjwox/9qM8nl2PQJE4f96UvfSlcddVV5WvGaW/Gjh1bnsyNV2HHq++/853vLJS9E1+v+3Qzi/PmN7853HzzzWXtlVgk+ctf/nJ5/FpmmWXKf4/H31/96lflsbh7oPXII48MW2yxRUgtnqSP43r44YfL3+NyjifY45X1cb3EAFU8rsbASedARdwOYoZCzHq78cYby20iTkM03MTg0y9+8YsugYvOAar4+dq9blQjYoZF3F8612GJn/GxflRcrjHIE0+edy5eH+texWNizNCI2WWxxUBhavGzP27XMeDQ/l5jECHWv4jH4pgBFvfBeFFFPJkfj9dxucTP085iVkk8biwuQ+y4444rt5G//vWvHffF4Gbc/2NdiLgPxGnl2o/l8TXjMT7WvYnLL+73MTCesqB1fM34WdLuuuuuKwOf8ftOnEqr+9RXPX3X6m7SpEnl51/36bSiuA/FoBEAkLECAEawRx99NJ4lSNZ+9rOf9fhaTz/9dLHJJpv0+NzJkycX48eP7/Hfd9lll2LOnDmLfU/HHXdcl+fF3weyTNZYY41eH3/RRRf1OOaxY8cWyy67bFGtVhf6tx133LH485//3OW+bbbZZrHj697PYIlj6fw6V199dZ+eP5Bxxtfq63KJ/vSnPxVLL710j+ujpaWlWGaZZcptrVKp9Pi4ww47rMfXeOihh4qlllpqkc8bNWpUub7HjBmz0L+tssoqxbRp0/q8XAa6vg8++OCG99GenjPYX5m7r++BtilTphQnnXRSsWDBgn6N53Of+1yPfY8ePbrXbWy55ZYrbrnlln4dZ2688cbymNG9z/h68XV7es0TTzyxofcVX6Pz8/7xj38Ua6211iKPxRMmTOjx9Xbddddi/vz5i329uK11fl7crhrxyCOPFK973et6fP24706dOrXcD+M+3dPjNt544z4tj7hOhlq9Xl/kOmlvJ598cr/7nj17drHPPvv0uu9MnDixPIb1tr3F9sILLyRf79/5znd6PC7H9Rz3g57+PW6vV1xxRcPL4uWXXy623XbbXt9j3MbisWRR/9bbZ1J/P7922GGHho9xjRzH291///2LXG577LFHw30AAEPDVFEAsITEKVtixkVPGRMzZ85c5LQV8SrLWMMg1tzofDVoLuI0K3H+/M5XALeLc8fHaVa61/PYY489ygLS7Vd0kkacZiZedR2nDFqUeBX2yy+/XG5rPc1/H69sjUWOexKLH8dMiu7ZAFGcJz2u7+5Xw8f+4lW63WtkkNYb3/jG8K1vfavMpImZXP3dv0499dRw+umnL7KOQLz6uqcpZeJV4fGq7DhdTX/EK8zjttU9cyK+3qKmjYnvL2b0xEyJ/mYqxcyO7ldux/0jFhtflFhfIV6l371QfUrxyvebbrqpzFpb1HE17rvtmTc9ZdvEq+7f8IY3hOEmjjtmGCxKXBbx6vn+itvzRRddVO4jPU2dFjMq4jGst2mK4vGsp+LXAxEzFeP0T+0ZP53F9Rz3g0Udt2NGVcye2HXXXRt+raWXXrrMlIqv2dNUSXEbi3W2FiV+L0ktTtHZ02fXQMT1tcMOOyx0v6LcAJA/gQsAWIKmTp1aTkvyl7/8pfxDurcTi3GKgzi/eZzPPU4TkvM8zLHgZ6ynEKd16U2cfiJOhRKDFp2LpZLOWmutVU6/FQMFcVqnRmobxJNYcU71WF8gFk6P04X0Jp5cittlPMHY2zYcpwyKc+3Hx8aABwMTjwFxv4nLNe5LcXqVWN8knuyM07XFIr1xzvtG1nkjRavjXPYxaBqncertRHOckipOfRfXc5xKaiDi1GaxIHM8Qd1TcCBuc3F6vTj1T/f5+vuzv8R+vvKVrywyGNc5KBSPW3F6njh11WCLJ9l//OMfhwceeKCckqeRIuBxXHEqqTjlTqw/0714+XARi0Uv6sR4nM4pXgAwUHEfiVOgnXjiiQ1Np9UeBIpTl8WAUpyyLH4+D9aFALGmTAw8rr766r0+Nk4ZFoMwcRuJ04v1VdyP4rRr8f3EINnyyy/f6+Nj4CgGF+NzYvAutXicufrqq8uASpy+KwZA45hSBIm613tZZ511utSTAQDyVIlpF0M9CAAYqeIc2nGu6VgDIM5THk8MxD/e45zOcR7vwbyqd7DEeeFjZkl8T/H9xRNw8QRMPAkR3xdLVrxSN55QjnPmxyuJ41Xa8QRnvKo9ZkDEq1Hjydv+XkEbr06P23A82Rb7jifDYqHZePV9PNm3uPnWyV/8cyGe3I8nSONxKmYjxJP8seZJrGsSf/ZVrGURt7t28dgQ71vUtvXggw+Wt2MtgLjNxvn1F3VV+uLEK9PjCet2jz76aJf6HzFj6JZbbinrRcR9JZ4wjUGieOyKJzqHWgwkxZo0cWyxxX027sfxMyNmjay//vpLJKjSbGL9klhvKv6MtWNitkUMTMRtLAbiYoAgRTCwP2KNjbg9xv0uZj/EIHNc37G+SurP07ifx1pU7ft5PJ7HLM/4mnHbinVg4sUXw1E8TsV6Nu1iptZAg54AwOATuAAAAJaoRgIXqS0ucAE0n1hcPRZebxeDe08++WQ5VRwAkDdTRQEAAABN57vf/W6X3/fdd19BCwAYJgQuAAAAgKYSp0j8xS9+0eW+WJAcABgeBC4AAACAphFrbMVC77FmSbsdd9yxrA8CAAwPo4Z6AAAAAAD99cMf/rD8uWDBgrJ+zfnnn18WXG8Xi9l//etft4ABYBgRuAAAAACGrU984hO9/vtnP/vZsOWWWy6x8QAAA2eqKAAAAKAp7bfffuHkk08e6mEAAH0k4wIAAABoCqNGjQrLL798eNOb3hQ+9KEPhd13332ohwQA9EOlKIqiP08EAAAAAABIzVRRAAAAAABANgQuAAAAAACAbAhcAAAAAAAA2RC4AAAAAAAAsjGsAxdz5swJf/jDH8JXv/rVsOeee4Y11lgjVCqVsh1//PH96vPjH/94Rx9rrrlm8jEDAAAAAMBQaW1tDVdddVU46qijwpZbbhmWWmqpMHr06LDiiiuG3XffPVxxxRVDvnJGhWHslltuCbvuumuy/q6++upw5plnJusPAAAAAABycu2114Z3vvOd5e0YrNhqq63CxIkTw3333Rd+97vfle2jH/1o+OEPf1he4D8UhnXGRbT00kuHHXbYoYwO/fKXvywXdH+zNz7ykY+EUaNGhS222CL5OAEAAAAAYKhVq9Ww1157heuuuy4888wz4fLLLw8XXnhhuPvuu8MFF1wQWlpaygv8f/GLXwzZGId1xsXWW28dXn755S73HX300f3q60tf+lJ45JFHyp9PPvlkuPXWWxONEgAAAAAA8rD99tuXbVHe//73hyuvvDL85Cc/Ceecc0446KCDwlAY1hkXMfKTwk033RROP/30sP7664cvf/nLSfoEAAAAAIDhZrPNNit/Tps2bcjGMKwDFynMnz8/fOhDHwpFUZTpL+PGjRvqIQEAAAAAwJB46KGHyp8rrbTS0AxguE8VlcIJJ5wQ7r///nDooYeGbbbZpt/Bj9ja1ev1cgqrZZdddsiKlwAAAAAANKt4IfrMmTPDyiuvXNZsWFLmzZsXFixYEHJcHpVu56LHjh1btr549tlnw9lnn13ejnUwhsqIDlz885//DN/85jfDCiusEE455ZR+93PSSSeF//mf/0k6NgAAAAAAehenM1p11VWXWNBimfFLhbnh/1/EnotJkyaFWbNmdbnvuOOOC8cff3zDfbS1tYUPfOADYfr06eF1r3td+NjHPhaGyogNXMSVEKeIij9jfYulllqq330dc8wx4cgjj+z4Pa7Y1VdfvdxppkyZkmjEQE4eueO6ZH1VW0aHHOU6rlxVqmnqLrUr6rUsx5ayr5aE21it1prlsh8pUi6z6qgxodlVKnnO1loU9TASllnbgjkhR7luFy2j002lW2udF1JaMOfVZH2NGjsxWV9FPd2+VEl49WjK99g6d2ayvsZMmJqsr1Gjx4eU2lrnJuurdV66ZVZP+L0nV+ts+o6hHgIwDMyYMSOsttpqYfLkyUvsNWOmRQxa7F/ZPozJ6NT6gtAWfjnrrwudj+5rtsXHP/7xcNVVV5UzCf3qV78KY8YM3d9n+SzdJezkk08Od9xxR9htt93CvvvuO6C+ekq5iRuJwAU0p8mTJjZ9gKDa0vwnD1MSuOg7gYvmIXDRHCeoR07gIs+pXCuVtAHwPAMXaf/8nF9Nd/J29IgIXExK1ldrS7r3OGZCunGNGpM4cLEg3X7ZOirdMhsJgQvnUoC+GIqp+sdVx4QxlXzO51SLagi1gZ2P/sxnPhN+8pOfhKWXXjpceeWVYf311w9DKc+/mgbZfffdF0488cQyfeaMM84Y6uEAAAAAAMCQ+NznPtcxK9Gf//znsNlmmw35mhiRGReHHXZYmdYT61LECFL3ub/i9FHtBU3a/y1mVIwenU8UDQAAAACAJS8WA69mlEld/b+Mi/74whe+EL71rW+FqVOnlkGLLbbYIuQgn6W7BD366KMdtSniHGjd23nnnVf++xNPPNFx3/e///0hHjUAAAAAAKRx9NFHh1NOOaUMWsTpobbccsuQixGZcQEAAAAAAE2TcdFHX/7yl8M3vvGNjumhcgpajNjAxWOPPdbrvx9yyCHh5z//eVhjjTUW+1gAAAAAABguLrvssvC1r32tvL3uuuv2ONvQcsstF0499dQwFIZ94OKVV14Jtdr/n8CrXq+XP+fMmRNefPHFjvvHjRtXFuMGAAAAAID+qlSroZJRxkWljxkXL7/8csftW2+9tWyLEi/sH6rART5Lt59ihfPll1++o02bNq28P87N1fn+T33qU0M9VAAAAAAAGFKHHHJIKIpisW0oZyMa9hkXAAAAAACwJDMuqsM442I4GPaBi8GI+px99tllAwAAAAAAlqxhH7gAAAAAAIAlpZpZxkW1CTMumu8dAQAAAAAAw5aMCwAAAAAAaFC1WgnVSiWb5VUt8hlLKjIuAAAAAACAbMi4AAAAAACABqlxMfhkXAAAAAAAANmQcQEAAAAAAA2K9S1i1kUuqnU1LgAAAAAAAAaNjAsAAAAAAOhLjYucMi5CPmNJpfneEQAAAAAAMGzJuAAAAAAAgAbJuBh8Mi4AAAAAAIBsyLgAAAAAAIAGybgYfAIXAAAAAADQIIGLwSdwAWTr4duvTtZXvV4LKY0eOzFZX0XisaVSFOnGVam0hKZ/jyHP95havW1Bltt+vZZuXCNFrseekaBSbRkR6zHp+wzp3metdV6mn2+tyXqqjhqdrK96rTXLZZ/+2J/uu12u+1Glkm6m6NHjpyTrq2XUmGy/c44eOylZX6PGjM/y2N+WcL8cMy7ddgEAAhcAAAAAANCgSrVaZl3kotKEpayb7x0BAAAAAADDlowLAAAAAABokBoXg0/GBQAAAAAAkA0ZFwAAAAAA0KBqpVq2XFQzGksqzfeOAAAAAACAYUvGBQAAAAAANEiNi8En4wIAAAAAAMiGjAsAAAAAAGhQtVIpsy5yUS0qodnks3QBAAAAAIART8YFAAAAAAAM1xoXRT5jSaX53hEAAAAAADBsybgAAAAAAIAGybgYfDIuAAAAAACAbMi4AAAAAACABsm4GHwyLgAAAAAAgGzIuAAAAAAAgAbJuBh8Mi4AAAAAAIBsyLgAAAAAAIAGVarVMusiF5Uin7Gk0nzvCAAAAAAAGLZkXAAAAAAAQIPUuBh8Mi4AAAAAAIBsyLgAAAAAAIAGybgYfDIuAAAAAACAbMi4AJJ6+Pars1yiRb2WbX9FvR5ylHJclWq65VWptqTrq9KS7zZWJOwv4SZWa52XrK9KtZrp9prnuFJLuY2l3JfqYUHIUcpjT8p9sl7Lc3lFlSLhMkuonvR4na6vasJtrKhXs9wnk362hRDGjJuarK/R46Yk66so8jz2jx47KcvPyrb5s5v+MyT1d8Wkn0kM6d+7626+XdP/LZ7r8oKBknEx+GRcAAAAAAAA2ZBxAQAAAAAADapWKmXWRS6q9UpoNvksXQAAAAAAYMSTcQEAAAAAAMO1xkU1n7Gk0nzvCAAAAAAAGLZkXAAAAAAAQINkXAw+gQsAAAAAAGiQwMXgM1UUAAAAAACQDRkXAAAAAADQIBkXg0/GBQAAAAAAkA0ZFwAAAAAA0KBKtVpmXeQ0nmbTfO8IAAAAAAAYtmRcAAAAAABAgyrVStlyUcloLKnIuAAAAAAAALIh4wIAAAAAAPpQUyKnuhKVjMaSSvO9IwAAAAAAYNiScQEAAAAAAA1S42LwybgAAAAAAACyIeMCAAAAAAAaVK1Uy5aLakZjSaX53hEAAAAAADBsybgAAAAAAIAGVSqVss5FTuNpNjIuAAAAAACAbMi4AAAAAACABsVsi0o1n5yASkbZH6nks3QBAAAAAIART8YFAAAAAAD0KeMinyyHSkZjSUXggqb08O1XJ+tr3c23C80u5fKavNxayfqa/cqTIVdFvZ6ur6IWclSptIRml+uyj4p6Lcv8ylptQcLOQp5yHVfG21jLqDHJ+gr1PPfxSsLjfgitI+I4lnKZpXyf9ZTHsYSq1fFZfk+p19JtrwvmzggptYwel6yvMWGpZH3RN5Vq83/njGoJ96WWTL8PtM6flayvJ/51R7K+WlpGJ+trwtSVQkqP3XNL0v4AmonABQAAAAAANKharZYtF9WMxpJK870jAAAAAABg2JJxAQAAAAAADVLjYvDJuAAAAAAAALIh4wIAAAAAABpUqVTLlotKRmNJpfneEQAAAAAAMGzJuAAAAAAAgAapcTH4ZFwAAAAAAADZkHEBAAAAAAANqlarZctFNaOxpNJ87wgAAAAAABi2ZFwAAAAAAECD1LgYfDIuAAAAAACAbMi4AAAAAACABlWq1bLlopLRWFIRuAAAAAAAgAZVKpVyuqicxtNsmi8UAwAAAAAADFsyLgAAAAAAoEGVSjVUK9WsxtNsmu8dAQAAAAAAw5aMCwAAAAAAaFCsb5FVjYtqPmNJRcYFAAAAAACQDRkXAAAAAADQp4yLfHICKjIuAAAAAAAABk8+YaF+mDNnTvjDH/4QvvrVr4Y999wzrLHGGqFSqZTt+OOP7/W5Tz31VDjjjDPCPvvsE9Zdd90wfvz4sq211lph//33D3/961+X2PsAAAAAAGB41bjIqTWbYT1V1C233BJ23XXXPj9v2rRpZZCjKIqO+yZMmFD+/thjj5XtggsuCB/60IfCmWeeGVpaWhKPHAAAAAAAaLqMi2jppZcOO+ywQzjqqKPCL3/5y7Diiisu9jm1Wq0MUsTn/fznPy+zL2bPnh1mzZoV7r333rDHHnuUj/vpT3+62MwNAAAAAABGjmq1ml1rNsM642LrrbcOL7/8cpf7jj766IaCHbfddlvYfPPNu9wfV/BrX/vacMkll5SZHH/84x/Dt7/97fClL30pjBs3Lvn4AQAAAACAJgpc9HcKp6lTpy4UtOgs1siI00TFwEXMwrj//vvDZpttNoCRsjgP3361hcSIVamkm46uKGpZ9hXqIUv1Wmu6vuoJl1di1Wq6baxeWxCaXcp9Mmcp9/GU23/KC4VGwrhyPVbkvI0VCfuqpDy+Zrq91toW5PndIoTQtmB2sr5qrfOy7Ks6anSyvuan3MZa0o2rKOoZfyeoZnnsCQmXf0o5r8ss12Piz5GRIOW5o3U33y5ZX4xMudWVqGQ0llSaL4ckkc4ZFnFqKQAAAAAAYPAN64yLwXTNNdeUP8eMGRPWX3/9oR4OAAAAAAAZqFSrZctFJaOxpCJwsQiPPvpo+OEPf1jefv/73x+mTJnS60KcP39+2drNmDEj9XoCAAAAAIARoflCMQM0d+7csM8++4Q5c+aE5ZZbLpx88smLfc5JJ51U1s1ob6utttoSGSsAAAAAAEtWrJGcW2s2AhedtLW1hQMOOCDcdtttYfTo0eG8884LK6+88mIX4jHHHBOmT5/e0aZNmzaY6wwAAAAAAJqWqaI6FeA+8MADw6WXXhpGjRoVzj///PCud72roYU4duzYsgEAAAAA0Nyq1WrZclHNaCypNN876mfQ4gMf+EC46KKLQktLSzj33HPD3nvvPdTDAgAAAACAEWfEZ1y0Z1pceOGFHUGLWJAbAAAAAAC6K+tKVPOpK1FpwhoXo0Z60CLWtOicabHffvsN9bAAAAAAAGDEGjXSMy1i0CLWtJBpAQAAAADA4lSq1bLlopLRWFIZ9oGLV155pQxCtKvX6+XPOXPmhBdffLHj/nHjxoVJkyZ1qWkRp4dqL8S9zz77DMHoAQAAAACAzoZ9KGazzTYLyy+/fEebNm1aef8pp5zS5f5PfepTHc+58cYbwwUXXNAx/9fhhx8eVlxxxR5bDHAAAAAAAECsb5FbazbDPuOiP9qzMqLW1tbw3HPP9fr4uXPnLoFRAQAAAAAAwz5w8dhjj/X5Odtuu20oimJQxgMAAAAAQPOqVqtly0W1H2N54IEHwp///Odw2223le3+++8vSyyceOKJ4ctf/nIYasM+cAEAAAAAADTuBz/4QfjOd74TcpVPWAgAAAAAADIX6ybn1vpqk002CZ///OfDeeedV2Zb/Nd//VfIiYwLAAAAAAAYQQ499NAuv+c09VUkcAEAAAAAAI2qVkIlpxP91b5nXOQuo6ULAAAAAACMdDIuAAAAAACgQZUy4yKfLIfK/41lxowZXe4fO3Zs2YYjGRcAAAAAANCgOE1Ubi1abbXVwtSpUzvaSSedFIYrGRcAAAAAADDMTZs2LUyZMqXj9+GabREJXAAAAAAAwDCfKmrKlCldAhfDmamiAAAAAACAbMi4AAAAAACAvmRctOSXcdFMBC7IwpTXrBty9dRD9ybrq2X0+GR9zZn+dLK+qi2jk/U166UnkvVVqy1I1ldLy5hkfTG0ino9WV/1ei3kqkg4tnRLLK16W2uyvooiz3VZqbSk6+v/iq3luC+lle54XU/4OZJyXCn375TbflFPt72mlnJd1mvpjj0p98p6SPkeQ5bba9uCuSFXC+bNCDlKeewvKgk3jIR/P6TcxirVfI9jKdUzXWa11rlZfk8cvdRKWW6vqf8Wn7TMGtl+70xl/pxXh3oIwBIkcAEAAAAAAMO8xkUzEbgAAAAAAIAR5Pbbbw+f/OQnO35/5JFHyp8/+tGPwuWXX95x/yWXXBJWWild9lqjBC4AAAAAAGAEZVzMmDEj3HzzzQvd/+STT5at3fz588NQELgAAAAAAIARZNtttw1FUYRcCVwAAAAAAEAfitjnVMi+ktFYUmm+dwQAAAAAAAxbMi4AAAAAAKBBlZZK2XJRyWgsqci4AAAAAAAAsiHjAgAAAAAAGlSpVsqWi0pGY0lFxgUAAAAAAJANGRcAAAAAANAgGReDT8YFAAAAAACQDRkXAAAAAADQoEq1WrZcVDIaSyrN944AAAAAAIBhS8YFAAAAAAD0pcZFSyWr8TQbGRcAAAAAAEA2ZFwAAAAAAEBfMi4yynKoZDSWVGRcAAAAAAAA2ZBxAQAAAAAADZJxMfhkXAAAAAAAANmQcQEAAAAAAA2qVPOqK1FpwvSEJnxLAAAAAADAcCXjAgAAAAAAGlRpqZYtF5WMxpJK870jAAAAAABg2JJxAYtRr9eSLaNqka6vBfNmJOtr1OjxodkVCZf9SNle08pzXEXC5VWvLQi5qhQtWS6zlPtlynGlVGlJt+zzPi6Obvp1ORK2/dTba66fvUnXZSXPfbyo18NIUBTp3mdrwu/WKeX6/WL0mElhJKiOSvf5llKlmu7YU2/LcxurVKtNv+xzluv7HD12YrK+Hr796mR9rbv5dsn6YviI9S3yqnFRCc0mz08CAAAAAABgRJJxAQAAAAAAjcos4yLkNJZEBC4AAAAAAKBBpooafKaKAgAAAAAAsiHjAgAAAAAAGlSpVkOlpZrVeJpN870jAAAAAABg2JJxAQAAAAAADVLjYvDJuAAAAAAAALIh4wIAAAAAABok42LwybgAAAAAAACyIeMCAAAAAAAaJONi8Mm4AAAAAAAAsiHjAgAAAAAAGlRpqZQtF5WMxpKKjAsAAAAAACAbMi4AAAAAAKBBlWq1bLmoZDSWVJrvHQEAAAAAAMOWjAsAAAAAAGhQpVopWy4qGY0lFRkXAAAAAABANmRcAAAAAABAg2RcDD4ZFwAAAAAAQDZkXAAAAAAAQF8yLlryqStRUeMCAAAAAABg8Mi4AAAAAACABqlxMfjUuAAAAAAAALIh4wIAAAAAAPqUcZFPTkClCWtcCFwMosfvuzVMnjRpwP1MWGqlkMqM5x9O1tfsV59O1tf4KSuElIp6LVlfLaPGJOtrwZyWZH1VKun6WjB3RrK+qqNGhxzVWtNtE1Glmue6pG+KIu12kauUx8R6rTVZX20L5mY5rqT7d9uCZH1VE44rZ6PGTEzWV70t5XaRbj8q6vWQo1p9XtL+6rUFWe6Xba3p3ufohOOqt+a5vOoJj2Mpj9WppXyfKZd/ys/wlEbKd6iUf0Pk+p0/7WdlPifwBmv/riU+jqXcx2utKb9bJ/wO25LunEq1ZXSW3zmBwSFwAQAAAAAADVLjYvDlGQ4HAAAAAABGJBkXAAAAAADQoEpLpWy5qGQ0llRkXAAAAAAAANmQcQEAAAAAAA1S42LwybgAAAAAAACyIeMCAAAAAAAaJONi8Mm4AAAAAAAAsiHjAgAAAAAAGlWp/KflopLRWBIRuAAAAAAAgAZVKpWy5aKS0VhSMVUUAAAAAACQDRkXAAAAAADQl3SAnFICqqHpNOFbAgAAAAAAhisZFwAAAAAA0LDMinOHnMaShowLAAAAAAAgGzIuAAAAAACgUZXMMi4qGY0lERkXAAAAAABANmRcAAAAAABAX9IBckoJqIam04RvCQAAAAAAGK5kXAAAAAAAQKPUuBh0Mi4AAAAAAIBsyLgAAAAAAIBGVSqhErMuclHJaCyJyLgAAAAAAACyIeMCAAAAAAD6kg6QU0pANTSdJnxLAAAAAADAcDWsMy7mzJkTrr322nDbbbeF22+/vfz5xBNPlP923HHHheOPP36xfTz33HPhm9/8Zrj88svL544fPz5svPHG4eCDDw4f/vCH85qrrIkV9Vra/op0/dWTji3t+6RJttlq87/Hol5P1ld11OhkfdVa54VcVSotWR4Tk24XRbrtIqWU77HSUs308yitStLtIt/3maOcl1fSfama7pg4Ur4P53jsyfU9Jj/GZrrMqqPGJOurrXVult95Ukt57Kkm/M5fb0vXF81zHEup1rYgWV+t82cn62vcpGWz3L8fvv3qZH2tu/l2yfpikMVzxjmdN65kNJZEhnXg4pZbbgm77rprv58fAx077bRTeOmll8rfJ02aFGbOnBluuOGGsv3qV78Kl112WRgzJt0XPAAAAAAAYNhd59u4pZdeOuywww7hqKOOCr/85S/Diiuu2NDzpk+fHnbbbbcyaLHhhhuGf/zjH2XQYvbs2eF73/teGD16dPjTn/4UjjjiiEF/DwAAAAAADBPVSn6tyQzrjIutt946vPzyy13uO/rooxt67qmnnhqeffbZcmqo3//+92GttdYq74/ZFYcddliYMWNG+OIXvxjOPPPMMnix/vrrD8p7AAAAAAAAmiTjoqWl//PRnXPOOeXP/fbbryNo0dnhhx9eTh1Vq9XCeeedN6BxAgAAAADQJCoZtiYzrAMX/fXAAw90FPHeZZddFvmYGLSIGR3Rn//85yU6PgAAAAAAGKlGZODinnvu6bi9ySab9Pi49n+77777eu1v/vz55dRSnRsAAAAAAM2nUqlk15rNiAxcPP300x23V1lllR4f1/5vMRAxa9asHh930kknhalTp3a01VZbLfGIAQAAAABgZBiRgYuZM2d23J4wYUKPj+v8b52f090xxxwTpk+f3tGmTZuWcLQAAAAAAGSjWsmvNZlRQz2AZjB27NiyAQAAAAAAAzMiMy4mT57ccXvOnDk9Pq7zv3V+DgAAAAAAI1Qlw9ZkRmTgYuWVV+64/dRTT/X4uPZ/mzJlSpg0adISGRsAAAAAAIxkIzJwsckmm3Tcvueee3p8XPu/vfa1r10i4wIAAAAAIHOVSn6tyYzIwMX6668fVl999fL2H//4x0U+Zvbs2eH6668vb7/rXe9aouMDAAAAAICRakQGLiqVSjjooIPK2xdccEF47LHHFnrM97///TBr1qzQ0tISDjzwwCEYJQAAAAAA2YkZDtWMWkXGRXZeeeWV8OKLL3a0er3eUVi78/0xCNHZ5z//+bDiiiuWj3v3u98dbrvttvL+BQsWhB/84AfhK1/5Svn7Rz/60TJDAwAAAAAAGHyjwjC32Wabhccff3yh+0855ZSytTv44IPD2Wef3fH71KlTw+WXXx522mmncN9994UtttgiTJ48OcybNy+0trZ2TBF12mmnLaF3AgAAAABA7nIrK1HJaCypjMipotq98Y1vDPfee2/47Gc/G9Zbb70yYDFx4sSw1VZbhbPOOiv84Q9/CGPHjh3qYQIAAAAAkIsYKBjqYtyVzi00nWGfcbGo+hR9scIKK4RvfetbZQMAAAAAAIbWsA9cAAAAAADAEp3HKKe5jKqh6TThWwIAAAAAAIYrGRcAAAAAANAo1bkHnYwLAAAAAAAgGzIuAAAAAACgUTIuBp2MCwAAAAAAIBsyLgAAAAAAoC/pADmlBFRD0xG4GESzX5kWKgsmDLif6c8/FFJpGTUm5KhtweyQq7b56cZWqbaEHBX1Wrq+inR9jRS5frYU9XqW20VRrzb9flSqZrqPJ+yr3rYgWV+trfOS9VWtplv4Lam3i4SqCb8T1BKuy2pLwnG1zm36z/Cc1WqtyfqqJ9yXWufPStZXpZLueFFPuLyqLaOT9VUUeX4fiCqVlizfZ9LtIuG2X8n4MynXbayopfwOlefnSNLPt4SLP+V3zpTvMfV3/pTfe+bNeinkqJLwu3Wu52daRo9L1tfDt18dUlp38+2S9gdLksAFAAAAAAA0qFKplC0XlYzGkkqel60CAAAAAAAjkowLAAAAAABoVMxwyCnLoZLRWBKRcQEAAAAAAGRDxgUAAAAAAPQlHSCnlIBqaDpN+JYAAAAAAIDhSsYFAAAAAAA0So2LQSfjAgAAAAAAyIaMCwAAAAAAaJSMi0En4wIAAAAAAEagiy++OGy77bZh6aWXDhMnTgxveMMbwje/+c3Q2to6pOMSuAAAAAAAgAZVqvm1/jjiiCPCvvvuG2688cbwpje9Key8887hiSeeCP/93/8dtt9++zB37twwVAQuAAAAAABgBLn00kvDd77znTBp0qRw8803hz/96U/h17/+dXjooYfC6173unDDDTeEr3zlK0M2PoELAAAAAADoa42LnFofff3rXy9/Hn300WHzzTfvuH+55ZYLZ5xxRnn7e9/7Xpg+fXoYCgIXAAAAAAAwQjz11FPhH//4R3n7gAMOWOjft9pqq7DaaquF+fPnh9///vdDMEKBCwAAAAAA6IPcsi0qfVp7//znP8ufyyyzTFhrrbUW+Zgtttiiy2OXtFFD8qoAAAAAAEAyM2bM6PL72LFjy9bdo48+Wv5cffXVe+wrZlx0fuySZqooAAAAAABoUJHhf+3BhqlTp3a0k046KSzKzJkzy58TJ04MPYlFuxcVDFlSZFwAAAAAAMAwN23atDBlypSO3xeVbTFcCFwAAAAAAECDilALRVHLajxRDFp0Dlz0ZPLkyeXP2bNn9/iYWbNmdfQ5FEwVBQAAAAAAI8Saa67ZkaHRk/Z/a3/skibjAgAAAAAAGlTUa2XLRdHHsWy22Wblz5deeqksvr3WWmst9Jhbb721/Ln55puHoSDjAgAAAAAARohVV101bLnlluXt888/f6F/v+GGG8qMi1gjY9dddx2CEQpcAAAAAABAw4p6vSPrIo9W7/Pa++IXv1j+PPnkk8Ptt9/ecX/MwvjkJz9Z3v7Upz4Vpk6dOiRbhqmiAAAAAACgUZlNFRX6MZb3vve94dOf/nQ4/fTTw1ve8pawww47hIkTJ4arrroqvPrqq+Htb397OPHEE8NQEbig36rVFkuvj1Ie0CqZLv+sDtrDRFHJc13WWueGZldvW5Csr1qtNaRUqTT/bI5FUcvy2NP361R6Vq3me0xMeryu5rld1FO+x4R9tYwaMyI+d3Pdxur9uBqtx74SHvuTLq+W0SNiGxsJ22uuyz/l3yKVhN+FK9Vqtu+zXluQ5/IPef4tklKu+1FqtYTbWErVIt02Nn/OK1nuR+MmLZft9vrw7Vcn62vdzbfLblwzZ81O0s9I9p3vfKcMUHz/+98Pf/vb30Jra2tYZ511wtFHHx0++9nPhjFj0v3t0lcCFwAAAAAA0KCiqJctF8UAxrLvvvuWLTfNfzknAAAAAAAwbMi4AAAAAACABrUXxc5FkdFYUpFxAQAAAAAAZEPGBQAAAAAANEjGxeCTcQEAAAAAAGRDxgUAAAAAADSoXtTKlot6RmNJRcYFAAAAAACQDRkXAAAAAADQoKJeL+tc5DSeZiPjAgAAAAAAyIaMCwAAAAAA6FPGRT5ZDkVGY0lFxgUAAAAAAJANGRcAAAAAANCgoqiVLRdFRmNJRcYFAAAAAACQDRkXAAAAAADQl4yLej5ZDoWMCwAAAAAAgMEj4wIAAAAAABoUsy2yyrio5zOWVNS4AAAAAAAAsiHjAgAAAAAA+lLjIqO6EkVGY0lFxgUAAAAAAJANGRcAAAAAANAgNS4Gn4wLAAAAAAAgGzIuAAAAAACgQfV6Eer1elbjaTYyLgAAAAAAgGzIuAAAAAAAgAYVRa1suSgyGksqAheDqNa2INTaBr6Ii6KetHBMKpVqS8hVyvc5Et7jSFheWW+vmX641BNuF9WEy38kbK85H/tTamtrDbl+fo8E1Uz38UolXUJwvdaa5edIym0s52NFW+vckKOky3/0uGR91WoLstxec/0MSf0dqhJamv87f67bRcp5IPKZsWMhRUbTiXRWDwsy/Ru13vR/b0WjRo9P1lc94edISkkPFwk7a2kZk6yv+bNfSdbXmPFTQq4evv3qoR4CI4zABQAAAAAA9CFYm9MFHkVGY0lFjQsAAAAAACAbMi4AAAAAAKBBMi4Gn4wLAAAAAACg+TIuiqIIjzzySHjsscfCyy+/HObOnRvGjx8flllmmbDmmmuGddZZJ1QqlVQvBwAAAAAAS15mNS5CTmPJIXDx0EMPhUsuuST88Y9/DP/4xz/CnDlzenzsxIkTw5Zbbhl22mmn8L73vS+st956A3lpAAAAAABY4oqiXrZcFBmNZcgCF7VaLVx00UXhe9/7Xrjpppu6ZFz0ZtasWeGaa64p2zHHHBPe/OY3h8MPPzzsu+++oaWlpX+jBwAAAAAARmbgIgYmzj777HDCCSeEJ554ouO+dmussUbYaKONyqmhll122TBlypQwffr08NJLL5VTR913331h2rRpHY+/+eabyxaDGMcdd1w4+OCDQ7Wq5AYAAAAAAJlnXGQ0PVMxUjMurrvuuvCpT30q3HvvvR3BilVXXTXsueeeYdtttw1vectbwoorrrjYfp599tnw97//vezvN7/5TRnIiEGQQw89NJx22mnh+9//fth6660H/q4AAAAAAIDmDVzE4EQUMyL22muv8PGPfzxsv/32fX6xGNyI9S1ii4GKq6++OvzgBz8o62Tcc889YbvttgttbW19fxcAAAAAALAExGyLrDIu6vmMJZWG5maqVCrhgx/8YPjXv/5V1rfoT9BiUWKgIvYX+z3kkEOS9AkAAAAAADR5xsWdd94ZNtlkk0EbxDrrrBN++tOfhs997nOD9hoAAAAAADBQ9aJWtlzUMxrLEs24GMygRWcbb7zxEnkdAAAAAABgGGdcAAAAAAAAalxkk3EBAAAAAACwJMi4AAAAAACABhX1etlyUWQ0luwCF21tbeHmm28O9913X3jllVfCvHnzGnresccem2oIAAAAAADASA9cLFiwIHz9618P3/ve98qARV8JXAAAAAAAMFwURa1suSgyGksWgYvW1tawyy67hGuuuSYURdHn51cqlYG8PAAAAAAA0GQGFLg4/fTTw9VXX13eHjduXDjwwAPD1ltvHVZcccUwduzYVGMEAAAAAIAsFPVa2XJRZDSWLAIX5557bvlzmWWWCddff33YaKONUo0LAAAAAAAYgQYUuHjooYfK6Z4OP/xwQQsAAAAAAJpeUa9nleVQ1Ouh2VQH8uQ4PVS08cYbpxoPAAAAAAAwgg0o42LttdcOt912W5g+fXq6EQEAAAAAQKaKola2XBQZjSWLjIv99tsvFEURrrzyynQjAgAAAAAARqwBZVx85CMfCT/84Q/Dr371q3DVVVeFHXbYId3ImkAM6hTFwOcXSzpfWsvoZF1Vqi0hV7mOrd62oOnfY65SzztYT9hfNdN1Wa+1ZtlXym2/JeExMefjRa5XXtQSvsdcjxcp+8r5uJ/ymJjiu1NHXxnNOZvu0qHBe4/1Wtp9sp5wnt2U77OW6fE15fJKvS5zPFakVqnkeexvbZ2XrK+U33pqlXQHspZRY5L1VYS021ilyPOzt6gl/H7RhHOiDyf1EfC9M+l3lZDn51st4edu6u/8E6auFHI0Z/ozYbiL23ZOf28UGY0llQF925g8eXK4/PLLw8orrxx23333cOqpp4aZM2emGx0AAAAAADCiDCjjIlp//fXD3XffHXbcccfw3//93+GLX/xi2GCDDcKyyy4bqtXe4yKVSqXM1AAAAAAAgOEgZsumzJgdqHpGY8kmcPHUU0+F//qv/wq33357+XtbW1u47777GppGKQYuchBrdJx11lnh5ptvDs8991w5rpVWWim89a1vDR/96EfDNttsM9RDBAAAAACAEWFAgYuXX365PKn/6KOPloGIdp1v5yyO8xOf+ET40Y9+1HHf+PHjy5/xPcV2/vnnh89+9rPhW9/61hCOFAAAAACAHMRaZznVlSgyrW05ZDUu/vd//zf8+9//Lm9vsskm4dxzzw2PPfZYmDdvXke6TG+tlrCgVH+cffbZHUGLvffeOzz44INhzpw5ZfvXv/4V9thjj/LfTjvttHDJJZcM6VgBAAAAAGAkGFDGxaWXXlr+3GijjcJNN90UJkyYEIaTc845p/y57rrrhl/+8pdh1Kj/vzhinY6LL744bLjhhmVw5qKLLgrve9/7hnC0AAAAAAAMtXq9VrZc1DMaSxYZFzG7ItaDiHUghlvQInrmmWfKn294wxu6BC3ajR49Omy66abl7VmzZi3x8QEAAAAAwEgzoIyLKVOmlNNCrbzyymE4WnvttcMDDzwQ7rzzzrKoePfgRWtra7jjjjvK21tsscUQjRIAAAAAgFwUZSmEWlbjaTYDyrjYeOONy59PPfVUGI5iYe7o4YcfDvvvv3/5s10MaOy7777lNFHrrLNOWaAbAAAAAADIOHBx0EEHhaIoyvoPw9F73vOesvD2mDFjwq9+9auw3nrrlVNexRZrW1xzzTVlcOOWW24ps0t6Mn/+/DBjxowuDQAAAACA5lMUtexasxlw4OKd73xn+Pvf/x5OPPHEMBwdccQR4Te/+U14zWteU/4+d+7cskULFiwoa1tMnz691z5OOumkMHXq1I622mqrLZGxAwAAAABAsxlQ4CKKJ/332WefcPzxx4dddtklXHHFFeGll14Kw8GcOXPC+9///rDbbruF1VdfPfz5z38OL7zwQtni7de+9rXhF7/4RXjTm94U7rrrrh77OeaYY8rgRnubNm3aEn0fAAAAAAAsGfWyxkVerdkMqDh3S0tLx+04ZVQ82R9boyqVSlkUe6gcddRR5TRXG2ywQbj++uvDuHHjOv4tZpJstdVWYdNNNw0PPvhgOOyww8rHLMrYsWPLBgAAAABAc4uFuXMqzl3PaCxZZFzEYEV76/57o22ozJw5M5x55pnl7RiU6By0aDd+/PjwqU99qrx9ww03hOeff36JjxMAAAAAAEaSAWVcvOMd7yizJoajmEXRnu2xzjrr9Pi4WLC73aOPPtpRCwMAAAAAgJGnqNfKlosio7FkEbi45pprwnBVrf7/ZJPHH3+8x8c999xzHbcnT5486OMCAAAAAICRbMDFuYerDTfcsJwKKvrxj3+8yFobtVqtYzqppZdeuqyFAQAAAADAyNVe4yKn1myGNHDx4osvDtlrx6DFoYceWt6+/fbbw3ve855w9913d1Rhv+uuu8Kuu+4a/va3v5WPOeKII7oUIwcAAAAAADILXHz1q1/t93NfeumlsOOOO4ah9I1vfCPsvPPO5e0//vGP4fWvf32YMGFC2d7whjeEP//5z+W/7b///uFLX/rSkI4VAAAAAIB8alzk1JrNgAIXxx57bPjZz37W5+e9+uqrZdAiZjgMpZh18fvf/z5cfPHFYY899girrrpqKIqi/LfVVlst7LXXXuHyyy8P559/vmwLAAAAAADIvTh39LGPfSyssMIK5bRKjZg+fXp45zvfGe68885QqVTCUItj2HvvvcsGAAAAAAC9qdeLstxATuNpNgPKuFhrrbXKotb77rtvuOWWWxb7+JkzZ5ZTM912221lwCBOwQQAAAAAAJAkcBHrQiy//PJhzpw54d3vfnd48MEHe3zsrFmzwi677BJuvvnmjiyHc845ZyAvDwAAAAAAS1S9qIV6PaNWqHHRxXrrrVfWgJg4cWJ4+eWXy2yKZ599dqEV2R7Y+Nvf/lYGLd773veWdSOq1QHFTQAAAAAAgCYz4BoXW265ZbjooovK4taPP/54mVVx3XXXhcmTJ5f/Pnfu3PCe97wnXH/99WXQYrfddgsXXnjhiCh2Hd9vpTLw4EylJc8AT9uCucn6ahk1JqRUqabbvop6nhHLlOOKkdlUqgmXfa3WmqyvFPviYEm5/Isi3fyK9dqCZH1VKi1Z7t9Jl33iY0WR8GqJlO9zJEi5vCopl33q9Zjwszfl9t/Sku7YU0t4HGsJeS6vlMeKtrZ0n7tRrS3d8h8Jx4uUyyvXC8Rymge6uxHw52lSKb9z5vr31oiR5+EiqXpbyFbS7wQJj7FJ+0r4XaWS8edIjn+H/8fExP3RedtOuX0PVJHRWLL6iIrBirPOOisURRHuuuuuMojR2toa5s2bV96++uqry8fttNNO4Ve/+lUYNWrA8RIAAAAAAKAJJYsgHHzwweHpp58OX/rSl8K1114bDjjggLKuxV/+8pfy39/5zneGSy+9NIwePTrVSwIAAAAAwBLVXlsiF/WMxpJK0tSHY445pgxefP/73w+/+c1vOu7fdtttw29/+9swZkza6YAAAAAAAIDmknzOptNPP70s0P3rX/+6rPGw9dZbhyuuuCKMGzcu9UsBAAAAAMASr1GTU5ZDkdFYlmjg4pxzzulTp3FaqDhFVK1WC/vuu2+4+OKLe3zsQQcd1Ke+AQAAAACA5tVQ4OKQQw4psyf649Of/nSP/xb7FLgAAAAAAGC4iBkOOWU5FBmNZYlPFVUUxeCOBAAAAAAAGPEaClz87Gc/G/ELCgAAAAAA6vUi1Ov1rMYzIgMXBx988OCPBAAAAAAAGPEanioKAAAAAABGOjUuBl91CbwGAAAAAABAQ2RcAAAAAABAg+r1WtlyUc9oLEs04+Luu+8e/JGEEO64444l8joAAAAAAMAwDlxsvvnm4cMf/nB45JFHBmUQ9913X9hrr73CFltsMSj9AwAAAABAyoyLnNqIDFzUarVw9tlnhw033DDst99+4ZprrhnwC8c+L7/88rD33nuHN7zhDeGSSy4JRVEMuF8AAAAAAKDJa1xce+214bDDDgv33HNPuPjii8u22mqrhT333DNss8024S1veUtYYYUVFtvPs88+G26++ebw17/+NVx44YXhhRdeKO+PAYvXve514fvf//7A3xEAAAAAAAySoqiVLRdFRmNZooGLrbfeuqw/EbMuTjjhhPDEE0+U7Tvf+U7ZohjIiBkZyyyzTFh22WXD5MmTw4wZM8LLL79ctvvvvz88+eSTHX22Z1esscYa4dhjjw0HH3xwqFYbSgABAAAAAACaVEOBiygGFT70oQ+Fgw46KFxwwQXhjDPOCDfddFPHv0+bNq1svek8FdTb3va2Motj3333DS0tLf0dPwAAAAAALDH1oh7q9XpW4xmxgYuOJ4waFT7wgQ+U7cEHHwy/+c1vwp/+9Kdw6623htmzZ/f4vJiBseWWW4add945vO997wvrrLPOQMcOAAAAAACM9MBFZ+uvv344+uijyxYjTI8++mh47LHHyqmh5s+fH8aOHVtOG7XWWmuFNddcM1QqlXQjBwAAAACAJaxer5UtF/WMxpJF4KL7VFIxi0ImBQAAAAAAzaqo10ORUbCgyGjaqlRUwwYAAAAAAJov4wIAAAAAAEbGVFH55ATUM8r+SCWfpQsAAAAAAIx4Mi4AAAAAAKBBsb5FkVHGRdGEGRcCFyNMrdYacpR656pUW7IcW65pW0WRroBPylpASbeLfD5LBvV9puyrrS3l8SJdX6OKdO+x2jImWV9trXNDSrWEyz/lsaea8PiaUq7H6mqm48pZkXAfT7kf5aqe8IO3bUHa41hb24KmP/a0LpiXrK9apssr5bEn9Xf+llHpPsdrtXTLP9vviQmPr/WE22vK95jy78CyvxHwHWpESPi3YKViPTbN98TWPL9bz5v1YtL+WufPTtbXgjmvJOurZfS4JP20LZiTpB/yJHABAAAAAAANKur1pBcRpRhPs8n4GmQAAAAAAGCkkXEBAAAAAAB9mE6znlGNi3oTTi2cz9IFAAAAAABGPBkXAAAAAADQh2LxRVFtyuL1uRC4AAAAAAAA+uz3v/99uOWWW8Jtt91Wtmeeeaa8f9q0aWHVVVcNQxK4OOGEE8qf++23X1h//fUbft4jjzwSzjvvvPL2scceO5AhAAAAAADAElOv17OqK1Gv14fstQ844IAwffr05P0OKHBx/PHHh0qlEjbddNM+BS4efvjhjucKXAAAAAAAwPCz5557hvXWWy9svvnmZXvNa16TpF9TRQEAAAAAQIPqRS3U65WsxjNUfvrTnw5Kv9WhTF2pVvMpYAIAAAAAAAy9Icm4eOqpp8qfkydPHoqXBwAAAACAfinqtVBklHFRZFRvY9gGLp588snwwx/+sLwd574CAAAAAAAGZsaMGV1+Hzt2bNmaOnDxne98p2yL8tGPfjQcccQRvT6/KIowe/bs8NJLL5W/x8Lcu+66a1/HCwAAAAAAQ6ZWFGXLRe3/xrLaaqt1uf+4444Lxx9/fGjqwMWrr74aHnvssTLgEIMQ7eLt559/vs8vvNFGG4Ujjzyyz88DAAAAAAC6mjZtWpgyZUrH771lW3zhC18Il112WeirH//4x2GrrbYK2QQullpqqbDGGmt0ue/xxx8vAxnLLbdcmDBhQq/Pj4W4J02aFNZaa62w4447hg996EOLfQ4AAAAAAOSkHoqy5aL+f2OJQYvOgYvePP300+GBBx7o82vNmjUrLAkNBy4+85nPlK17MCI666yzwu67755+dAAAAAAAQFLnnntu2ZqyOPfqq69eZlzInAAAAAAAYCSoFfWy5aKW0ViyCFzEmhcAAAAAAABZBC4AAAAAAGAkKTKrcVFkNJZUBC4AAAAAAIA+O/HEE8MVV1yx0P2xJvaYMWPK25tvvnk444wzhiZw8cILL4S//OUv4Z577gmvvPJKmDdv3mKfE+tj/OQnP0k1BAAAAAAAGFS1oihbLmpDOJZHHnkk3HzzzQvd/89//rPj9rhx4/rc74ADF7NmzQqf//znw9lnnx1aW1v7/HyBCwAAAAAAGH7OPvvssqU2oMBFDFTstNNO4aabbgpFP6I6MeMCAAAAAACGi1pRL1suahmNJYvAxQ9+8IPw97//vQxATJo0KRx22GHhne98Z1h11VXD2LFj040SAAAAAAAYEQYUuLjgggvKn1OnTi0DGBtssEGqcQEAAAAAQHbqoShbLuoZjSWLwMX9999fZlt8/OMfF7QYRPVa32uH9KSo15L1VR31n6rwOaq3LUjXV8JlViRM22qdPyvkaNTo8cn6amudm6yvarUlpFSppOuvKGp5bq/1PMdVrVaT9VWppBvXSJFyXY6EcTG0agm/D6TUMmp0lu+xLfHySvm9J4S0n+M5flamNBK+D+S7VeQr7fexpGdakqkk/s6f8jhWq2U6hUfC8w2VSsoNI52WhOcuipD2OFYNY7L8u3IkfFamPF6kfI9FwnMNOUu1/FMf92miwMWCBf/542bTTTdNNR4AAAAAAMhWrSjKlotaRmNJZUDh8FjLIpo/f36q8QAAAAAAACPYgAIX73rXu8qft956a6rxAAAAAABA9jUucmrNZkCBi09/+tNh3Lhx4ec//3l49tln040KAAAAAACynSqqnlErQrMZUOBivfXWCz/84Q/D7Nmzw0477RQeeeSRdCMDAAAAAABGnIaKc59zzjm9/vvee+8dLrzwwvDa17427LbbbuGtb31rWG655UK1uvi4yEEHHdT4aAEAAAAAYAgVmU3PVGQ0liUauDjkkENCpVLp9THx31tbW8Oll15atkbE5whcAAAAAAAAfQpcREWD82Q1+jgAAAAAABieNS7yOQ9ey2gsSzRw8bOf/WzwRwIAAAAAAIx4DQUuDj744BG/oAAAAAAAoBbqoRZ6L62wpMfTbBZfPRsAAAAAACC3GhcAAAAAADDS1YuibLmoZzSWVGRcAAAAAAAAzZFx8cQTT/TredVqNUyePDlMmTIlVCr5zAUGAAAAAAC9qYWibLmoZTSWLAIXa6655oACD6NGjQobb7xx2G677cJHP/rRsMEGGwxkOAAAAAAAwEifKqooin631tbWcOedd4Zvf/vbYZNNNglf/vKX07wrAAAAAAAYxBoXObVmM6CMi4MPPrj8+eSTT4arrrqqvN3S0lJmUay99tph4sSJYfbs2eHf//53uPfee0OtViszNHbYYYewwgorhJdeeincdttt4YUXXij/7aSTTgptbW3h5JNPTvPuAAAAAACAkRO4+NnPfhauu+66sNdee4UxY8aEL3zhC+Hwww8Pyy+//EKPjcGJ008/PZxy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7Wtf23E7Th8FAAAAAABkmnHxm9/8Jlx33XWhUqmUmQnXX399Wch6s8026/V5O+64Yxno+Nvf/haGyjLLLNMleNGTzpkj8X0CAAAAADBy1Yt6dq3ZDChwcf7555c/X//614dvfvObDT8vPj564IEHwlB617veVf68//77e3zMfffd13F7rbXWWiLjAgAAAACAkWpAgYtbbrmlzELYf//9+/S8FVZYofz5wgsvhKH0wQ9+sPwZa25ceumlC/17LNp96qmnlrdjdsbmm2++xMcIAAAAAEA+6hnUtKh1anE8zWZAgYv2wMPaa6/dp+eNHj26/LlgwYIwlLbeeuuw9957l7cPPfTQ8Otf/zq0tbWVvz/xxBNlQOauu+4qf4/Fx2OxbgAAAAAAYPCMGsiTx40bVwYf+hqAaA94LL300mGonX322eH5558va3XEIMbYsWPDhAkTwiuvvNLxmOOOOy4cfPDBQzpOAAAAAACGXr3+n5aLekZjSWVAKQQrrbTSYmtELMpNN92UTc2IiRMnhquvvjqcddZZ4R3veEf5+6xZs8qpofbbb79w4403huOPP36ohwkAAAAAACPCqIFOtfSvf/0rXHzxxeGEE04o610szosvvlhOyRQfu80224QcxCmg4lRRsTW7er2WrK9KJV1fRbUljAS1Wrrp0WptrSFHsTZMKkXC7bVezTf0nPR9Juwr5bja2tJt+5VMjxcpl33OqgmXf62W736ZykjZLkaClNt+yuNrSpXE06Km3P5Hwr6U8j3WEn7uhrETR8R6TPp9LOQp5XaR699vqb/zV6sJt9lann9z5ToldkvLmJClWtq/w1syPS4m/buySLe9VirptteWUWOy/AzJ9e9dFlYvKmXLRT2jsaQyoD3+Ax/4QPnzoYceKmtALE6cUio+Z86cOWXg4pBDDhnIywMAAAAAAE2mOtCMi3e/+92hKIqyDsTHPvax8PDDDy/0uBiouOSSS8Kb3/zmcOWVV5ZBixjA2HDDDQfy8gAAAAAAsETVivxasxnQVFHRueeeG972treVdS5+/OMfly0W7W63/PLLh1dffbUjlTEGOTbddNNwxhlnDPSlAQAAAACAJjPgyeGmTp1aFtt+//vfXwYlYps7d25HvYuXXnop1Gq1jn/bZ599wnXXXRcmTJiQYvwAAAAAALDExGv0c2vNJklVm8mTJ4df/vKX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KaBMr776ahg5cmQ48MADw+abbx5WX331UFNTk9/uuuuu4Wc/+1n4/PPPv7IcfSWko4+DVasf1AdCsc4X9aNQvOur+spOJM5xQRo/+tGPYmSheenfv39WU1PT/P/vfe97WX19fZuPnzhxYrb66qs379+7d++surq6+f/77LNPVldX5+WCdnryySeztddeu7kt1dbW5u2zZXt97bXXWn3s5MmTs0GDBjXv17Nnz6xbt27N/992222zzz//3GsCZTjzzDMXa3fdu3fP+vTps9h9a6yxRvbcc8/pK2EF0MfBqtUPOl+EYp0v6keheNdX9ZWdi4yLRG688cY8Oh8dccQR+aQjX3zxRR59v/XWW0OvXr3CAw88EM4///xWHz9r1qyw//77hxkzZuS/vnn55Zfzx86bNy9cd911+S9xxo0bF4YPH56qytAlPPvss2G//fbLI+4HH3xw3rYWLlyYt8/Yvl566aXw7//+73kWxZc1NDSEAw44IEyePDmss8464YknnsgfM3/+/DB27NjQp0+f8Nprr4Wjjz56pTw3WNXsuOOO4corrwzPP/983gYXLFiQ/7ot9ne33XZb/uu26dOnh2HDhuX94pfpKyEdfRysWv2gPhCKdb6oH4XiXV/VV3ZCKzty0hnEKF9TdH677bbLGhsbl9jnF7/4Rb49ZlC89957S2y/8MIL8+09evTI3n///SW2X3rppfn2qqqq7J133umw5wKdybx587Kvfe1reds566yz2v340aNHN0f0W/vl25133tm8ffz48YlqDV3XuHHjmtvUmDFjltiur4R09HGwavWD+kAo1vmifhSKd31VX9n5yLhI4JVXXsmj81Gcn6KycsnDesopp4T+/fvnUfkxY8Yssf32229vjiZuvPHGS2w/66yz8rH1Gxsbwx133JGi2tDp/frXvw7vv/9+GDhwYLjiiiva/fj4y7cojmu6yy67LLG9ZXttasPAstt5552b1z/88MMltusrIR19HKxa/aA+EIp1vqgfheJdX9VXdj4CFwlMmTKleX3LLbdsdZ+qqqqw6aab5uuPP/74YtveeeedMHXq1Hx96NChrT4+Bi3iJN2tPR5oXVOnddhhh4Xu3bu36zDF4aBi2vDS2mVFRUXYd999tUtIOAFbk0022WSxbfpKSEcfB6tWP6gPhGKdL+pHoXjXV/WVnZPARWIxI+Krtr355puL3d/y/1tttVWbj2/a9tZbbyWoKXRudXV1YeLEifn69ttvnwcHTz311LDBBhuE2trasPbaa+fzVzzyyCOtPv7tt98OpVKp7Hb5ySefhM8//7xDngt09rYa55GJ8zkdc8wx+X1f//rX8/bZkr4S0tHHwarVD+oDoVjni/pRKN71VX1l5yRwkcCgQYOa178clGiyaNGi8H//93/Nk8XESZ6aTJs2rXl9vfXWa/PvNG2LE7jNnTs3RdWh04ongLHdRTH9NwYY/ud//id89tln+WRO8fbhhx8O+++/f55qmGVxmMSwzO3yy48Bli7+qi1mLcXbOORaHBIxTrq26667hgkTJoRu3botV5vUV0Lb9HGwavWD+kAo1vmifhSKd31VX9k5CVwksN122+XR+CjOfB/HWfuyn//85/lFlCYt1+fMmdO83rNnzzb/TsttLR8DLCme+DW55JJLQk1NTbjnnnvyoF/cFlMQY0pwNHr06HDNNdcs9njtEjpWHEs49p3xxLBJnE/m2muvDRtuuOES+2uTkI72BKtWP6jNQrHOF7VJKN71Ve2yc+qygYtbb701/4XLsi6PPfZYc1nV1dXhpz/9aXPKYIzIv/rqq3kUMA4fc+WVV4YLLrgg7wibtDbBDHR1Kdtl0zBPTes33XRTOPTQQ5vbYTwhHDt2bNhmm23y/1966aWtdorQlaVsk639yi32kfHkME7ANmrUqPD666+HHXfcsblPBYDOSj8IK5fzRSge11f5MlfPEznjjDPCueeem6+PGzcuHyMxpveus8464fzzz8/TneJtk9VWW615vU+fPotN8tSWlttaPgZYUss28o1vfCMMGzZsiX1iALGp3c6YMSO88sor2iWsBGuttVY455xz8kBHDHhcfPHFeWp+S/pKSEd7glWrH9RmoVjni9okFO/6qnbZOVWHLurII4/MMyOWVb9+/Za4L2ZWxM4uphG+/PLLebpSbFgHHnhgGD58eLjiiivy/TbaaKN8sqcm6667bvP6Rx99FPr27dvq34zbori9d+/ey1x36ArtsuUY+Jtvvnmbj9lyyy2b12M68E477dRquxw8ePBS2+WXHwOdQUf0lUsTsy1222238Ic//CH86le/Wuxv6yshHX0cFFNb/aA+ENJbnvNF/Sh0rGW5vqqv7Jy6bOAiRuu+PPFnCnEytbi0ZuLEifntt7/97cXuj5NAtZx8Zosttmj18U0T07TsOKEzSdkuBwwYkH8ZbRlYaE3LSdbiL9yaxHYYf2ETU4hj2xs6dOhS22Ucpzj+TehMOqqvLOck8t13313sfn0lpKOPg+JqrR/UB0J6y3O+qB+Fjtfe66v6ys7JUFErSBy/e/z48fn6scceu9i2TTfdtHkCtrbGA583b154+umn8/W99967w+sLnUFTW4lzz7Tlrbfeal7feOONm9d79uzZ3Em21S7jl9iYutjybwHL5/333291SER9JaSjj4NVqx/UB0Kxzhf1o1C866v6ys5J4GIFaGxsDN///vfzybpj+u8+++yz2PYYtW9qbHGy4DhR25ddf/31+QSmVVVV4aijjloR1YZV3gknnND8i7UHH3xwie0xmyJOCBzFX9tst912i20/7rjj8tvf//734cUXX1zi8ffcc0/zyeWXA5LAkn1hy1+stWbChAnhpZdeytf32GOPxbbpKyEtfRysOv2gPhCKd76oH4ViXV/VV3ZSGUm899572Y9//OPslVdeyRYsWJDf19jYmD3zzDPZnnvuGb+hZv3798/eeuutVh8/c+bMbODAgfl+W265ZTZx4sT8/rq6uuyGG27Iamtr822nn366Vwza4dBDD83bzuqrr57de++9WX19fX7/lClTsn/5l3/Jt8Xl1ltvXeKxcd+tt946377eeutl48ePb27bd999d9a3b99829ChQ70m8BUmTZqUbbPNNtkvf/nLvM8slUrN26ZOnZpddtllWa9evfI2NWDAgOzjjz/WV0IH0sfBqtUPOl+EYp0v6keheNdX9ZWdT0X8Z2UHTzqD119/PWy77baLzWofMyTq6+vz/8ehoB544IElftHd0iuvvJJHC2fMmNGcHrxw4cLmMmIa40MPPbTCxxuHVVkcZu2f//mf80kOo9h+YmrvF1980bzPRRddFEaMGNHq42MG1JAhQ5ozoeJj4y9vYtuMYruPv46LbR5oW2xDLYdji5Oo9e3bNyxYsCBvp03iPvfdd99ifWpL+kpIRx8Hq1Y/qA+EYp0v6keheNdX9ZWdi8BFIjNnzgzXXHNNeOqpp/I0w+nTp+eBh8033zwcfPDBeSpT7PzKGavt8ssvDw8//HD44IMPQvfu3fMJZmIa4oknnphPFgy0Tww03HzzzeHXv/51Ppn2nDlzwlprrRV23333cNZZZy02oVNr4v4xRfj+++8PkyZNytthHD/xyCOPzB8fTzyBpYvpvDH4HvvJOPTatGnT8r4yDoG45pprhm222SYcdNBB4V//9V9Djx49llqWvhLS0cfBqtUP6gOhWOeL+lEo3vVVfWXnIXABAAAAAAAUhp/vAwAAAAAAhSFwAQAAAAAAFIbABQAAAAAAUBgCFwAAAAAAQGEIXAAAAAAAAIUhcAEAAAAAABSGwAUAAAAAAFAYAhcAAAAAAEBhCFwAAAAAAACFIXABAAAAAAAUhsAFAACUafLkyaGioiJfjj/++EIdt0GDBuX1irersiIfYwAAYMWoXkF/BwAAaIdrr702zJw5M/Tv3z8MHz58uY/d66+/Hh588MF8fdiwYeEf/uEfvB4AAEAhCVwAAEBBAxdTpkwJG220UbLAxciRI/P1mJUhcAEAABSVwAUAAHQCcYglAACAzsAcFwAAAAAAQGEIXAAAAAAAAIUhcAEAAAn95S9/CVdffXX43ve+F77xjW+E3r17h9ra2rDWWmuFf/zHfwyXXHJJmD59epuPj/NPVFRU5PNbRPE2/v/Ly4gRI1p9XLxt6dZbb83vP+GEE5rvi+utldnS8ccf33z/Vw1D1fQ34hLXl+bFF18MRx11VNhggw1C9+7dw3rrrRf23XffcPfdd4dl8Yc//CGceuqpYYsttsgnMo9lxrIPOeSQcN9994Usy5apXAAAYOUxxwUAACRy++23h+OOO67VbX/961/z5emnnw5XXnlluPPOO8N+++3XpY59DLZcfPHFoVQqNd83bdq0fBk3bly45557wqWXXlpWWTNnzgzHHHNMePjhh5fY9uGHH+bL/fffnweLYgBjjTXWSPpcAACAjiNwAQAAicyfPz/POthmm23yC+abb755GDBgQL4tXkgfP358eOyxx8Ls2bPzjIDnnnsubLfddouV8atf/SovJ2YRxEDHmmuumd/3ZbHscuy5557hgQceCE8++WT4+c9/nt931lln5fevSNdcc00YOXJk8/9jRsrQoUNDnz59wttvvx1uvvnmcO+99y4W1GhLPH677rpreOutt/L/x8yWww47LM+6iNkt77//fvjNb34T/vjHP+YZGXvttVd44YUX8mwMAACg+AQuAAAgkd133z0fKurrX/96q9vPOeecPHhx0EEH5cGJ888/P/9/S3vvvXd+O3z48Py2Z8+eYdiwYctcpw033DBfYoZCkxgsWZ4y2ysGEn784x/n61VVVWHs2LHh0EMPXeLY7L///nmWxFc57bTTmoMWMYvjwgsvzMttKR7buFx11VXhjTfeyIfoigsAAFB85rgAAIBEvvnNb7YZtGgSf/1/9tln5+sTJkwIH330Uac//tddd11YuHBhvv7DH/5wiaBF1Ldv33DXXXflGRhLE7MoYuAjOumkk8JFF120RNAiqqysDKNGjcozM5rqUFdXl+gZAQAAHUngAgAAVrDddtuteT0OYdTZNWVRxGBCDFy0ZZ111glHH330Usu67bbbmtdjRsVXOfbYY/PbWbNm5RODAwAAxWeoKAAASOyZZ57J51h46aWX8mGS5syZE+rr61vdN8590Zl99tlnYcqUKc3zcqy77rpL3f873/lO+MUvftHm9jhnRRTnq4jDRTUNGdWWlhktcd849wgAAFBsAhcAAJDI3Llz84yB3/72t2U/Jk403ZlNmzatef2rhtEqZ5/Jkyfnt3HoqTjBd3t8/vnn7dofAABYOQQuAAAgkcMPPzz87ne/y9d79eoV9ttvv7DtttvmWQZxku3q6r99/X7zzTfDT37yk3y9sbGx0wdzmsRj8FXicVualpOMt9eiRYuW+bEAAMCKI3ABAAAJPPvss81Bi6233jo8/vjjYeDAga3uW1NT06mO+dKCL717925enz9//leWNW/evKVuj+XF4MWAAQPCjBkz2llTAABgVWBybgAASCAGKppceumlbQYtokmTJhX+mHfr1q3sTIXp06e3ua3lnBbvvvvuV/7dr9pn/fXXz29j8KJlNgcAANB5CFwAAEACn3zySdnzNDz66KNfWV5l5d++qmdZlqB2/7+8cstcbbXVWp3gujXPPfdcm9vWWmutMGjQoHz9z3/+82JzXrRmwoQJS93+T//0T/ltqVQK48aNW+q+AADAqkngAgAAEmg5N8PSsgaef/75sgIXTUMsfdXQSeVqOWRTOWV+85vfbF4fP358m/u98847zUNktaVpEu0YbPiv//qvNvf79NNPwx133LHUso499tjm9f/4j//IJ+kGAAA6F4ELAABIYIcddmheHzlyZKsX1P/4xz+GQw89tKyMh4033ji/jfM4TJ06dbnr11Re9Oqrr37l/t/97nebJxO//vrrWw3GxEyMQw45JDQ0NCy1rB/84Aehe/fu+frVV18dHnjggSX2mTNnTj65+ezZs5da1o477hgOO+yw5uN50EEHhb/+9a9t7h+PdZx/5Nxzz11quQAAQHGYnBsAABI4+OCDw4YbbpgHGSZOnBg222yzcPLJJ+fDRsVJqf/3f/83jB07NtTX14fjjjsu3HbbbUstb6+99goPPfRQc8bC97///bDeeus1D/kUy/2qIalaihOGr7322nlWw5gxY8Iaa6wRdt5559CzZ8/mffbdd9/m9ThHR8xuuPnmm8OsWbPygMHpp58eBg8eHOrq6sLLL7+cP4f43GLA4a677mrzb3/ta1/L5/04++yz8yBHPFZxGTp0aOjTp094++2387/zwQcf5Pfff//9S30uN910U/jLX/4S3njjjXxukTgUVQygxOez5ppr5sc4Ps8Y2IjZIh9++GHYZJNNwqhRo8o+XgAAwMpTkaUaNBcAADq5yZMnN2cuxODDrbfeutj2V155Jb/439Zk1VVVVeFnP/tZ2GmnncKQIUPy+y666KIwYsSIJfaNwzl961vfyueFaM2XHxcv3k+ZMiVstNFGeT3buuAfgylt+fKpQQxY7LPPPuHFF19sdf8ePXqEG2+8MTQ2NoYTTjghv++WW24Jxx9/fJt1vvjii9vMOImZFPH4bLrppm0e4yZxYu4zzjgjD8KUc0oT58Z46qmnvnI/AABg5TNUFAAAJLL99tvnv/I/55xz8oyLODxSnFsiXog/7bTTwksvvRR+9KMflT1nxgsvvBB++tOf5gGMfv36LTbB9rI46aSTwhNPPJFnJ8TskKbhm9oS/2bMFLn22mvzYEvfvn3zx8TshRg0eO2118IxxxxT9t+PQ2jFibyPPPLIPHuktrY2rLPOOnlwJGaj3H333aGmpqassuJxvf3228Obb74ZzjvvvDwjJGZbxOGtYhZJDODsvffeeXAnBl4ELQAAYNUh4wIAAAAAACgMGRcAAAAAAEBhCFwAAAAAAACFIXABAAAAAAAUhsAFAAAAAABQGAIXAAAAAABAYQhcAAAAAAAAhSFwAQAAAAAAFIbABQAAAAAAUBgCFwAAAAAAQGEIXAAAAAAAAIUhcAEAAAAAABSGwAUAAAAAAFAYAhcAAAAAAEBhCFwAAAAAAAChKP4fBoRjG6OX4pQAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(fig)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18ad941f-537f-49ae-a500-5c499058d324", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/driver/check/input_check.ipynb b/driver/check/input_check.ipynb new file mode 100644 index 0000000000..ecc4f0b59d --- /dev/null +++ b/driver/check/input_check.ipynb @@ -0,0 +1,402 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "2ad48f61-e598-4a15-89f8-a0483fe2c9fe", + "metadata": {}, + "outputs": [], + "source": [ + "import xarray\n", + "import pygmt\n", + "import pandas\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "dc10108f-956d-47bf-a02c-f42282da2ef1", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xarray.open_dataset(\"../data/inputs/UKMO/cosp_input.um_global.nc\", decode_timedelta=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "02b11a5e-09bc-4ce9-9424-70dc5f125412", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "xarray.Dataset {\n", + "dimensions:\n", + "\tlat = 36 ;\n", + "\tlon = 48 ;\n", + "\tlevel = 54 ;\n", + "\tbnds = 2 ;\n", + "\thydro = 9 ;\n", + "\n", + "variables:\n", + "\tint32 landmask(lat, lon) ;\n", + "\t\tlandmask:standard_name = land_binary_mask ;\n", + "\t\tlandmask:units = 1 ;\n", + "\t\tlandmask:um_stash_source = m01s00i030 ;\n", + "\t\tlandmask:source = Data from Met Office Unified Model ;\n", + "\t\tlandmask:um_version = 11.6 ;\n", + "\t\tlandmask:grid_mapping = latitude_longitude ;\n", + "\tint32 latitude_longitude() ;\n", + "\t\tlatitude_longitude:grid_mapping_name = latitude_longitude ;\n", + "\t\tlatitude_longitude:longitude_of_prime_meridian = 0.0 ;\n", + "\t\tlatitude_longitude:earth_radius = 6371229.0 ;\n", + "\tfloat64 cca(level, lat, lon) ;\n", + "\t\tcca:um_stash_source = m01s02i317 ;\n", + "\t\tcca:source = Data from Met Office Unified Model ;\n", + "\t\tcca:um_version = 11.6 ;\n", + "\t\tcca:grid_mapping = latitude_longitude ;\n", + "\tfloat64 level_height_bnds(level, bnds) ;\n", + "\tfloat64 sigma_bnds(level, bnds) ;\n", + "\tfloat64 dem_s(level, lat, lon) ;\n", + "\t\tdem_s:standard_name = stratiform_cloud_longwave_emissivity ;\n", + "\t\tdem_s:units = 1 ;\n", + "\t\tdem_s:um_stash_source = m01s02i376 ;\n", + "\t\tdem_s:source = Data from Met Office Unified Model ;\n", + "\t\tdem_s:um_version = 11.6 ;\n", + "\t\tdem_s:grid_mapping = latitude_longitude ;\n", + "\tfloat64 dem_c(level, lat, lon) ;\n", + "\t\tdem_c:standard_name = convective_cloud_longwave_emissivity ;\n", + "\t\tdem_c:units = 1 ;\n", + "\t\tdem_c:um_stash_source = m01s02i378 ;\n", + "\t\tdem_c:source = Data from Met Office Unified Model ;\n", + "\t\tdem_c:um_version = 11.6 ;\n", + "\t\tdem_c:grid_mapping = latitude_longitude ;\n", + "\tfloat64 dtau_s(level, lat, lon) ;\n", + "\t\tdtau_s:standard_name = atmosphere_optical_thickness_due_to_stratiform_cloud ;\n", + "\t\tdtau_s:units = 1 ;\n", + "\t\tdtau_s:um_stash_source = m01s02i375 ;\n", + "\t\tdtau_s:source = Data from Met Office Unified Model ;\n", + "\t\tdtau_s:um_version = 11.6 ;\n", + "\t\tdtau_s:grid_mapping = latitude_longitude ;\n", + "\tfloat64 dtau_c(level, lat, lon) ;\n", + "\t\tdtau_c:standard_name = atmosphere_optical_thickness_due_to_convective_cloud ;\n", + "\t\tdtau_c:units = 1 ;\n", + "\t\tdtau_c:um_stash_source = m01s02i377 ;\n", + "\t\tdtau_c:source = Data from Met Office Unified Model ;\n", + "\t\tdtau_c:um_version = 11.6 ;\n", + "\t\tdtau_c:grid_mapping = latitude_longitude ;\n", + "\tfloat64 fl_lsrain(level, lat, lon) ;\n", + "\t\tfl_lsrain:um_stash_source = m01s02i390 ;\n", + "\t\tfl_lsrain:source = Data from Met Office Unified Model ;\n", + "\t\tfl_lsrain:um_version = 11.6 ;\n", + "\t\tfl_lsrain:grid_mapping = latitude_longitude ;\n", + "\tfloat64 fl_lssnow(level, lat, lon) ;\n", + "\t\tfl_lssnow:standard_name = large_scale_snowfall_flux ;\n", + "\t\tfl_lssnow:units = kg m-2 s-1 ;\n", + "\t\tfl_lssnow:um_stash_source = m01s04i223 ;\n", + "\t\tfl_lssnow:source = Data from Met Office Unified Model ;\n", + "\t\tfl_lssnow:um_version = 11.6 ;\n", + "\t\tfl_lssnow:grid_mapping = latitude_longitude ;\n", + "\tfloat64 fl_ccrain(level, lat, lon) ;\n", + "\t\tfl_ccrain:um_stash_source = m01s02i389 ;\n", + "\t\tfl_ccrain:source = Data from Met Office Unified Model ;\n", + "\t\tfl_ccrain:um_version = 11.6 ;\n", + "\t\tfl_ccrain:grid_mapping = latitude_longitude ;\n", + "\tfloat64 height(level, lat, lon) ;\n", + "\t\theight:standard_name = height_above_reference_ellipsoid ;\n", + "\t\theight:units = m ;\n", + "\t\theight:um_stash_source = m01s15i101 ;\n", + "\t\theight:source = Data from Met Office Unified Model ;\n", + "\t\theight:um_version = 11.6 ;\n", + "\t\theight:grid_mapping = latitude_longitude ;\n", + "\tfloat64 height_half(level, lat, lon) ;\n", + "\t\theight_half:standard_name = height_above_reference_ellipsoid ;\n", + "\t\theight_half:units = m ;\n", + "\t\theight_half:um_stash_source = m01s15i102 ;\n", + "\t\theight_half:source = Data from Met Office Unified Model ;\n", + "\t\theight_half:um_version = 11.6 ;\n", + "\t\theight_half:grid_mapping = latitude_longitude ;\n", + "\tfloat64 level_height_0_bnds(level, bnds) ;\n", + "\tfloat64 sigma_0_bnds(level, bnds) ;\n", + "\tfloat64 mr_ccice(level, lat, lon) ;\n", + "\t\tmr_ccice:um_stash_source = m01s02i319 ;\n", + "\t\tmr_ccice:source = Data from Met Office Unified Model ;\n", + "\t\tmr_ccice:um_version = 11.6 ;\n", + "\t\tmr_ccice:grid_mapping = latitude_longitude ;\n", + "\tfloat64 mr_ccliq(level, lat, lon) ;\n", + "\t\tmr_ccliq:um_stash_source = m01s02i318 ;\n", + "\t\tmr_ccliq:source = Data from Met Office Unified Model ;\n", + "\t\tmr_ccliq:um_version = 11.6 ;\n", + "\t\tmr_ccliq:grid_mapping = latitude_longitude ;\n", + "\tfloat64 mr_lsice(level, lat, lon) ;\n", + "\t\tmr_lsice:units = 1 ;\n", + "\t\tmr_lsice:grid_mapping = latitude_longitude ;\n", + "\tfloat64 mr_lsliq(level, lat, lon) ;\n", + "\t\tmr_lsliq:units = 1 ;\n", + "\t\tmr_lsliq:grid_mapping = latitude_longitude ;\n", + "\tfloat64 mr_ozone(level, lat, lon) ;\n", + "\t\tmr_ozone:standard_name = mass_fraction_of_ozone_in_air ;\n", + "\t\tmr_ozone:units = 1 ;\n", + "\t\tmr_ozone:um_stash_source = m01s02i260 ;\n", + "\t\tmr_ozone:source = Data from Met Office Unified Model ;\n", + "\t\tmr_ozone:um_version = 11.6 ;\n", + "\t\tmr_ozone:grid_mapping = latitude_longitude ;\n", + "\tfloat64 pfull(level, lat, lon) ;\n", + "\t\tpfull:standard_name = air_pressure ;\n", + "\t\tpfull:units = Pa ;\n", + "\t\tpfull:um_stash_source = m01s00i408 ;\n", + "\t\tpfull:source = Data from Met Office Unified Model ;\n", + "\t\tpfull:um_version = 11.6 ;\n", + "\t\tpfull:grid_mapping = latitude_longitude ;\n", + "\tfloat64 phalf(level, lat, lon) ;\n", + "\t\tphalf:standard_name = air_pressure ;\n", + "\t\tphalf:units = Pa ;\n", + "\t\tphalf:um_stash_source = m01s00i407 ;\n", + "\t\tphalf:source = Data from Met Office Unified Model ;\n", + "\t\tphalf:um_version = 11.6 ;\n", + "\t\tphalf:grid_mapping = latitude_longitude ;\n", + "\tfloat64 psfc(lat, lon) ;\n", + "\t\tpsfc:standard_name = surface_air_pressure ;\n", + "\t\tpsfc:units = Pa ;\n", + "\t\tpsfc:um_stash_source = m01s00i409 ;\n", + "\t\tpsfc:source = Data from Met Office Unified Model ;\n", + "\t\tpsfc:um_version = 11.6 ;\n", + "\t\tpsfc:grid_mapping = latitude_longitude ;\n", + "\tfloat64 qv(level, lat, lon) ;\n", + "\t\tqv:standard_name = specific_humidity ;\n", + "\t\tqv:units = kg kg-1 ;\n", + "\t\tqv:um_stash_source = m01s00i010 ;\n", + "\t\tqv:source = Data from Met Office Unified Model ;\n", + "\t\tqv:um_version = 11.6 ;\n", + "\t\tqv:grid_mapping = latitude_longitude ;\n", + "\tfloat64 Reff(hydro, level, lat, lon) ;\n", + "\t\tReff:long_name = effective_radius_of_hydrometeor ;\n", + "\t\tReff:units = m ;\n", + "\t\tReff:grid_mapping = latitude_longitude ;\n", + "\tfloat64 rh(level, lat, lon) ;\n", + "\t\trh:standard_name = relative_humidity ;\n", + "\t\trh:units = % ;\n", + "\t\trh:um_stash_source = m01s30i113 ;\n", + "\t\trh:source = Data from Met Office Unified Model ;\n", + "\t\trh:um_version = 11.6 ;\n", + "\t\trh:grid_mapping = latitude_longitude ;\n", + "\tfloat64 skt(lat, lon) ;\n", + "\t\tskt:standard_name = surface_temperature ;\n", + "\t\tskt:units = K ;\n", + "\t\tskt:um_stash_source = m01s00i024 ;\n", + "\t\tskt:source = Data from Met Office Unified Model ;\n", + "\t\tskt:um_version = 11.6 ;\n", + "\t\tskt:grid_mapping = latitude_longitude ;\n", + "\tfloat64 sunlit(lat, lon) ;\n", + "\t\tsunlit:um_stash_source = m01s02i330 ;\n", + "\t\tsunlit:source = Data from Met Office Unified Model ;\n", + "\t\tsunlit:um_version = 11.6 ;\n", + "\t\tsunlit:grid_mapping = latitude_longitude ;\n", + "\tfloat64 T_abs(level, lat, lon) ;\n", + "\t\tT_abs:standard_name = air_temperature ;\n", + "\t\tT_abs:units = K ;\n", + "\t\tT_abs:um_stash_source = m01s30i111 ;\n", + "\t\tT_abs:source = Data from Met Office Unified Model ;\n", + "\t\tT_abs:um_version = 11.6 ;\n", + "\t\tT_abs:grid_mapping = latitude_longitude ;\n", + "\tfloat64 tca(level, lat, lon) ;\n", + "\t\ttca:units = 1 ;\n", + "\t\ttca:grid_mapping = latitude_longitude ;\n", + "\tfloat64 u_wind(lat, lon) ;\n", + "\t\tu_wind:um_stash_source = m01s30i001 ;\n", + "\t\tu_wind:source = Data from Met Office Unified Model ;\n", + "\t\tu_wind:um_version = 11.6 ;\n", + "\t\tu_wind:grid_mapping = latitude_longitude ;\n", + "\tfloat64 level_height_1_bnds(bnds) ;\n", + "\tfloat64 sigma_1_bnds(bnds) ;\n", + "\tfloat64 v_wind(lat, lon) ;\n", + "\t\tv_wind:um_stash_source = m01s30i002 ;\n", + "\t\tv_wind:source = Data from Met Office Unified Model ;\n", + "\t\tv_wind:um_version = 11.6 ;\n", + "\t\tv_wind:grid_mapping = latitude_longitude ;\n", + "\tfloat64 emsfc_lw() ;\n", + "\t\temsfc_lw:long_name = Surface emissivity at 10.5 micron (fraction) ;\n", + "\t\temsfc_lw:units = 1 ;\n", + "\tfloat32 lat(lat) ;\n", + "\t\tlat:units = degrees ;\n", + "\t\tlat:long_name = lat ;\n", + "\tfloat32 lon(lon) ;\n", + "\t\tlon:units = degrees ;\n", + "\t\tlon:long_name = lon ;\n", + "\tfloat64 forecast_period() ;\n", + "\t\tforecast_period:units = hours ;\n", + "\t\tforecast_period:standard_name = forecast_period ;\n", + "\tobject forecast_reference_time() ;\n", + "\t\tforecast_reference_time:standard_name = forecast_reference_time ;\n", + "\tobject time() ;\n", + "\t\ttime:standard_name = time ;\n", + "\tint32 level(level) ;\n", + "\t\tlevel:axis = Z ;\n", + "\t\tlevel:units = 1 ;\n", + "\t\tlevel:long_name = level ;\n", + "\t\tlevel:positive = up ;\n", + "\tfloat64 level_height(level) ;\n", + "\t\tlevel_height:bounds = level_height_bnds ;\n", + "\t\tlevel_height:units = m ;\n", + "\t\tlevel_height:long_name = level_height ;\n", + "\t\tlevel_height:positive = up ;\n", + "\t\tlevel_height:standard_name = atmosphere_hybrid_height_coordinate ;\n", + "\t\tlevel_height:axis = Z ;\n", + "\t\tlevel_height:formula_terms = a: level_height b: sigma orog: surface_altitude ;\n", + "\tfloat64 sigma(level) ;\n", + "\t\tsigma:bounds = sigma_bnds ;\n", + "\t\tsigma:units = 1 ;\n", + "\t\tsigma:long_name = sigma ;\n", + "\tfloat64 surface_altitude(lat, lon) ;\n", + "\t\tsurface_altitude:units = m ;\n", + "\t\tsurface_altitude:standard_name = surface_altitude ;\n", + "\t\tsurface_altitude:um_stash_source = m01s00i033 ;\n", + "\t\tsurface_altitude:source = Data from Met Office Unified Model ;\n", + "\t\tsurface_altitude:um_version = 11.6 ;\n", + "\tfloat64 level_height_0(level) ;\n", + "\t\tlevel_height_0:bounds = level_height_0_bnds ;\n", + "\t\tlevel_height_0:units = m ;\n", + "\t\tlevel_height_0:long_name = level_height ;\n", + "\t\tlevel_height_0:positive = up ;\n", + "\t\tlevel_height_0:standard_name = atmosphere_hybrid_height_coordinate ;\n", + "\t\tlevel_height_0:axis = Z ;\n", + "\t\tlevel_height_0:formula_terms = a: level_height_0 b: sigma_0 orog: surface_altitude ;\n", + "\tfloat64 sigma_0(level) ;\n", + "\t\tsigma_0:bounds = sigma_0_bnds ;\n", + "\t\tsigma_0:units = 1 ;\n", + "\t\tsigma_0:long_name = sigma ;\n", + "\tint32 hydro(hydro) ;\n", + "\t\thydro:units = 1 ;\n", + "\t\thydro:long_name = hydrometeor_index ;\n", + "\tint32 level_0() ;\n", + "\t\tlevel_0:units = 1 ;\n", + "\t\tlevel_0:long_name = level ;\n", + "\t\tlevel_0:positive = up ;\n", + "\tfloat64 level_height_1() ;\n", + "\t\tlevel_height_1:bounds = level_height_1_bnds ;\n", + "\t\tlevel_height_1:units = m ;\n", + "\t\tlevel_height_1:long_name = level_height ;\n", + "\t\tlevel_height_1:positive = up ;\n", + "\t\tlevel_height_1:standard_name = atmosphere_hybrid_height_coordinate ;\n", + "\t\tlevel_height_1:axis = Z ;\n", + "\t\tlevel_height_1:formula_terms = a: level_height_1 b: sigma_1 orog: surface_altitude ;\n", + "\tfloat64 sigma_1() ;\n", + "\t\tsigma_1:bounds = sigma_1_bnds ;\n", + "\t\tsigma_1:units = 1 ;\n", + "\t\tsigma_1:long_name = sigma ;\n", + "\n", + "// global attributes:\n", + "\t:Conventions = CF-1.5 ;\n", + "}" + ] + } + ], + "source": [ + "ds.info()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "3bab77fc-adea-4019-aa7f-2f644f1c0fe1", + "metadata": {}, + "outputs": [], + "source": [ + "Re = ds[\"Reff\"].values" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "f59cc93c-1af3-4d7a-8975-916deb11111e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(9, 54, 36, 48)\n" + ] + } + ], + "source": [ + "print(Re.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "79232327-c8ef-47b1-9187-2e25040becd6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 2555.67200062, 2579.45250599, 2612.77552208, 2655.67127004,\n", + " 2708.17875217, 2770.34556388, 2842.2278931 , 2923.89076484,\n", + " 3015.40755162, 3116.86064765, 3228.34110315, 3349.9476308 ,\n", + " 3481.78939363, 3623.98259556, 3776.65271298, 3939.93387565,\n", + " 4113.96950232, 4298.91040074, 4494.91666141, 4702.15767454,\n", + " 4920.81019898, 5151.06028593, 5393.10329876, 5647.1419457 ,\n", + " 5913.38757075, 6192.06284309, 6483.39507758, 6787.62359741,\n", + " 7104.9943558 , 7435.76263219, 7780.19305938, 8138.55753557,\n", + " 8511.13730095, 8898.22368594, 9300.11745156, 9717.11858314,\n", + " 10149.55686776, 10597.74965445, 11062.05278729, 11542.81645459,\n", + " 12040.41520099, 12555.24096946, 13087.7113953 , 13638.27861956,\n", + " 14207.42265373, 14795.69285374, 15403.65395338, 16031.99387819,\n", + " 16681.44646124, 17352.87798226, 18046.2905 , 18756.7035 ,\n", + " 19483.887 , 20228.776 ])" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "zlev=ds[\"height\"].values\n", + "zlev[:,1,1]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a9b7fe64-2571-40d8-b91e-81d0850cfe25", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b8f57645-805a-421b-97db-73a413e636f2", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/driver/data/.gitignore b/driver/data/.gitignore new file mode 100644 index 0000000000..496ee2ca6a --- /dev/null +++ b/driver/data/.gitignore @@ -0,0 +1 @@ +.DS_Store \ No newline at end of file diff --git a/driver/run/cosp2_MIROCtest.txt b/driver/run/cosp2_MIROCtest.txt new file mode 100644 index 0000000000..e0add22ca8 --- /dev/null +++ b/driver/run/cosp2_MIROCtest.txt @@ -0,0 +1,109 @@ +! (c) British Crown Copyright 2008, the Met Office. +! All rights reserved. +! +! Redistribution and use in source and binary forms, with or without modification, are permitted +! provided that the following conditions are met: +! +! * Redistributions of source code must retain the above copyright notice, this list +! of conditions and the following disclaimer. +! * Redistributions in binary form must reproduce the above copyright notice, this list +! of conditions and the following disclaimer in the documentation and/or other materials +! provided with the distribution. +! * Neither the name of the Met Office nor the names of its contributors may be used +! to endorse or promote products derived from this software without specific prior written +! permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +! FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +! CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +! DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +! IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +! OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +! Namelist that sets up the main COSP options +&COSP_INPUT + NPOINTS=32768,! Number of gridpoints 153,27840,7081,6912 + NPOINTS_IT=4096,! Max number of gridpoints to be processed in one iteration + NCOLUMNS=140, ! Number of subcolumns + NLEVELS=40, ! Number of model levels + USE_VGRID=.true., ! Use fixed vertical grid for outputs? (if .true. then you need to define number of levels with Nlr) + NLVGRID=40, ! Number of levels in statistical outputs (only used if USE_VGRID=.true.) + CSAT_VGRID=.true., ! CloudSat vertical grid? (if .true. then the CloudSat standard grid is used for the outputs. + ! USE_VGRID needs also be .true.) + DINPUT='./', ! Directory where the input files are located. Useful when processing multiple files. + ! Leave blank ('') if you are using the full path in FINPUT. + FINPUT='../data/MIROC_inputs/ctrl_MIROCinput.nc', ! List input NetCDF files + FOUTPUT='../data/MIROC_outputs/ctrl_MIROC-COSP2.nc', + !---------------------------------------------------------------------------------- + !--------------- Inputs related to radar simulations + !---------------------------------------------------------------------------------- + cloudsat_RADAR_FREQ=94.0, ! CloudSat radar frequency (GHz) + SURFACE_RADAR=0, ! surface=1, spaceborne=0 + cloudsat_use_gas_abs=1, ! include gaseous absorption? yes=1,no=0 + cloudsat_do_ray=0, ! calculate/output Rayleigh refl=1, not=0 + cloudsat_k2=-1, ! |K|^2, -1=use frequency dependent default + use_precipitation_fluxes=.true., ! True if precipitation fluxes are input to the algorithm + cloudsat_micro_scheme='MMF_v3_single_moment', !'MMF_v3.5_two_moment' + !---------------------------------------------------------------------------------- + !---------------- Inputs related to lidar simulations + !---------------------------------------------------------------------------------- + lidar_ice_type=0, ! Ice particle shape in lidar calculations (0=ice-spheres ; 1=ice-non-spherical) + OVERLAP=3, ! overlap assumption used by scops: 1=max, 2=rand, 3=max/rand + !---------------------------------------------------------------------------------- + !---------------- Inputs related to ISCCP simulator + !---------------------------------------------------------------------------------- + ISCCP_TOPHEIGHT=1, ! 1 = adjust top height using both a computed + ! infrared brightness temperature and the visible + ! optical depth to adjust cloud top pressure. Note + ! that this calculation is most appropriate to compare + ! to ISCCP data during sunlit hours. + ! 2 = do not adjust top height, that is cloud top + ! pressure is the actual cloud top pressure + ! in the model + ! 3 = adjust top height using only the computed + ! infrared brightness temperature. Note that this + ! calculation is most appropriate to compare to ISCCP + ! IR only algortihm (i.e. you can compare to nighttime + ! ISCCP data with this option) + ISCCP_TOPHEIGHT_DIRECTION=2, ! direction for finding atmosphere pressure level + ! with interpolated temperature equal to the radiance + ! determined cloud-top temperature + ! 1 = find the *lowest* altitude (highest pressure) level + ! with interpolated temperature equal to the radiance + ! determined cloud-top temperature + ! 2 = find the *highest* altitude (lowest pressure) level + ! with interpolated temperature equal to the radiance + ! determined cloud-top temperature. This is the + ! default value since V4.0 of the ISCCP simulator. + ! ONLY APPLICABLE IF top_height EQUALS 1 or 3 + !---------------------------------------------------------------------------------- + !-------------- Swathing inputs + !---------------------------------------------------------------------------------- + N_SWATHS_ISCCP=0, + SWATH_LOCALTIMES_ISCCP=5.25,18.0, + SWATH_WIDTHS_ISCCP=2000,2000, + N_SWATHS_MISR=0, + SWATH_LOCALTIMES_MISR=6.5,18.25, + SWATH_WIDTHS_MISR=2000,2000, + N_SWATHS_MODIS=0, + SWATH_LOCALTIMES_MODIS=5.75,13.5, + SWATH_WIDTHS_MODIS=2000,2000, + N_SWATHS_CSCAL=0, + SWATH_LOCALTIMES_CSCAL=6.75,19.25, + SWATH_WIDTHS_CSCAL=2000,2000, + N_SWATHS_PARASOL=0, + SWATH_LOCALTIMES_PARASOL=6.75,19, + SWATH_WIDTHS_PARASOL=2000,2000, + N_SWATHS_ATLID=0, + SWATH_LOCALTIMES_ATLID=7.25,19.5, + SWATH_WIDTHS_ATLID=2000,2000, + !---------------------------------------------------------------------------------- + !-------------- RTTOV inputs + !---------------------------------------------------------------------------------- +! rttov_Ninstruments=1, +! rttov_instrument_namelists='instrument_nls/cosp2_rttov_inst1.txt', + rttov_verbose=.false. +/ diff --git a/driver/run/cosp2_input_nl.txt b/driver/run/cosp2_input_nl.txt index 3520ac6a55..536bf27724 100644 --- a/driver/run/cosp2_input_nl.txt +++ b/driver/run/cosp2_input_nl.txt @@ -36,7 +36,7 @@ DINPUT='./', ! Directory where the input files are located. Useful when processing multiple files. ! Leave blank ('') if you are using the full path in FINPUT. FINPUT='../data/inputs/UKMO/cosp_input_um.nc', ! List input NetCDF files - FOUTPUT='../data/outputs/UKMO/cosp2_output_um.nc', + FOUTPUT='../data/outputs/cosp2_output_um.nc', !---------------------------------------------------------------------------------- !--------------- Inputs related to radar simulations !---------------------------------------------------------------------------------- diff --git a/driver/run/cosp2_output_nl.txt b/driver/run/cosp2_output_nl.txt index 4c61520a2f..a88fe3eebf 100755 --- a/driver/run/cosp2_output_nl.txt +++ b/driver/run/cosp2_output_nl.txt @@ -147,4 +147,6 @@ !- CloudSat+MODIS joint diagnostics Lwr_occfreq=.true., Lcfodd=.true. + ! Doppler capability + Ldplrw=.true., / diff --git a/driver/run/cosp2_test b/driver/run/cosp2_test new file mode 100755 index 0000000000000000000000000000000000000000..c1e262a605680eaed12b0207108a53223a36841b GIT binary patch literal 28621064 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Ð{Ia4+Om^(5lbwBhj}yF{&~X^r8V1Y@4RlV}BgxlJ@3;&N)$RtQVsz z*TR=F^-undy?vfxUHn!X_Hm181Bpi-=DQj$4pM#S?rRyudV;=OpQ_^1ei%waxOp}k z)`rZC(o#ALWKAaAeFnH5;Fd(3u@DM-6a&z&#U*dxmgJ`dllg4BSJ&b%pYOoN!xuOXpFB5xNQj zw=9zGe-Z9<^nW_y3R#j|0bPaBeHFM-E}XLlF6I3K{MDbsJvn*kyIBK)6WM}q+Fw*T z2TD=sC+jo`FV6#d4}v%FC@tac0&a|}LdBEu-~Kmjl;kB_>`ZGUks7m(o-b?GXmD z%Ama)vU)-~c!F^A(I2`dU)hpe8mWV|Dy{)t+-EJ5PLj)&WJ9{ek39=EpJ_Bh~m+Ot+GuTGVpU{7mAnaMXuaeD#L)Jww+$<___)KALY7m_UnII@VdSjY$AksW=4 zJ;c;T$op`2pWIKPJ-9?O2Q;HK*)E`MBsj@OvRQ~u#SO-EDnUo+-%jWIMLd5UX

U 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%0A3Q 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

fA^l5aJ}}4jep(?oDaaM2+Pqr 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ē*e@T41essj1iiH~ia~v|k zk9+sfk6k8?(1*hcPf};?W-O#H>22d-Q}+@mV^}%uKFV2QIrFzbvo*$xEOE+g1JVY{e_@Rp2lB$}O8bf$HDz}q z(`?%sp_kB_^a87GHpRbu1<$vXc4Y$BfzdY4GrS9ZHS(xD+TxJ*Ku@GSVwZg-G{FHr z2u|k-UPv5!0f}1=J~(JYp0q>4X~$E*btCXBPwMFPad&W|i@Sr!^ef{ zq3lx1%kSbczJU+ApyZ%E0*_>7827|v7`YQ%)QLP|B>YYmxDRYj)IjgSi&FkFepkM= zH%-2KzZ-Jq~yUi^QUG4)(}!PIm23itD~k*J;xj$d{4@l^M_YI+qLk$v@U|f5>`JW@!Ykxi+C*fTe9GRy1w9U+B{j~ zu62xJt=knn0NhP=9F893XiW~`@$Tdd<}Krd?szqCNo@dza(C0moz~rHj1%$~gR$De zIQ<(QUGDqrWW3JWV*-0_)r^l~L*uj=9y2snzp2w)PDe81)O=HdBYy_>dl;*FTWGAR zsAD~KR16jQb&tT;+|SJCj;xH?;=wUe=u@%;e1+%f!1spq8b zPb7|I+SDiE2TM4cI>H?M243S6+7-_EK!q08*vdUt z-fhfX!Q04BG7fJ=b@bHDxc}TJ){1!d{parGPg#R0t4qB5s&f^r6UWXJzVHUJ);}`8 zmfMk+Mu&Uq7TjNVc)>$;P2APLcOib}SAC%)z6n|>ZJh3dZ=A&WJMACKnkVh;2fpOd z*4>Kd6TZW0Yq(nH!f4}Tw0AjY@hfTDE%2*PgEvx7I<)xkO~Tu;2ElKL?JHRyo~Au{ ztPM{>lMgR=uq{m<{A)e3H(95jq`Y+K@?mMSRfeq7uVe(}9oH9aT|IO7zlNQ2vAcJi zHxsuPXVzALYo}OqW&VG`9d6#x8u)QSh9Prh19NmObF@5L&Kuy_<2cVUad9g+mk%Ct z{*9giGQ~pPR#5YZy-LC3bsr-a`3kv+;Dg9U941a|GUuAeLz+PGov~6-h$@TQgD0?G&&Ez z;7DG9FI59akSD9VhcZu@pGpVd7;{7Bst)|CC}Sn(&__8lxexe1h`vJ}rdJ;P2%XY9~xs!4#~1YIt3xSlI>~Z+tg|4Cmgr;94I;rRnpGM+*zmo zCf;M6Wy-c>yo64QY~?fNH?;NzOAk?z_G`I9|AanNb2ez5 zEsI-N04}q@1@~v$a@SvDia+qP4v9@PvhUD zhr6Tx#XV){hu8@FfVWy?KJ>Ep#+DyvT&v|QF4n#Bcx$e#5uY;N+vjA~e$mNgd<8yy z4&S|#G-}*G;tsUAF5Cbtgtqxv4_@k~y)QIwIJz;-3m&htcru|gg1463{FU(`{I&Qn zYi+1s09~VP*!pR)__DW!zA@+G(X*)jTZnHGp2^Q#l=VUQrOvDkzhT~1F(>66+c=>u{lGCxp1U);jX2#Lf_=2P0-_cZA zUljjQP@0-4@+f4Z!qXh3jXlA^SH~xM?%S7F*Vl$_8+Rth0{gUui|U%DKdjb?row*l zP3WvQamM(ptR;6(t$Ra@Q8FpfaZg+L;P=wzk#-Qcd|!mzgN^ZwRq1%!WBP+_Yfsbk zYwDD(HuUl|Xb8EqzLPCp12y*CqVFjF0fcJKWGY;By5$ve} z&%tAFLFOp(XL;jP)(Wwe)B|`_0_zRP7DbQ3A8oIdwLO2vuN58At{vjIjcj>>y{(6Wk-A42omD&6*3%<;iXVeRGLA>#L+`ft^vJs6goalNO`QwRv5-9i@&L8I zah{ohzLMZr=T(Ugq1_6{rePnKHmP-#vo*o9D@Q_tA0l{n z_LdO7$$ffj4OP5qJAC^%0X%<^d&uqZ?Zlr#_=euQ;?om=Vd*2Z8@S2&D*9vx%G~JP z*gJZSW6{P5V2gc&fx@3l8z;~uMl7dtpoWZU!>g_t|sR))fE3_z(EIqyAUM zlp8febY>nc>SW0NWJ84u-4#8!lRnnMFO<{o(&d~Ff#2~OdaZj+J-LTyA25@B%oq5l zn!J*%Te8P}!VPaUy*YIhZtJ04w;kr++A2J1h*!!(c6|hXdMWoE^I4bV{+A0Je$<96 zCOkw_MZYE%S*gfko?!nvivMHSpG(hlouj-il-q?e2j?Mw*#u3E`A;GCL1R3U&jxR; zA)|T%-L+Bt#pcankvGa8`Cs0`#5$|}w@hVE&3u)%b5^z~2Kwsw>)tdC7+dQ@I=r5= zzschD;0vZOAE!cNt^L^2w3Rt!j8QE0+VslVJ!p3feG(baUaf~`@w~_Cew{gg;?bLRr6WJf z!hS7#JJCnn&i-!ZFQC8dy&mCC{yOHioTu%mFG?Fty*ug~(l(J^-ZbtU?lQVkp6mlE zv)HRMN9D{(jS;#}({n@iZy!T%Q*4u8XS*VFufw{7g07Ri$s@LJTaWFS^&0=f{CDyH zDP5;LbT{&}7-c&xoiTC2i!{UcBtmCHV`=l;&KMRlc5<%w4Ys>p$A+4W-e!WnB3w#6Et^Rjn(_Ga`c z#J@0PS4?<`JqaGV zk}b>?S^H$J%%@zjgI!75YUTy9oX7m+m$mEaUM^!$D*M=p8KiAU^Er_dK$r8FGhd(^ z$-JBxnll=_Nvyj67LP9E9%xsgEw-hB@i_{%@dZCSQxX-D zHNW_;CtirL^?T*#PT|U!r-Wwz3{P2c3HU z2k2BfXWcUQJ0f3`vre&rBycOX$8w$*$@<_+Vs8uYD|<-R0i~y;-qC|k z5qk%$weInMY|Twz-7kZ8!XDB<<5;#KcN8|TzE#FeG`4ilF_3F2zPMB2h1~xCZjGyq zXHDjJ398>7>7p|KaF##~O5lB(00Iqu@moN&5^q)B>OKDeK$4giRpq zFt+Q~gp(E?#5tlhca6=pOKhVbC!Mrkog0kS>W)#q@GzW#dga`*QqC+HkABFqt7Gujjv}P)m_E ziM=K_<*cNw$H*`FN@+t2>+;R`%Vj+Trk9-CjnV4tlzo)_g7i6Ww5#rI&i`c`KBewo z5O)>+X!OHnkKDw#93{M*a7Vj+?vmxLxw2>c{F&C=DAGw^a?v?&nx0?RIz6H8F3Oa! zd4x&XhoO%$SJuv$dZXxnevBT%G%YO3&RiE*$(?xN*Lsuhcg(f5r_e8e7wN@(dmp|; zc#&`5N&49PJElQP5-C&k|F&R<-^E>wH0I<>@SpGVm-C&3$G}fTlSet$qbn?Rl%NkH z_6NbE$5L2_H=TYuXDM`g|E6`br?QX8eY8^XKhczB)hRZ`q~6i!H#|r9{b7}}rT&hD z|Bbq&?tz5g!8}@vEV-0+8_-VCdD&4|l(v@kMZ)86h``1OX@}A7*OP3uDeN1EchIrh zdPU${;Jb08$jWu}V?>{*??8Fq?407UIt3xw!rC0JP-(M#Ubld_C9>w2G zobY*v#$xN|rUXZyg}<&VRySzggN$_(BVEK9d!#5>(co@ zNx0BMi(eEP%zaRUz4kXflr5a^^Nic5U-(7YX9}MvJfrZA!Z)_(8HH9)*ub3=(h4uC z%4R)(T|8Hw?`#x{M(Qa7>1i$BT$HRsTjXrRI zc_eNtE^o29i}IlT^bfpllNEks($!ef#FAF>%04cUIz$#J`6Z3DpPbrG_s`l}${u(z z?Y8!l*4|O}t{uJ;{U=)>gLB5sCok$9J$(4Q(mU!$m=!-%;-6=&0NxWE7uw{w&n8_^ zY307_xNk0|AN@7`=B{Ww^GbAF$+xSJeVXqVq4iGenV>^eD>_y#a6(6iu^HW~eDta$ z3|HOt&5zV-{o9}fu7mmqOFe&&k}<*>CR{ z8f|b+;9YkR`xVS_rE@q0T@LQYi2hq0`b)k!uHd_zbuT5}c&M{+6XPjqzk_eAc+(XO zl<}_5G3;@db-@N{gvbB9E0~Y1^9_ZRVW&+V-VmIY5ln@a$bS9b=rT!u(Q|x*Fdz49 zwt`celSEz;9oU&|tKG>Mjz%|H~5EJ8x2XDt0uRRFhv>5(UdV#=_u$dz`?OYP z9cdc}@t1_g!CFT;eR)2&rro-;zV`ejHd!inpU+(htr8fII?)>EZ@O52x{SS@eNwwI z$fECoY1k`;=4Xu2&UBUU=!@T939Sb&q&&e_XF_i;cj64eTP?qjx^IvH&c;NA?x()H zpF7{`uBzsq`5A8;aaYv|zj+;V>7VeT+qrWn{LD<|r;EFmC7eyk+dR&h7jo;_Z=UD> zAaO_GIjs5N^o{gt4XN_Rt8oo=aR$P>2)euIA@BiOktydJ>^TnTpLDs1?F;><9L?-qP*Q}rL)pF6Rzh?#T(kvHIq*CJgjt1*Kl<&Bs5Mp zsBt<(8j)ERcG13>Qq7t!JO+EWw)s$3zAse1gzN+7S;;`0}6UbKBeJxb|ak zQ|1ckZY150&D{)SA98m@&i|!e=PddiC;B_j2vslDj5C|3oez^K1`tetCmX;Bf{VR&}4J&Cq+Xy)HJ_ zp>G3(F8xjD>wT3urOXYTyCSM=>ds@%m!4F5>$RfCK8bIsZ!_(X^QnKc9~As}=cd-& zKT^ge^TgHHd(s+DUq1!^xxioOSjyG#t;t!+=D@A&Sq0avaYOe-;eeBO(KXkVD&KVS zS!ZMu`g2E?x=5cRa*DsuHw)jtog?cA_+FIgy@xzjnNHeb;f+@0Xv3LFq_Ogb<_hmD z7bSRaCA__zr^x5P6`}u(^)lhrq45F-AM{+gCXP&a$;2t*+SU#DP?ct<3;V3*eI#?- zEZpi;c^)}RyFAcLl?VFRzWjH#o>%K|SJn+b;~`@vV<_YO95h9Z8{x9Xsr&xG$Z6t^ zi!rm-j;~L*##KW01pkCs=2tfb|Bk?;nfN?(Poj_k$-YF=${006 zlhhn5>fx37Cv*0E=0(`cx0AB4^Abvze}(tkcJWrY+~d-U;=Cd^l009wOYr?^m(Zr7 z!58t-HO%`u=_USRS=Uk4&lJ56{9xP=6<0=F8;(BmM`5+A$O@-jzj&fY zaUh$$-i56zMfa^9I=&TK$Rdk=oOG5A;W_wa9}&oQp#!T0s``&J%DUfdR8l@R*m7mO zJF~BgCr#(uLi_Lj=%`dtw%-=v*~`7m9dqj!&TPRpY=b^ZfAv zdsk05?~_Hh>;DSX|M0*;?qG+`8M~|gccTA$&HhiK|7%qLyQ}`sG5f!Uw`tnIH23*G8DINT>ft823)}U1ZB0Z;-Q6Juu|<{^tGK zuBv|%hH1kZ=wA$HLtW{gWBzsYrK{@SN%MZWWBw4%xqG$Ue|KR2ublD9q<>B=+*5Ck zZykGIk$a2nv(n|iz_xnNKwwCudKbn3k1Lrk1CF%5vNrAx74{i(MAAswB*KlZ6OB*F z`w8K`q#UE7&+SGtbjsItlHrF(Xih?J6q#!!yw`V0Hls577slrg+0`8SynmSSC*Fq< z7-)-z77HzTIYWQZ#+!&TPtGyt0z+;#G~mPA7zZ@;9t3W(KkkprKdRdRh&e>~}V+nUhO0>9^FTwe%*;78L**&*0R}zTVh%Z`rRb8vCgVNc}Anyaj ziCyP3?i=nx2jUOpXTRbVm`~Gs$(zP4DY8D;vyJlj@kUvn2}W}SZ<@hhtz9lOUk zB7gCpkT*FgZ`O5V&Y#|UtruCmdiU-OZxolWjxn@zQx9s9T6CG4H82%jpQ>&KZ++HI zLnp(B4vc@YUR$=YrvYtzEQK@h4U?CMF5)*cIWzSQz0DZFxRkHH-H6e;a9^O0r)=Y$ zhP=;IQ7n7>E*@WTu2BsgisAi1AM32(d6U+qCHY3)E!R7?@RDn8X=G>55p3vav{PvD zt*qDgpkpj+ZYH+NUQ14OytdPSUn)F{ld+4}`nq-IEI7eC=bbnQh*59f35|&amhpN= z_Y!!?oAIMF7<)53ztA|bgO*ADbn@?k*6~iB_gVJ*(!O|mNB4Nfl(l;Q5@5ICpmzR> z=5%jDH{SnT7VdQx_4n3fg?o?c*u~nc*G|F}eT}WySg&91Fn&*-(pD{46OF8^s~&vO zrN8JO8tz?68zo&i-{N|4i%2VVNZ#p`?`-Jr-TYxcBat#+COm%FnDdg>pdLTxEv1xM zf6!K2Pn#Yw^Bd%o{E7B!y-OH_t~XxHQyLL(Y$WX*((XyTR-G|Pc}vVTJc=vzzeO36 z&gr_=yO%PgytaCy)E;iZ^EJ2*=fI}@7;o6}Q^&BN{wa+F-@ zt3N5+Yn17=QceN+CGT4oB5qLS5`Giyy`6A@L8ic(dM5#A)qdKunKlS~C4H^gj||ew zx7C-4=JzPv67cd}bT8z+7?C6IgeMVwv!d=rInqbfzx->xnKtgLw=3IE|B}gHM*GU_ z+Hk?|nc$t+pGfCjvh@l0!PgO#i5{U>Y=6l+xbgPh?iO@K^6WiZ5}fdr3l?lo0Jl29 zYsoyVj)#xvr9JjeztEj;Y4?%6PEQ$qcbfI>J0F6Fgo#YG6X8DgSX<>zDYDst@S8iA zxqGLMWQ;C{S-teT9n4m8cVaVr+}3U#tUK9$9gI^t(?`&mwbsK2nnLTL=u%tj zp~Q<`SKz+JPvlVN7uLh8>4EchZ0I7FvkfUaa6NrHzi>}wgFWwq zJ=lqnG!mb%eN3=O)3!K?m+94TDW5Pq}{~k);)e8T6 zhoDtoyrp}H+nN>eeh2M$2gdx|_pkE{ZAJ%pt@Fz?@3)h~IHR@)g6?pm{KZ+d^@TCU zuUNn9p{dW^tmP)TigLD1v!iDa7I>1e-8@M*cFyTwtcBi}^|8%|WchfRpGVxMpfw8sOol?id|RrJVR4d(#pMU8}Ez_nfwSbg-5^Y@NNE zQ9rIIEf3w4XCG#NsP%2RRb0L`bQSVH8y%c>d~^`G$~VvQUC5sKR&n{(rfazm9v#hF zIYkFn*tN!MHLWp0vo-oR+r9VKj1E3T_%Xii|NO&&@1PS|z#;O9@Zza1{rxGo>+cW1 zzl6I_OVL+59t%cBr{J4@=D}a^cX~q_a6paE%K%jiBsac315=o89&@BPuP|1?LG^!7D!hCNl$ zqsOXU=*MBB6nH;2V6^O&v{h@+$I}aKla@^4y^vM=uus%C#N(ld+PZxAZSfj5mEZxj zxsGl+>lb?@cM&{@wrKI{B)*rp6Sl|O?d}$6UJ>{3vHcNiM;?tm8n>KX=*WzR#8ihf%+oHTSNfw5g<*eN5>-ySHW`GJ<_! zUf;eB-g@ZyXK6y8`v&TuQ9GvHZPdB7;CRvtTyDk<0(Y^QH3t7V;QOl)+LmB=mXToZ z-N>5SNI$Cl@WiBPblQ7iwh=y)@ey4YKk}4wpV^Ef4lQ^+`TaJRtjCW%2QS^goP8j_ z;eggKnEg%Bf#L8Y9XcU53U}3pMQXt(qg=I<3wJ~_HKFb2uCYQddF)WT3ml!+FS7EgS{oMy6)7jmwNW{*O>2_)TQ02ZEZsC zBJFJG_S&l=+gZDlvHei1y@EDEOZNLFBiFf$^$(ih|Ik&N{|hw-SN)N=vYkb>PdB7^ z?*_MIE;ieT2YinpkJ9=y-gA%LaD{2X1jgg8N5c#UxZE^PpIHRW%8M*YyZhk|#yy?F z4ee%a>kSI`dIr`#-_hU=@!Ibg2dR56xa6Zv>z=>GNPxEGQHOu0tJZY~Z6N+;U}kd- z;_aKF7c^+z&A@CqumTs)zfIju)bkPTxMorR;#S}$Zvef~04&n!H#psZtgJK(n=Br! zwk#W5DAsD%A@BO2ef`L}%2>aot_0|)yca9&D9v(_-c{S2rfre_tYzPHPcQgiPf_h? z>K6DsU38t-M|poX+toz7?)u1X+*1^0B${n1f+ouubEdQ_Roj|JyIizuT{`VrM!P(b z#{V(fRnm}Dw~9T12@y|hhDzL@PP}ZT0|R6 z!jQ!(xUk3fc|tO4c`IFy`PF}-kbeja%Hum3iyjO1?Rx9O+Y4Z6u5iF~0acbhu2yo+32=v)`tF#jJJ!3Pebivq5fYFB=* zuS=4&+$lTcE?Dotq8fC1B03ozrS0@v`u5AXP~UuU(T4O-`X;uI?4(&2mu-l>fpmL^ zmWLf0_V=$0{4U|lHW~AR4>E!e{zc9v>F1c1ytS<1iN4NWN737<%Sf|ss_rdcqZ$2*8dLigy^~rpPpghEdN zJgQfxb!tfKTl5~`w(3#mT-B~?UBTCS6{YQ3x-50~(j}>P|JqeuzjSG88SBibhcm11 zS(H&-_Oce-vGgh8pG>_krXlU0Uu)HAk7iXjozbh)=Z&uR-3gt(o&C@#Ex2oTc=gV~ zMQLR-n9oaDGZ#cu%Ny0-P9DwPWUK)X=oLN`9(a{7&p1%Guec@U#x#l|Vn9 z!WCR7!VjJL+UM?JG>~W1mVIeES*K;as6QK3EpJ}}*B4~}KNSDwNg2krX<6`xV^p0| zcl&y!Y}wb(qlpK0jP*!0=1Wpb8S_-eTgG`5<6O$PJHd~gjJ=F`AJWN~_a#j!W9=Y~pRv~@4P!22 zU&^@4n9JC=AB#fvD0=%bZ%*WVwy*aS#@s(r`W_xw%i4cI`9t$6jK0gdDDX(WJb%7} zy<39H?*kfc z?+Et1a*lfi?jO78#?A1>+WE?rZ(@U2&Q;>!uQYhO@`r4}a?XM`oGV|sE)V}STX5@# zVYM6P+JeLB*M_;7oSoW&lL`kHZ*bd!b9g^?4ripI>oP~3k#-NHknV`0Gu;FJIkw;c zzAGnXVo#8FIVWaPW@d1MJ2M!dtayYI0c@Nc2BuvM}r#|}Zx2gs5dId_nE z1?5}}12XS-f+ovZ*v5022dl%iZkw>jBzty|8K%oU{XYqBgC4fLr)0?p+Px9-+@8?; zSj)KgBd|R@FR8AceV^FKTVmRtI6TiuSjhGS`#;ZNcof#_*k`fVm#Ia=m-Ke~;lHf* zZl06LxkOQpv`yN%iMG8?yL=yxu9dbPMK^*oif+=rTN*GY@6L4|fl&1ux2b>qcOrEm$$h7TgIQ$avR-qrSXQ z8YyQd-)qwaCoW!_6tDy=SOP+AQsr`?6wdTI!~r*cH^>5x#OOchgI3z14Y-!PtF5nP=DwV^fK{ zC2^{((<&^Cx1@VsQpP-0Mx5sZTO4Ivp~|St&I}%>ZJ*I@DXSbjmwrgwuhWY}uQf;R zjnAIV@dnhep`wM z@O`M?wqnj4awbyd-}`MZo{77j|A+l{7PsK)+V64>_uE~(slP3_DJ$0dLBE<}=kwcV zZ$GOC8~XW*ced!kmq_=1zt@X*H|fFOQ`TGkjN+R2^x)&2i*ok%D=pq;w*?n=Dav`T z-^SuCU2Va`q<^KYbRlruNF zC}#-$nL^o8r|lY>F@S#A=+mmmP@g{H{=3wh{BzBCnEqGsm%8QM2Pr>gw{D!I-zkJk z9kJw-_M9bO8RNRIpTBsDz-XV2oIKRNJ%rUv4)wDJ_?Hd01Y6&n=B$Jnmls0Y2=b?0prum4RwsM9ZjF=t4@1YocN_(#jd8Z%dz2-4(HZc{xuNut zdF*|MJpMfY0DYjF*8Kww!jE;INn z=>$)l&^dH=z=7Ig!6iTQN9+*`KKa2>jd+2F^k42t`G(qp4U8%C)LS#o7F-r-_ta!% zDjbrs{EUI*@q^=%rzXo5tbq=wIOg6F!3V;ntu^VyjSR)9v?KW*Zsuc*YKEBpA^4L` zf3hw30dN(Zsu{=IJLvPMyh)^qH~oF^$C>`__`90^Xj||DV59Of4{9RJaK@#^Zu(DA zCOSu|%#--hLsI@@+%W_1R9^61bemN8honIVO8F1z!I!NxjA6~kX81PJG@1VA@mpz_ zLp2A@a1Y_{nf^jO_<@xMJgR9l!x!Rz)AY|J4Rb)Xr=IYAX80WZJ5B#Xdhk0dO$p(f z&G2dTg?Xp)78AbF48M!HZiT->c$FDGiGEq(s|l|#!-wOy!k6POGsBap*9u=o_#S$gmT%RiE~G51y8A;7`%CzHnV_opt)A5VJbs7fD4dduIPzF2-c zby@ziTJSr|e@YA9$$VFNPin!(Eq{v^eA)6JqmP#VV=dT|Ij+(-(HG1Ap`8Dl;fE;S z@*gA(^g*S6le#SbKI*dk+sMn>^m1fRPt8W!In?yOho5<`!prb8kCndyKeSW%tMEfZ zlz%gR=D+gq#Lrw;{(bnF+sgkYe&)6EH{xerEB`_K%xmRu!k=XNKgQq3^ta&eZu-yS zk2d|S_?f>dFY8jxsf>_c=JH9?4=t-fFHxlt+VY|4hYr;oLT_=S7W72+@tj3BMWunB z)oe4<2;F$z^h0xMJf>ghQlaUGp4Kch{m_=0xxDi?R}a2EEfgl}M9uTGa}MEiWZj7I zY`V)#?;-pl!XGljC*hwa{_Y-W%PP{oeivyL@`uK4nxqF;p~tpyct&tjy6I2K2tF@i zNjh$4Pjy%NR3&}t=rPa(+So@AZeotEitOQ0@e#yVXu%c4ZyKrxH+GeLaUP>Y!W^FG zC}U$ZHsQAEe1jLz)9MKBO+{iC`84-)4@tPqQ{9Suow;j#Xr_bKsx*z*ren@N7um~W z95dsfz0Z>0IEh{5;a3{Z!UtBfKB)3fbML8MBVP9yr?4diomkJA#-SF4u$4cI@a`0Sv2HKP0>-x?*D6q>A;S>MrS*<|$&%>}M_ZL6@qB+6d!aJi@A8 z(Sq-@j`^WW)zI?ifX!aQ53|OWP9%(VOY%1pR?V6u`E=I5gOX<)@g)LVn|7x20GMianWXXxRyPTK{U`MLwfm;2h&Aq8{HX@B)PG zBX5J$F_J#6*5HX~&k$sz9^_+Lq4H$iUP|5mLdu~|$zS@29z2R))@HFalz?CO1>r*~ zk~4ym#uFLgspt=U+i4lJN}7!uxd_baJj@~ zV;k6>5%Q12f7TW9XW>6(`bXkFY5IrYZ!!JJ_>X~$(8m?bueHUIhAOi^;U5zYtrT2V zVey1D5eCgv-*J3@XqM9*{~^)@<)b%Tvhh8T-ZtQUm_xVGY);_OxX&t%dw$@{H*x|Y9wsd80 zM{kk6Rv~sWi;(4O--hhjmNO65jz}mLd$w8ViPq1%pZn~C9iL#c<^G2F?X*YP#q{6F zJ9q3s|HxjseVWnJ6IB{H8}-?`Ape(mvCA>o(M%cnoRc2mF0RNpL^qMUS=SGd`ykK( zC-+uMkpIhmQ1*z;=mWRy-DQ7FpFZb)SO#Tx6@5MS;u?A6-32Fke3Ri}3x2&_?j&dl zTCR1EN8S4<%LtZmha?``PQHo^Y-r+EneIl@-E6wsaOVxJ^X)Xhp-1X_pZWc!={B0~ zd!~EPbPwT5{tr#J$qfJ4bdQ(}X63RLDVKFyr5kE~4>!Nz5mY#IU!`Nc zR^P1o>YH_4xg}8NSSP3r%;S89&!_=a}vzX1v>UA2P$I znQopLKG}5dGQ%gC?nE;@+jPg7ZkFk$<4XHRn%~3C@1dqU#0*b1-TtPVWX8vv-+j#Q zIP<%^>2@{4qfIx$bnRw*EBBqGerTtHC+oBNhJLDVXs2?ao63b|Di<25Tzrj>w&*p42LkW|U2Z`3#M;tHTxjB{Nm*@Y zKXMj>4Ak4<2EB*x73xA~=E&91p>eL@)9-4lp5p%`|2H__sN5W7lsBh%pWL6~Et}*D zMrb`eRokKsDSM+ETL5#Q;|sOm&N-2o1nS}OMc-m&Wj|NB+P%!dsP- z6K37Lyna@p#@lnOBY8VtzwLhP2sYcVaWwQo=Z5t}&hpEFXV#6^7uV05R@aPeCM~R} zcOEkBw{5($oO^w7R=YLCikG(#-a!uQM^`BmUHK$*z1!!H#|~#BYka(@RTuI-j(RW!xd$;TRVOc+=|7r~l z^?et8PuJ|K@AdRu`W=Q&tWLjypLZ?&E?w*_-p3kRV)ng(^E#2?iw-(+lUS98v)L^A zAZe0-g}@*mTRajkZ>F>W2T7NyUEyh8mXmO~M_j=BdH>{0R_b1V3VWm9wO)S-&tR^j zef55~8dq(jE;;L|+BV*(+&qr^ zLD94mx(H2NOC1}iqmVkLQHNy%PV^$=EUOgVsfvBwy_eHxi#AsdjZpf~Rax|}KFSDG zMDy-Lc(wE!{UhF^LKd=z`$6<^IqgBmCHR!I>(tol%Aw;(pN+nBr$BZ6cSnV2#z~XjjI-2bPG>X@XNVb=Qmq(8#pJEGc)TPOwQ<* zf>Y(Jg`AnHIx;xJG|x|0ITPfJJW1(A{C%k08I8E){7}vgPfzQBUaXySkqD(fdv;C) zc5_^{>n6*YrK`5QkvozHdAAdNKi@*`t`PRu3pFbf`1Y4@uS4244qM=y4OXM;B==#@ zaJJGHJb!hu>tHeVl`8v(&n$x{5u3w-ArUjz509LA6Z?-1=^bZQAkz{&6kBX-_i5}Y0gVPucCC-cSCUb?cAqQAzCqo)5&e2Ov)K+0^Ob#A-~rNaC!gFiyp=Ny;QF;Q ze~9;~5#`0>xaYs0c)4p>iu=0})y37cqd#~5SB=v~umFGWh>GI3aK}DhnNwb-1Am>v|w7yxRmk|2}eG1>o89#?zBb2ip#5z zBNg+H>f_l}tnZqJ?p~S;n!q_>=_AZz#&Fjm_H^7|^+Vsp4ujmM)`o*KlU?$r_WRCx zGqU+8AE;HRi(}hN; z__?Ob{8QhLgj|K!@Gx@MTX3?R{zE%s$3RCiu|HqW8n{I08~u_yopKMxic8lzs5t4f zob!kc89zAcr!3_MchDmZ`590DLb)5$**yarN|pV`&I}A0#~itN=7#iJW(v=1@xZ62 zjZwNtXXlLLZbnECDt%tcc7c&{fst~7k#d2Na)FU@fst~7k#d2Na)FU@fst~7k#d2N za)FU@fst~7k+_96?iR9s`H|_ZJLK9091aMrT*JTipth@`IAhmN{Quw|Jf7f0$z+{uh=1dPfxgzbXF>j^le*zPdkYxZ`c*-sBjl z+%!j&a)0I+xJTlD?ub(EP{;8G`5xwYTe;Ue27zBIM+_{^6h4~2lfB1yY>1ABAJ{!( z27OC+?3TB~fPtH|dF(BgfFnXj*6;@4KGp_1a7yGabl=6_sSSYU4^(ynCjXo}ZosVt zp6@t!86-~)d1?>xj)^;CS75U%=m)RU(M_&KkIbJJy0iAm`SmN|EwLxjBTxgLuF`vZ zK0~He3;te>T-pB+xGOGW>7Qo$x1sNhO|YUXWsF!0xT^)9+119}kh68+!H2^moP#H) zzp-)`b64_k?19?cA`j{aeuyr}u6ZNtJ}3S5ad#SmOLeRD+Gy~gA8(f_+dzd6qB)(0=;+{=R?A z>zTWsd(OG%oV%TiZ&b#(^CgQ08+NX0!_+2BvUY8A{_ZuAM!Soce>FUpQZMZ(@T%PP zn*dyb+Yf*(&(fcJqmj8ipxyV(bHBruXc{)&`XN41PsS%(-@w+b#rAy%8+r&h5cuSd zu$%i=tgYm|B(>eK7+(@2?llo7s23!S;5h5natFLpEiOaaG3(9tFM zshtK)h1lcc7AM_v4`?zr1ILCgBTL%PV)83*W9@l7yZ-8J}bo z*pn?v{mar`=oG8KQ_TP7Ws~ZD$2SfeA(r1s@EXS&fuf9Xt^=P&{BenQ4R$KF>zq#! zFY;Mz85t+f91}#{cHZysoJ@R0VBs$~TIjc5X zaW5rZcwEYICe9mIFwA+5b9V8BZTKU}^@HiCQE$tY&U^jhKQrRnhd49+;yd#be<$&B zj_ilLM)ls7c~-%})7*jj7jTK+`6K+~Uf?eBmEa%R#TlIJem3v!KxKPYj~m>q;c92F z(dC)gdvZUZG{o$Fh5V%F*)k&|Jp1&tk^@HQ_Twah{%Oc8ed{f6unye_Y{AkjZl@DJpP^@|r8xyC8pQ3Jo-+25jgmkv<2i!I(V(B{22NV)wC zXOb$Tl`!VzUhx$d+l~7+@z^)qj}X5_F7Cy*TuYdHHsYfyR>Bhrb7v#JAL+=umKzC& z5*|ppgu$7uKjBEyp;gNq!rcAHw~{X5MTDaX$CHkHX!$kaSi)D5F5y*#6A2F`9huSc zEMe|qIqjy@W2#+K@mUIdKf$(U;6G=yQwKNePPk0LHgm>G6oC-QA zHCA~)es#*XbC<<_s~}gg7doC|Y`0jsLjmsh?2$W$7EdDgjGGG*bCqr>uPfA_rr6+t zfL19ZbjVq$6kGD*z7^RlZ<43+NVSe%e zxcl4^KD0hJK%GN{1H*D`_^1T@evY$wBY~H7ql0aX^IL&K#^#MJS9YE+%;dba;MFxzW-ypg2L{h%oRtHLKQVJY-eTD-cq$0P7b*88 z|7RrQER21lQCj$Y36CN?QwzT<;hFf_0k#s}Vx&yQz9lUa{sJG@=ccJ=(*@qWB-3jaflrH8)G=B@eJX2x8g$C%67m{YorDKeLQ=$R}fL*6u#dEN%v6rVe; zD^1&1ap$s#JC@w7I`!3+CiT8#jeH5mUTw-K;$G!y?p5Za3%|O`#Jvn`5cv|$BK>jh zRoZ}E{Bd_zEUnlMt*g0HSvo4fIiEO@IdZqs!M#b#h?fsu{b*qEzdP?(26o=DlslDn z?s}wHOpZG2W4T+IioLL)dpE~Z+^<~79`w#*1@%Ig)!em|`<0J#&rY98RzZR082`Fu+x^)-MJvXyYn92+_;ak`JbQL z`BWA2s5$qi)cpRJO3gjLwAZ|Rzo}+UL`%}#qZa4vqCasz!(8(+XY=nWYMq?FYVG8E zir$$#f1l#LyXf7?nMLnSo>R1c^6bA;_N1vM^ILPx{AU&K+_}NdWX|PJ`DIE?Cg=T= zR@!UkaNd6k_1+U&kW|<^&0WfTa+zXkl`>ZHny_!?pTmE|_oYvj&Q`oJl(jyrkY=xm zdB{`~Ls{#?=9-v61xfSAn!IhS1r=Ul%8)xWF^Z+*>F=>e`lT=jR$9&QAZxPDiZ$Kc ziQNJmh4|4*h7TTq=S%r-$1j1%0VyYYfO8|2`m*no(Z%2?F018WRzI6JFNnK-;iet4 z;F~+Kd4zWY;hijWfZTt}3O8+cK`RsIc4f?G4^+G%@LVkav+fIYBLi#YK1lYXn|s)( z^Ue@keY~u1Jg3y>nM2(9{R)!)qI^4U95ze7NqOiD>%M0=4}FGvjakUztT59KAM&Lg zJtcP-H}6&IKN~^&>F9LYkb60s_tIXNY5QR6$mWj2yhm-%ZM<)$`*TaYr<(RFY41Mn zLd<(mK{iIV`hcgLIeh|mJ74-khWin4P=Z}pPW^L(db?MfqFaY5(XDca%%!A#ckc?t zTRiqQcmDMSNy=I5Kugb#qmKm?fA&@hcQ6Na)NH^eE|Ygw!##}q_1W>g+&;#LYm;q7 zJ84HAi!T0@b+pg0^Tn6_KIlD9{ z8)}l-AK7-JTl!ozmHrml>IH_cutlZ)SNIAZ(oE5gY}$`gqFT41H|6Z&tIQ!*uM97K znm%=-?afP-`X_;P27Ozj^lGj9FxdSM*4Iq*^)Iv-`^LjMw~2Q@Wj`Z7Z&8D+#m1NisqYh+%z=(Y^eLbDY|OHu4Q=4-9r%B@ zh4-exjl|z#3S#|sXahcJoX5LG^QK#Oe0YhUs&M+)*HOY9MH6#|ZRmx%52v~}FSXSR zAG)S-Z%vh_gFH6q6ayWF7iBFjk^9s~{>j~Qc>3KM-iHd*?omJa1v;Ji#wzv+vL7|i zJdz&gu&DQ_!#x(x7UZlh>%2pq^{{b=I^=>o)JGP@;)_?iL*0&Vk~sYib-u}zJB_}X zxI>-w=wr`)$69h3>mh@Ht(0+)5Zl5%>H%&$cc}4~px&V_1jo&?e!>}zBk*r?Wc-!F7A*u=U?Hj z2)DW`&MMyDTq}As+_S5LHAVIRAkSCoH`4PZUl;qdb?n(jSd`X5@CK*IUz4^akKj>c zkn51LJsVrugkDHS-nF3b)&7tV8Mj{U$i}fIC*x=?@+U5|Xk!ktM`X(v)MLo1I__o4 zy~lX+N?$)v;fV75QT>K{_DNoBitI>Ry@CuAUnxUb+71$*M95T&n)b0sDCg83P7(ZV}&{~o^KO=FdB zgwDb@!asBUc;^UuxB|Wr{t>=eMgEr-q0?Byx{Lb|Ht1=_#uS>RwDJBG^{70R8|~f& zPwiS9j)xle{C@XmUx%%zznaNjps~+B(0B=nM zmijdsZ%H0$Ckt9CF9~nm?2h{p-byie3%aSiwWzyWXqQesDvv_Ev%=eO2 zI3hgPso(yd5q!lTOeFUAU8^+y2p2uc7<0X#c>nd-&K~Hwhk8A&WW30_zSua!C?j)7 z*PoT`Wt0to*TuF!!n*aH-BR5ZYZY$=JXRjupE)6Sd0F=#ssLH{+>@(aEEni zK~lqf?(gHHqUn)dH4VuHNhhJDv?+H!@rm$VVJo@-d_41rl5vc=9=7O1Z#MxCw)XSz zzxaMQ`j~m;!v8+jxI}iw!~gA%J@#CAu*usBOpM`m8vkFR^8Zo#V#rQ`p`wq~-ORbT zX5M1iL;mLE7M4Ur9tI!}gOP_p&TS6H2Wzm>?=+QXqdl*;+Pphw-tBg)Vcyo{`w_B7 z=w8A9znT^A9gCIiyL;e+LJ4mb8#+emzq#~5x%*^l-N62RJngioJ}3rw_B>&B|Cu|Y z&#U$EcHXVZ_8qhBo%d~JoxAhC?cQ!q$8b}BvDZY_{=j=4;*Z9#nZ4{X~QNjNV@NP#mgJKHObi2SA1`;nG6iSv!=PHaECTo z(np)PgC5-Rjz^mh$z13R^aAo z4$ihJ*hl%;96pC@`eAinUOQXYrk_`63*ziw8g>NlKFZmMHwKsn6DJ@xNk=&qhxqW4Gkx#~0@z)5I^0*y07-&ikUNV6NrvQ0mPB z19oW~ZB-yQ+#R&F4Vj7^9*-S<){^LX_WGIbD%!n)dc_vc`vo*tZSmf%ZNRb?KNKC< zUgeLlhs&D+FFl*#o`)Si9~(TL-*NCNHn>Zf`rR{&G&|f?EOxl1W8R~|svX|OTVXwU zD~z|hTffBCZlc_LfrP1A;q`hb9Oa0xY*^T$mbh?Ybx`Ta@yEN{c<*= z4x71-v@6-KJpzsdzT-*|c4?5Ko<7RC*!!3>^G5Ib0PJux_U?7;gNhA)12*myc)qN= z8QVR;F`0Mn62G?}%EMR43id(PQQw#V+j_CFeFKzJ?prkbdm&$u_p)!`Z-2|azWL+E29XLxz<4%@p9TYcNCY3_P(A$S(vbD`s8Jc#X(1x-YM2>*$FIu9Ev z`+3%?;p1MJ$aTa1c4|80WyX9Q_IFCBAEQW53_8T$hf%CrKe90Prh5@(lXL-fyd!$XY_2Vsa|K zaZS%duHD7&C4NeD()7HTr0I9@dx>9E#O&#JN8LSrWmNR^yTM5bI^D#YTZ}TWqlG=m zZ2D}5pADIHgtN(oxv}HXp&hNfDVhyG;@hZ8dOYa?9j%<>n#)|%#MvW5RvxANs@z1< zk%x?(dFW*`wnRYQyt)!(>8GTx&W+RRXH2Q}^PcF1?d$ckAEVaKd!m=DpEY8&e%=$k zWc{oWtM%i<N54SMm!Jvn6BxXF7VTT)`->eBfF;S{b%h| zEzf(R7s9WXXUxq7e+uu3Uf6#ruc-Pa2l|=NMaa2_4BCl}BXc>KyIJ_}Kc6$^as!45 zUq*Uf>tJ1o|6;4k>Xx!hcBF86EdQRi~#x}7qY!!|XOSMDh1sBjGQ{9OGG@XX{ZHi77R zL-+ewV;%;5J`+0ty|3B;3)Owg83BwLu>s1EkB0s)5&d86deC40R|VMqc^DhOhA%J| zGFQ$4nm9{m@QR6X!MTJC(e2_(H_k8Z8RF&KzfVzA8K{t^AWacV^>GR#Z#VB=lT#vkDPmuohKFFH&+<%&!1*FGeJJ9d-W#C=#lNA)K+D}*C zdm-+A3~ypLeNX?Y&=;4&oA^Bw+zA}A2jP#mUbkKzZ^KCw9UgtFGDhZeE%P)#TN8=1 zg>KwfhP?gDQ22&9n#}oR9#n8YItzQ`C44x@+NJQE+^2y4>sKt%=I3cE%hdUK8G2^5 zs$&8?6?uwxA9Ynw2AZjJl`{0r>Tb60;^3o9==kmp?6I)tQX=z}IhwB7fLu;lsrk$s zp!>`lfLz`2#P-hly6soiev#-F>gd!pDcDOJ)%m(vov#-#Ztv3P>zVA&%6vVN`HGFX zjri)XK-atseA2fvV0;`LBr>M8^%_IhM0?~t^2)ID^Y#sti4{8A82_2)*L%(k`}Vb` zNE06~#(K|{)Ynx$$QdVf%_mA*^9iAh_}UXW@sRpI(zBSa;Q9gic99bwCTMa(@~CnG zIx4ql^YZ^lP8jp@x!Sz^e(KTY_nMp#86k5|krQ{4Cc1T+`W?VNNvd1MoA@N^I!Ce( zHT9q8H?Pg+Ez(<t4esT&tT90gw!N*dQuTRZ=En9QT98){BJ=coUtymV`=#|DyqI=`5C1|t;PQarlreNN863vJ z$Mx7>R`B|I@IZHyFQn#n@<#xN(4dt6^8FKK3n^1Zd07jUI$|j+^e7}<>d2(NQp-T* z>Dm|)+f3?{HPaV=;oB+x@9LzlGi+XC?NrYBBq(M_8T*pbcmF=$dcM#7Y}h^0-x&Jq z$T;8Mp3o)JFKsCOeM!zjL+{_ymaI#~2)!qsr*|Us&e!Se`#5g8Pp5MU^HiZTW!EP| z=PcS0I_E&=qtN*==zJJ@o>S=@(XnWzFXK_2&W*(1qtZE|O}olfjSs&rz0dqB9)B zFXLVvZ$NFFmb|HW+yyqu5xqri*Zp6F+HtMF=e_b|?oUu5_D_2-&>KF(f%6YT!g z;H1-b_p2l1O}!3(+h4CkUx`Qi#$M@8^!zsEhvu^(HUDD#$T@Uba~F9pXU=@swX&Y& zZ`X>AB55+;eNi8C57Uk@=G+4>9CLrs#~FHMdi`a_SErC(m(Vx* zI8${F<4o;8@xNxAeSjYN1>@`!b=@;WwSn`IBVV##Ci}NbMW!GdmS3x=?+j>iY2(JJ zz%9Dq82DK+^kTVG&VG1K4>PjKqV7G-lQ-R34QHkf&nEa7{D==U zkx9#FS9~UF?f!1#)qd?Rzf`-(Q~!4B>6g$io;uJi>xFhwuhf@~t)zsm+BjFYmHJV) z=v~R5|5&g)E{k^!$p0(sWtm@b4(SJzqAcG6Y#sQ8x(VFmM=14wr41!7Pn)|iXXR`a zw!6|XY$JDx*^@NpHD5!k*bv^(`BYgf>5E?UW&Baf!aGOcoj;%>ME?P6dN}{junv7Q z@Ai>?aHe*r=U^OZyY)Dkx3vR99PLeEt|I&=bA~@{fcO1$jLcO;M;I{P`Y+(nVVnlM z{yh3FJ|qQ3p$)p`puqVhyz-R>r`moYZ3;{+LLl>_$niOyJbls`K?7fEToO@UuUV_&8t^xa4iLIF}i} zeHLf*`F0L;wo_no_8?yNopzg*TD6Z^qw!Cu$eCJqAHOy}HQK=c;15@J!Yq1Qhq;II z4DnrH)^Miq)(iR0`ju00rX+CIG}!sY`S@Dw2d%!AG0tPe+n^KYunuq@6u;g|t?DDO zeXM%s_xQ!_X*g=1ptjd`sd|-3&UcB=qTVl|cdSuAxKisEAB*kdRDY2B_4dWbq92Zc z0UWiDS8=qDJSOF(^dItesb@*EKijnAhEdO@51IUnz5&V$=@AEpSf_9fH~U?s*34bM z!H24s1f1Hm&V5g$58|#%7U?;kS1;)s8fzW1X>XF`zY^YlowEHxHp)iisaPdFl_6?;ifomHf3@`bxrs(F1a(b!y$-BuP6HrFdsiM`*>~q=H{; zO0Sxs)Q@>jsoi1j#a_)2t80|WImK0-$H^j&mLFQJGvn`@va3&ybJk5% z8kdq*PB=#yFKySW^&S}Ke1iXDsq2GPeVor9RB9d}%pH~b-$p7w?BrKM*&%_-hEnb- z2|ilPv?pQw#;V~U=0*~}UJv(B8lxm^*TcP)#&8Lz>*0P%W0-{J>fwP(V;>1G(Zi8S zV~B)T>0ztV7%buSdN^Kbv`Dy24_}E+3?TdmJv>xtJS*WndiYwU@r;BI>f!5^#?ul$ zs)xrajVB1V&`+VM^hw1>e2DWI$=6TMN57wxaJ(L--;Yc9dOb|P3ngsV!}R-638(8} z`n_DjbM-L&eptdw^f3K?NW!c1F#Uc&!t3=g{az^HGCfSc@0IW$^f3L-mhc`uOuw1W zT+r`3C45v%SNVKNsI!Is&m>;<`c-;@hnndwI9?Ca_c94zuZQV7 z`w$xn?RuELbGBncVY(is@4uDsTs=(R*GqVb9;WZlN_dqXrteQlc)cE`?@vg$Ob^rd zRTBP#9;WY)NqCPQrtd2xd{7TV^IuE&s2--zO9;DEnrr*)-YeEsx%^t-2o z>3W!cv*&R^ztJ-n^cy{OLBCH*c)ebpe)I0k1^xcJ zg#VzY({FUp1^sT9@IgJDet#lizkYv2So$qz;s4EA%b6$}@2I@F$?zrXD>7Yh{#`qx z8-Nd4_MSQW{w?Qq2e8IiHiR`P&To9fnbQwA1J}mc#t&4#uLC_>2b(sCZ7FlVZ`hyQ zOc=ZM)H8j!W5gTJ*q#T%U1%`Hw>$SlqIsZ zevJKT_`NUt_RipLfsRV%r@odL=A+%Ty#VHDF$)G0wscIxR!1f@N;~of;T!2%{WAa6 z>JCurzR#?TmU`z=@4eLfMvnk>f3rlbH&EU83*^pd4rz}g6QypM7sy=~#y;;;+8X}` zkBFb%7~&)h9vbDI=FQwyl=-eDOnLuv*6Ho&)ZOvQ`%SB38ve+A&tTH!40tU2FirSt zSjjJm-|mnp)=A6fHn@DzF>%}>`#5BhH8vvFs$7+1Re1M&B6&9YB4buWO|*W;U1U4< zcQa=`Jov^xyh6?lE^2rT7)to1fp0czno9o+i?!P|sdpNqRK6I(DLZNqA@+_gmww_YfboF2NcRI@G!x9jp-kD>#vR zMTaL%wAP=FjM>QdF#T`jPG4+DEPgad3mIqqD|g{$pSU6>FJ!#6r|ex!nqqa`@Z0p1 z{7t-rUA@G(+Y(8=6ZrW~UlHRY?>T&NJa%?c%;CLp*1u7w(rt=WSvCQj$68kmn__J~ zYZ=~1Ud0w?-PI8=ym5rmc$_}$>PQ!XCh->*YP6l2wq;g058!hUcQ3gF2;*yr*-1xOmxhN5aox8K4!Pz=X>z8^7N#b zm%z_P>bAm{hw~;_mjVCp_%)vm8s3r`XT1v;>Q4s`-*v3p@YiRc6Tnf^BwJ%2o80l5 zVwF6<6TBU}X}I*SqL1BOe|jo;ZH>+2SZ@>DfwL(gBdjMvY(LDRZRv~8F^Rs6v;O`O zC8m+M!%<0AA3w31^7$F^%L-20xJ%ZCUx%hi$yP~|JSx6*{Q8Q5E|71AT=V7zvL*KO-^htoS%KDr*zK(s2v_vyr=5ob9UGrPMPHRe#;$)BARCdqkDHydOMM z@!m>UV656@t3NKXHATq~7=fdomGw87bH>dCUL7~;*AMm>=A#DeXMnq50{*fu19wl> z^aQ?M$PokX`$wFI`ziiQ{cJKPHvI4{8O)jFI?M8~cC|3u(R5 zb*OUK>bVy-x&Xe2;f~4M(58%YxdrH*Lhzh&8*fXY*Te^TCyvo=0`G3&3C>=%gD=`q zd7*-`awgG)+$~~FJsV$ZCBXVFydd;1ToA8@MZaO|fis)<+1(zCFLY^tA-p5!=cWBP z_BVg3eJLNy-mkzTaH#x9+X6!}GNxk9EpCA$AAKl!3^+;_#IsLg>X0?DeDthB|36r1 zJM=%4Q{jNttZB?Jt+5|c&>eA{Lo@oHoZGIB4PVTZ>AnT7$%;+xZJ5;c=Qj4F+c_8D zPrC%h#!`d)Ob9vz+p#STeMhb2ypwuM~Q>us3SL)@bwF8;vJi$lhq1!rf$G z21fN9jv08{l=J7{TNpRh+_9+QPDOb&K3;)I?3>4dTi!X6vp9Q@O|JaD`dOT4Ph}t8 znJZ_llk>B;N*}m?v59*QRouG}T$sRx)R$muIat9t&uZ$CHM0WhtW32y%Qy!=hX2*U z12|J3;1U0a@@9yIxUw+b(Mt$+%X#S?IT7xbcx|tAh>Q=~87%GTZOyzw87(-McYy@o z><>F#jPGdqE}rHNm+#D5+yliXvJB{O@y2P(iXE~hck1g{ZM=36=Q9uJXy=}K33-$_ z&R%hr3ZA`Pe8eAP{;~r*OZPTd%1^!se;RU7t z`Y`Um8|iWeaR=?k!gIo_8~DCJpHHLDByKExzYSfto;cBQ5+{88EMd`w5-vrbJVluG zHjnWA_SwDN!u#raGU?lbd$~vPEkmwv<6TG@_m7cZ&a1UUi#+}_?~;A&TH$G_BaC&U z=KSt%*;{BvcS&8F7<)3dw$EnVo$X#T1h{`p-`z{SqUS{4iLSc|JX}t<-$h=3-Tn*0 zQbzjBdr>Mqzhf;|XfTAZ&`QRf=rS2|qRT{o-6UMRp|rOy?#`9MGC z8P+ggkJI*)JJVPPQ(XPjcTBgDW|BPs%C+Y(zsQPn+DNM*KAtuyvo5YZ%&D)1u9I?A zQXhDgv{*^!T^x!3p0-M~`eaVBj=dXgjW{;c`3&)*qpaB3N!@IX_%0gWmVZS|izS91 z_PTB(sp-E=87}F6dn7uhYn~$BE|fDkS>NAUpG;ku$aq$<(;R~6ZXEgWY3uDC57vEE@}Bk^^yblR*-kqWW7?>FlC)o;r9b=HRTB`F)>n? z^^Md<$&3FJ&Rb=EVAO5YCv8amQjbx$)F*mf>gx)79&vZ`6aNU3{>jp)7|GLOxgzFM zXeVvj8=p-tobf{X+_>r`SJVN2;QI8GH9MCmC##o;Pl&IOiT*I3%hT|u!rO2my#94b z9a5K+mAVWV{c$U>8MtW5i;i(wtTD1yeJOmma|TV?++$va&xf_?b9?Swas~KqfA59# z(iPQ9+K>MS@OHtke_j6d_~Z0Hf!E61_GH2oYlY|!U`#OmK0Q9RIKBKt)eGN^*j2jK^ylfe_h11gQWJ)K^*vU|D~$eD=TPZ=-IbK53(c`c?kc>-ML`f5YEL7d(@mef7)fdrnrV z{M~+IQTma2{~dq(*ClmGUH`ZF`{*q%q!+rLOgEo|GNC^ z@yDq@Ph4(1T0;|6{!Y~S+y3X@q?d)k)6cz}F8pl^D@-qaSmWueFEoA#z$UvCKMFsW zMZB1PbawTUl&>idKez8(o1Xo+#?LOjd{55RpF|c2f6hkc7NIMA7SsC^S8`{)TT9ZT z!2#1(M(;^l9vskne1z?X!yh(IpT%$Dcw3{7Z^Vc7z0ZXdB>nImXUSQEIFql`d>f_w z@cZLQ4}LdEX>6=+e6W=FiH{6WcKFV^rk5N~e$ZFl{Ghy9TsTPCahSN5k575_r`*Y$<{CMcjRMz!w6p;rew?^?Eq=rk@eUmPM6KZn&cbP9e_2V>72V@)G@ymBfFKTUJ+ zy(#G;yY44Fk@eQ((X2gSzs*^8Z)e$gQdaKIjig@eT%(+fdr3>=98B^xtTA$a{i1T5 ze@VWI_BgwKQ8~`NBqu7T3ecrSIRlo#oOel%u3RWepnwuHW9eW|63Z&oAyX4d#i=zjrc z5rmJ8_$R^RR0EDb?oASSlHbwbIBdip(BuEC#eYP6DSdcD@5d~{$>7Sw{9rWy+frk# z8lMKJe0l_Un5PciLRuXBnX2azUOh(NgkMY5Jb^p7G3K_yuUcBbQ1J;RbqlYm z<=|JN+zUoIcvUS2zZ&J%8Rg(rwH*9vloJ}L@WQKVIr!Bmx5_97ud3zXSEF2>Q4U^J z%fYWkIib4>C%mebgI|qu;&)VS4_;Nv!LLTS`;2n%s#*?u8Rarb6FzOhua?HA$ce8t zyvkV+;SqVmRDAMu@D0G$E#bWQ1JE~yb1YB5v)rG3-_Gw%_(tXl?cma|A(~l7k})-f z_W)KRt7r55+puKT_a|G$-*by4DyEtI>lhzTitM8f>d(D}bD<&+@7Ln`sP;~TCgV1; z)@!4jZ`eeu_!#pQDergM{;>m{hCe4Ii}zo73-)EJiKFbmjW4!d$OVDhihs>DzWQ>IkUs51z*NP~6X-+x}EhzU{fAmNA~hfhPCw^2hKlTB>(~ zul}j>t(4o9>Mf12c#kk2EaQz9*G#jw6u&60ovGe(-rgy1COy~e-4t%|x@McbS&xk= zF3+T0?%K;c@vgn8-dl#)+->^a;;a!VZda5AA3dhl(zjB1&(Q3Zy{%V#sa{Wq+3P+{ z{ds0D=Q>+ApW*)`{6Vy)dSCJJe<{EHw0D;8A-*|$Kjb@$@5g+@__p!w!}l29V7|xs zp5WWTH^l6H-IC_r6wJ?J@%|e89#Pi^26{@1&E6&c;mv06gZ|+nvv-kyxZLc$&p%vZ z_RjSWA2)mF_=k6yy?6PCcbdJw@DFb@d(-{H)n@N>|8T0=dkf)(BW!M&d|ChAccW=^3wJTM(&oL2;s{{O zom)P*p@g%nA;^Mx-1U@orE|*@iPPTT%p%{p<*}+S@*K{e+Ld7LUxnq0e|v#{75Xg* z_zc*e1@5)LEU;z*f7v$P=LBX0&V{K4oY!h_vSw?**DJ*|x*hmxDHEtzRQRkbE{4y# z;zIbWD`Fe=v95a_zM$Mf9lq7TSGv>AF*x2p1h0Z$GkAUiI0eRMfVBiTg9Web-CUh4 z@R>Y`x9L8{{NS59$ut_9$GL_2IJ2X|ci0bqX*&K6`{9qhUB_YYmjisN@AR9-;LAF! z^9@sIui{T&64=%Nm(W~b6Z)6#((os+b)RU!Hsm~w{os3Mj80$581VVi*MQHTz5<`n zSMYZpzVrC|N%)SRhwtq%KMvo!BXsyE^ZyLKlJoFAIr7Kh>ort|k1~M@cTu~HkJZF= z9Uu5t`2U8#^7HWBe9e!;$Nr)=ekt?+48G0h;p;x+$KiX%s>4T_{~PeRQte*s&l#(p zupjEh__edIRl&FjWUTy_F;W_q>Xr3ar#^PO4=`l}U_>0boQ-8ZpJb06?N?Q z$}MF*s9?C|KvhVpw-5d5_3f?o@VEI$F^+v|8+~$9u-~K&sZZLd$hUi?yD+Y8?5(m4a&F=G3O0tU^T)C0P(c0i#_-m?gPdvXpKZqWNFc73_XMi2 zJ?!r)2i({R_LfObPl(0a_Nd}+2{f^f7RWg}i`PfEy|0=5v>;FO=E5XPy5b(dd)$@a zx*QnTfAdx*^FNpGREzh6DDE^&B0f3QyXlzS`wF_d5`1qyZTGq@*gxRXm5}OPjctm4 zKG=*6zi_8HqXHg6mLDwoUb_c$#eyS~?Zj2hw|lwsH2rV7AF_OSP-utmi1j7xZ`rV8 z6S2W8ymz*TU-W``4RRmqlLd(l&9p0byYkor5`Q3h#Ls3QSmGV<-3r#v?;`Fl?j{KS z1aE>L!H3|&8jYV;@LL5B6am|2aLat~fZ$f{JH2vjkn;v`8V~MDd0#4#JT>4oADrcw zOzv{<*F4GMEg7V^i=H>R1%DN{EAAbAP3|henb7bI`~}_we{23j+<~i3+}&JrG46y< z2O0RAX7|e7j=$*m%TzSqgO|f!1o)G?9Up-|e7|?x0{$M+@n_uaF!1Mpx8qXydyoF8 z_=DdCf1A4C&)o%o9&jf(i~)ZZKl~+wzXTnBY2feYm%-n-{{nwk7hf8G0}TAlw0n2_ zHE#O<{D=J4AN+0LzRREe@V8XQ-%{dd`tjcq_%EHfbe;dk)Az1C_$Ymnv0j}T>9oUZ zrA3j9Z##Ty_YP!TMC?OjTz%V35x=CTc6)5!`4qF8^|%A$vlRFC9Qbg)h4)h}-aenC zHnu)#&X9J*R`Tcfh?S#?#UIi_+LW=&Ie(9f@h$B&!=wIV7~A!r>}OXxcsCpyybO8J zRX(QR^D^b6GWu2KoFn5$SdXm1Zw2?C6vj2al{!p}W9%pHXZ6PqNw8`ox1lrSZsls~ z7kRenW3yNMB-j{tue32f8K-8(n;ZB&j8z$TGKSh#D(*M>o7@%pm}^e9c(+ArvPk@u zh&2ivGyXmh7{LW*XiF_6r_4XQ#Pef*kjQS<# zL*jtFY_{DS3V+sPgGv_(Se3vUbG&dX(ocF2Xz~mPGYMyN&pW+^9!RG_@wwS-&DRhSBoU@GZ81xq0 z2#pKdmC+Tlt`K{zRrPOiF^&6PKx6E9_FPpOmkW)dYbTAN?`CML(ir-BpqD}8d|;f{ zg~k)pLgYkG_xT^p!ikoHs)MX!M;6eeKYfGa%46;*#`zlzzy( z*U+W@WAK4IbB4@$U2DCdJ7KYzBV5SplOuAx`6z)u0T;y;)hEAV+Wb%<@X$7FJdPOhP@PdV@OCck3NJiX4Z zoV1mEXR|l4a?)h$-JHjgaoz(R{o#Ua-go2t6W{uUoEMxp-a3f&qrWVSQ|HVb=;Par-yZD@R9>>nT?oY1iq5RVM9q)2~_mtoL-Rqe*CS!w`z*Pz7th0KF ze>jUL8yr1lE9GG}5|hY4T=TD!h__?YhiJ>#3#XvUic$lQhYru6zxo9n|gT0HCXwniD=Xj%B ztd_=om<(GiX;7yv#_uMoY_ucka4| zG}eIcFw#b9X%1|YJ4a&MjRzLe1mBj?lBW4*f|+33+9ct`GUuaz7{=v>rAuy=7Wq!Y}<5y{rDL+KWj;&w=c|UI5Tv# zyvfm5Q6e0fA{)_*-z=Zk@J-}c>p<3Qy0*2OHJUQy*k|;?br!h~>@uHrtuZ5`mHx61 zk^^k3`H8L80zF$6+}jCTAJ<zOSK4Q&E4XD`B9stbCwz-%Q2bA2|QGEzliux58Um z0iNzxncOo16!#6|P43r_%iqB3JCMl(=+o{+57(8_hxSDeHz+N!)}IeDZ8&jttQBYM zeRr569K64fdxUYagZf{k9l7K18tu4;rno=F7ta15n|t#doBPd)Def!NZSJf7a06{% zZy}!z_DIICp#w<;uZnK6e%}k<%&UZ%1y3 z9b(uYs_k(W+k-XU0rXkqQ#9XmhAjG6vnMtiwgmN+0*lC_x6{lSW0;#CwOBna`Wdit z<$BjNyLT@>y8QVg_$FIT-=CeAPa>B@MlDt4(-`~;jKRminCVOT{WBtc`l!g6(`QD8 zO`nN;5*uISlhj{AA8g2|0{T};J7qV;I&MQgMa1j!2|r-6W-0Qi>W-|2H-UpY70!?J z@mt|1pKd@tS&&b4Mw*{|N<%(b;I|izG(Y*2ihQylpOzVEe)1_3`D8&peXEb{3P1TY z2l-?{K7C}Q`N=0c^2vgHy2Gdw`IL{Y`3f0y5Aw;9cwTl@AfF^n?pmZEpDf6y@kTj6 z`D8;rS&&Z=Mw*{|x*Pdq8F^lIRrtxL*~lm4PN(du@RLt>A)mxI*d4ljDp%!`=8x)5 zAL)3U9?mFh|Q_VpPbGy zF5~;%k>-pD#`;gmpNL@>%b#&8avEeG=fmX*vIcuWTdMqlx3Yfze0nhBsAcu0C0_$~ zCGbWwo^HcVC}VA?jPW7zNR^YU|5m~uJ|(mx7P-^1;DHNZ9X`yQQBE1z<1*k~%$%T{ z{y!*RZYr_7Xb?F*S~m9fN{iQ1NR!Tbi-3A_Hj>W~J3L)wo+ ze!6n(tbs*&M2?mNcV!nDdYnFs4ANjWb#Mk3nCExGY{<~z@YEJ$+g4;;6?RxH^6k%Y znjC$nhW7{uiyRH~e94+hU#sE{Sm7r}ks+6oqn3zE%h6KWDO1~_kF+y7*2epl1M#aF z?z!fb8{D%JZSGqFQrxdzVRKh3Ptjy4vd8F0@(S?LDNDfzee}UQDacY+7_tFeR6>Jb z#jNVMJnrv{4iOyW;}0iG)p2>9I8b>k+MK~Ww3B9r3@d_O$kNf(3$hwM7&_!4{WfMr zUc>)HjBj-D9SN7;+@6Q9>*Mw_&<5|8ZL~k$`H*EYE&R1-v4Rx*p z{hkTaY}ligKIe7DOk{;Az!BtU$L{N5$L{N5$G-1p$BG}Cu6jbVWdl5`z-KA-C)^b8 zxEEbfr^~}nv1K!nqeIaZiFeFx;4X$E4PEgf>7OCP0##iRpxUxI=!!IS#WEvJ)fM=D z!IsTOSERvHBJRxCAuOFUGbt( zr>ZOHAMz^?U6F>aSZ1WDx`O^OMpmFJ(ne}BU#(Ns74#2Vb~(Bt4P7zbD5vTQ`iCvM z3|(PIS45De+UlyVFsr@?A3;}qi_Sg@p3UeAdHXw&v2c|43ag7WJ<*%-;eu|TqbEZ7 zf03OkzITAn*2PYJ;0IGie|-#FbUXD3;}?I_qpOj%8yLUn09Dq?9-P>x16Ryz_$~J7 z2khBhV4u>4++D~j+LSJE35=o>Tp@Pv7G!J<@};j1r@$E8#g=|g>}l$7=y1mR+0$R2 zF{x)DL_Y|e0%IXCHu~uVe>e@DUG^M-8-0iWo=$;f7f2t z$G~MT{&xdL7i$S(dx|_H-RWXZP-5o&MtIMLZLR2V8hW7@{L_T2b|I(FTDp1Ot^+XCfA_X0h-$h5L`Js2${D$t5?~j%RA6?7- zXnuJAKh58cjNb%LyaGRLh6mj6nFqX{9f02x?sIH{hK2B{+@q@58}57sdTwDIUDk%T z?u~S+dlRJZDz~c(8b*txhE9BxGqIbR918LK+e`Y zBJ#}S5x>*^^pX2rm8s$QieX)Jq~hM3XmX2QE$6&Pg(axI3cShutR6V(EH~Cyk@t_Z z-4!}QFIk=HInFsvInF-nBlXpBzM7|-vwmBr8{l7zj^%a}#-lm*ze5r(S&nAHP zoq5BAw+dT_&?fDbL#N6x+N8bTOTWQ+DfzFWyD{6^x43XI`@?|!8c7AO|;V+o-oqno4nv3lYh_8x3+nDbIfB8HZRyR`Mngy z*~S~2BHx>6&pA;UT?SsJGscfv!iF{h+kR81L(YsH&Rbmf7_zAenA-9dH#7lHTi%F< z{n*|m<~|(`be-fsahd$@@vf0krp?6M4E?v2{O^(f#PSF0MvPa+NINI6pM1-&ZIC-z zp=S1j!R2axmHaZ5h+O0e(8s!Up6!WLtEa+hLb9eLNy$bKa}^LE|vd;;7Bjy({WTQ z{h|KQ6^rZEU8~{fBshv$F+zMS^t}!o8TdI4j`GbBxh7=zTt6HMegrpjz>(mq6Gz+p zaKsoC9Qott$!-4yey;ov@IzZ|dEkfkFNL3xW`pN+eCqjC{ODzb=j1Gw;Ae!nkBXnr zAwP|u7)#hs<45>dcxdO3qEuh#$0`S_cN7u#3tbLFk`@lksIWT}7mxeVj1-`D@<>^b?9$zQPRe0(GEGRKy5 z`R>)f6R1bRef00+`ggYeeP91p^97IR_jqGC?}%SP|G1Ps_+P}o;P-xfQ2LKc^T83$ z_6zT2GoPp|*LaULr}QNFP590POy&jIbw{5zjc#UN=`j0C2A?%Az(2IgXC{@;L}%2% zWBd3j{CwyS*VRe}>mVwh#o*(+luwHpcX1{REx-3bxB8bo&EOnKDw?vp*adFui=X-7EWbIiV&;4DTHId{Z8bQO|-} z)VuTS!TnR#xn#f7#vZ-}+b4)Mj?eIsor68v%zB6~3STs?c^b1wtSJd3iun)FoQxEDC?1CDmx zr&Np%N6ZCq+}n`T3CG|DS@RY+Vt_+nU~N@}N8tGSnJ#c->Tp0im5!IdjS3I>{{MhS zXmkNy=3gE!oK4;?`?xoNmvZn@1zr@LK3(xL4Eo4^btQOdgHD2nHfSVs_i2~G%`=a7 zfn{bF+z5^?fgcqv^8OTDZP4W!fs4HV8@OyMy1+G!J^71xNAm%(+6<0Jw}Yb;aAa3; z1kYcShixw6*c$2a<(=2z=k57?@XwNvf*Gj@#%s;^lr zHcLVJ2s7vH`4;j^3MKtcM}v0IC$lQy5^ zR1{x_{Hz(frMPz>erfS3YNx*HDb>aMfhm>zRg?_~H@R;J<{S*as%Fky()Vi4th_~; z8rE)x^L>@IBPaP?Z<)Pik-LgZTg~1m^4CPx6xX(yy$8U>w#aS8WzTWWC8!|1DYB_} zOXQZ~8uoABC7-}3@5NU~Ru><}AHsXQ9aXl}?2RYyabT77Ds)3x4)tT#+gpY>W$w3! zG=ZnAkA-)2wR)9LJ;vv=zuY+J%x51G9u zpjnla+t2yRVEWXor|ma;cLPf)w5!e|ehvHQA!cvsbKoG1I{GjN6+Cp9yj4qCx8eU5 z=u&~dlhWtNXKpG!3}1XkJ8zLzl>@GbJ14vc9;%n}BP{z#TMn7Lhb7M}c;qdUcRsw) z1kL8~-Gbh$gf>m&Ej?!P9+G^}r)itXtL`J4tBb42vklsvCckU5$?L)wbLon0#k?o) zSWVnaXk4+PqPR5AHZ&HWQ_YL_%*FExuX1nDJy;xjO z*A4f}7usxvch(9|t^jxP&7lvH27Q{~9rZsnYJzu~7W0*S(55L<&nI#4&^gvw_e*(r zrAg=jZJK7&H{yjRO{cXyCnOJiB6&v0m}(_$mR{Fe{D)W6Huv%$UXeC;t=Ltp#zE62 zct!pH0{`I^1E#gq)igt|2ii8lA8Nj}{6BO)-&V<&s^@c%27jpe;ESf#^ZA+_dVC)7 zjB7Oy{L!>m%Tu$WMuQ1{ka1iC&BeA+Wdwb$2?MwC?Zfv4vv)>Fs3Wv{sAFrCNsX^P zYx0WyR}*6Q-bPyOSw#&?p4yL1UU|E&c7(|rYU=IS5^VR@!fUsM5O+o)E!a^zOw#zm z%c0$g|4_;VI%tTHBhOWSXyc()XrwDc2N`cx@@f;{_8-s+u-cPeG8k1O6_ zDT@q~F&r#qx21TiUodIuAL{9ho$8&$QAhP=z3d@9jj>bBxK_(_kRNK)y7e63k4J1fOoKHJ3oQFsoyUXJWn^FKoVZFcUB61S5tGD2-@2Ki@^ zzr?QMwH!H8UQVB95QnTuIl7o(pinY{MyoJpC%yQ1=) zrg&G$cPej?$~RT<$~!i(KO5sHOI9dP+$a;}iMwr#BSpet=+ZEg*F;?DX>{9jc5iDR z_7>L4xi-Zk=M8MbO&PKm!Tj*lGbdF46ZlVKue=!iDg7Pl9T?8T6mtJ}HD~AI6eXQs zzwG|XcyOVf-IB2(cUck@+XQ?Nja`g=%esd%hy2v5EvkqfN06S|FyqO~B1dX$4fu3K1Hy1n;C^&&!l`W) zsBM+#?Gz3+Wn{AEH!P9*86N^~;mQGO8_B#|6?Y6@dB{Tlx~0A$q?W^b3120=FEjF)isOEg_B9w-mi|Myv$27S?`oN zdnRY-WzACFIjU58Ase`djIW`?!OE#}*1wjreHj(2-Z?_w7&tKgQib5YBZHT z8hw}Vh4j_?yG|LMO@FV{=_~y$(feB>{k8P(c!xD7fBKf_{Vll!eM@xumO$UG{f*P< zD}7XyP)D9cqi?C+*ER6=K>X3jp1SxJSSP#!4RhnbhidX%hfWad7mr%xfB_l&s*VyCS^%}?6;hfeU{at z@9BG4uHB38$Wzyu%?`O2Z00Q5tMpIkd``3NzPxr4+(Z&6X zS*Z0dX5pp#7qd|7U(CWOoF|9=e*KGCsP!*q;ZOHZWZEG?4)2@CA+O?~ ztMo2avGi}@ucd!Mo{!<#3;U<>>;7&R)6=&|qo;4t zq=q(qy!!L2Z;?h%-=d58)wf8ar*Dx;Pqlyh;MZnTfGVHZpF0&t-93p>sw9v2v^&oD6Q6UX(0v|fU~=$ZeGBvUTbT23uNvA0dhFeM zabEYr{g)Iapf#Cw-FEz-Wx;c@Cq`S1vL7b*m*kAcZfIZ!zGNjj*Y<#t0WOD%Um|U9 zGa$DB7==dC2k})UG!t62{8Nh;+KCS@*9+J+*he4tlrul9NdxmyN!*c8m z*2P+-PLXfQ8zmceQm^)wC>Jopf9P7k(4c&;1hHX*}%wjLcArHjn z2-IzkDnEPK^sbU2cJeC+lgENA<{VKR91#h|yS}Qgzwr8!_ zt?&HK_d+RnlfAWeY$fqWbeF(F_zu2X6C!z6DaHH!!}-I{J!%^s%{gw@h!k(bb2m0# zv0!wAYgmf6@r4^3t@3|Jinpow#>N==pOE5hF1fKWTK>n7zg*8BMgD5?OFiM_->l~k zBmY+NOMD;lZ`1RKkbkFMKX0Hn?b7pG$lt8j?}JbF>iN&wyp3<^^`Eh^wnu)c^R&&| zykF0Mg8YZ{{2k=~P|tsy{2%M}A0vO84o@5TkC9*M`I!92_52@_zeCS|i2Nt?`uCIn zv|fKJ`OoO^zeWDDdj7rS_v!hY$#0pe;d2-HgQsfv*~y%YHk(4GHoCTvzt2<+pIgZv zrsv;G{%}2iHT6eL)%sgb{uuHL%q8ScAiw-CCjSuf3te6y|1drObL1bP*T0thqqO=P z$I-UK=2hvnhWwMrFJ+6!pRCuPPySTB{ygfRs>AaL`KRgiFD3sBJ^y0z&(!nhl7E&C z&wTRF*6Yt9f2N*4)8VT^-d){BjCVBt=^F%Eow?OZ34w}htjDua|H^#wE@*Cq|8~KfKu$BDAIM_^nV;oeI-xvqw3~xkC5LO2TRFs zjDyAG_a6tjDcU%gPkv(@cjOw!>P2VV4X&~k@14*u1{wBd7IA5|*1he-z zZ*CT_&nG%f^r^^v)_M*Utc)!deOig$JW4r3r^@I@OrR zzu~uzvHNM}>*!QoW#WsiD>`+C&AShs`ejH!>ro}h@fo`80==sAaEM;LlrH6bt*%Rh z9J_U0Dz=6j_+{-$>y&;YVyjwP;{vDy_~SD--!Hh#mKr3 zYd53JUa?0y?GW^{*dd}<4LhWgx;7Yi+s}Ds!5g|&a3*r3t1a^N3m4+ewD9tHJMxr< zx2K=f@Kz&uoA%>)6Z<3OzrfvHg1em>?qqFE>?Ofn`#cSIEn9u6{UNx!gS=t`3hrdj zIfHN+_!9fh6|Uh-a49z2TKx12%~$_D?@$4JRz3@U1bQ*B#0)8Ok)KKMz-ql{z0kL<6>I-8E4bz;+fnqxjGHtsAPKY|<6ofqQ9-@ZM< zyii>SUgBrpCTqA6oE$X=I;#I``&RtC81`-W|6%Q2;G?RpzW*~b3Au3za!+uQ2`B<0 zT2Md;nM@EAG+Is7f;9oGL`GD^)k5F)_@vD!9TZ%@_M zJ|=+m7OhZkoPy;2{?5z^1M2g>@BjVh^EscBIs3NuT5IpU*4k^Y-Jr97&(n_(^1tpx zvCf{b=Mj3t7d?ma2LHFk{%4OQ^kVFP_D*zm#mdkAN~k6FKYK1Z3u1j=!vE+~Sw^Nm zH5Z&?tE|BvWh=1v#7?=NJGfJ@Sr%1Ji(FjlweHiBEmO8h*%@8KQ=5JXbn+3h%oC%2pEL>ndrPLfhiuIWcn{yl7Yd7 z$B`0Uul}cYvSPSaJC0M@5&ZjUN49O?I{c~5nZ@Ct9{YgW97)@WF&vB(4kmle4=DQ~ zx}zs0*|H1#PcYqGcOnT z%i}e1$XI`l{Hi|3suJxIPdaw4Gm+HOQXU^2S%4dFl zRRM9Gr*Ti~MG@0Kojagra0iqx@~^y$7ZD3O=uLL?&r@F7l#L_AnyB*jo~G6>53&B` zV`!B9qlR@xb|=Zk@%&rN z+~C7D)BYWHE6LB@}yB zFJ5|bd6khp$Dmx8_MNmZ8_h7*@`z*N!xrC;ZC!RZ*?(luv28%M{YQ1O z7q@OhRQFvsAKiD>uTR*3@>zS-_JJheeendmc0a!l&NsIX{8@|ouRjN7IHYZII8*iKVS# zo(N_7OoWSvLKB#Gc%M%@iqUpzd`2rz0q1kUuVN(HF&yIKkUhQh8!L`p$8;uXPuL_&pz)x#Mu*m7xLD*d!5y{&)$3ZrdUy2aL~t& z7j?&{U4s-~LvcCm7#kx#i`KF0UtNO~+eL9XUcHFDL ztbK_mglm4s!(PoETqU|wR-CW6?sDx&F^UqArCOl%#;c&0`W=&HY`^g|#zi$cO(S>v z*=K-X(^#2-UAh=Qhy_0LbnrBlNBp*jz3z8;P6ub&_nyid*?dok`cH+a`R+U?`c9sw$z$V2efsYhUSr?3#`?KcFc`Ee_#!9QyETSWou^lS zw;G|*!O(Z-vD>!tJbX$X;cN3L?F+wg^x7(1-+xLu^?Bo|<-qw#<-mXWca-}R<+}Fi zp6ckG9lEdM3+!?6cXn*@{}}l$DRK;b#9%LN6TYI6H@w7LGR%qmPDalTO?EVe-twCL zzS*>Bdy$Hy$S!)=YYe*nKsS0o7l7P;%7Cra>h4V z#QcADpYcsgS8Ai~dd=c|+5^LkB7?L35%w?!aQ{aFZ9SRSV^R3{jy09X>ejHiI;QyE zn{tb9=;XqAemh2IH2%8wZJ2MPcMyLWy^~pYA&-XnaX`9jU|HJ&fbr|=)^Sy*SeVf?334ML<6Z@%SmQhr)aM`ZVH(lc^sdplL5-zuV7n`Q>zxbu~ zQe(SlJ7%(cday&Xe>9JKj62W?vY@AEnRlttZ12a0*mpWp^|0rp__;asdq4dd&bQDU z_MvFE=Oyq7^sQk}Yd`YAeC`Adu^)EY`^e7pOL2RFyE% zD%f*~`+*`J?ix<#tQ`0J=w6^p&IP~Fa~{u}FD`2uOgwz;6J|n_5c_s6^=F9}IiENE zzoG*h_AJMqELWz#gR|T!Yfw(MxDxv}@$dE9;Lc>Vt-IrFJ_td71H8r4yMepMo=LkZ zBEH;De(~i|eDO|)*LINqYQ}*0Q#{#xx!1g&?^CEVBA5z;P*W;bo?NTRgLjyU#QIb2;0sJ!H*~!nH3uE$FH2 z6U-`I)*Kp_7;L%Ru_v4Q?DWu8jy?MBJC}Ux`UHo>r(F|E^O6?o6FeECcdf}mKY2L9DBmtxo#M}f`tdW9yXH4 zx=({o#ZQ^BdEtmFbCl)=6MjC4#_7~|Tlz^fu8(imrg1j;D$|3Z_%xfw=aRNAJ@{yR znoVObX`%GsgYjuLjjteWYkDvcpJvmzgtXT5;N9_QHjQs1?bY<)UGZr)jVnp(NDuxz zKFy}_I?@iM2XBo}vuPY6&FC8}jZd>_yp^={zQMWiX*P{pNz3jVoE@KL)A&`=&g~n# zDn8AoaR+JMzQIf5(`*_aBJGO4!HY=y7L5<}3jXy#l*W%j%kDLRxjTLhs35JHxv|)v z-KonphaKL`T#-P$>)pr{nino3-{z#55hrCnVJ%kv zYKM2vTF1aZR(VvOs&GW@SIV#QUdn`7D^+F~YmUmt%TE=o=kr<5vtsryyS%l|5`!>w zFgbEotUq=?2E(tT-|pHexHdD#sjV{w8}pgkIS6c;6V;AgzinSDHqtt|%MhQfD13t{ zr}q>L{a*G9UFj_}>|=UwLjL&u!n% zbNX$xL%yuCX_RpRBkh#YPT6#R(@t3rs}9lPoAQ>(H{5-jojk*=G>q+)^jqKal9Nom zvnNKsFSEZ-OftVI-@8e0cCGI58t3X?zvu^{e@hQbWN-DG)rNISafkim zKG5^n7yQF>)65>rdve~$75IR+>fy zA6eV=u!mTC&$M`(N{|ny8VjDtr@wjJ0aOf*t_DAEK3Dx%7$1<9WsXIUIgO^uRKs-S z89Un1HKex=09TaR8gd$@%4O#n+dH_Mb~5!2WPY3tzIOKpPYYdrbGx^(1N^t7R_3;pr#0?blG^B?zAW|xnOGX8rFs9e_dNFLozQEPQS@97mR z@t-8GW6ysA9dqvr=T)AoJb|or`*J(b&8+zczx}TJo-NcKT$p*Q_2=%>9O!z~(iI`gXq|^Dsx{azvf2#LxMXws~C1A1Vb+5zFNb)nl!=M zRO>aLzV(_&6Z7#i*0+p?UA%XJZ_#fD|2KixYlj=#cl9WU7_NbB-08sHZsz7N`agNv zmbwN9E)+~XG^Y=0c;n83 zU4L;;!<^s4+cYEDFrQvAtO}ds;x}0%MEBNnPSClgUrMC5)@XWEaHb|%zAmb#rr#wI z)!Q-3*nTx_FkZI);kil7al;#C4@M`Z{<+j&PyHG{(-RnjwUtdF?jX&htv_8j!<@Fx z6)8@x%$>b9A>u?2^|e+%Hgcq~qZmH$67Oe2RZ^sm^OxcEMpJDdB~k_q7tv1Zg-K=z zy}b_opf+$xq=ou7RLzK#3^TURKUTYDBW>NZW`@~9-KD>rVTRUMHaQ(BZPFQi$7@x0P`2lFn13*vawz!wt0Z)x zjD~t(`Vp{%Swj!-J2cBMi}<~1g4c}vYDT1f{l$?yM{?&{mr-=I&yk(lpW6)2EWCGy zdE<&1=1*76FbjI65cA;V_=T&=Lc7|5<)uOBa=Zh)=dqvLg)W>Ii}zXKGCKc^&O4H| zaX$V|9wRNFwi?;XRvgDOfn)j8Gt33g&=2&KgT~Od`Se?OadMta@sY!s$O=_n^i*OL z^}F^zAM;!NTK3=!vmV@({bq)FI`!03UgPnoab)K_@SrsH*#|BL$I`1^Nu4*-&-dwL zRo^2!OMgGZ+(BRE+yB#s8K!IQ(5f4roMG+JsJ}Vop3{&-gU^)=sAn?64|WF+}&Mq#MwBMJGXL7cOANOM>v|IcMk4c*!o`P0}sb^E^DXPD@%U=V4Q($ieQ_ee`6O?>6Sp7{&l zL*|l9wvN7;mfU4b3VzvTJmghB`Hr1mHtBVql1bR$#|IBmhe>(~=|_MeCzcO6H<}N* z&Zs=!%J&)he6f5E)x|?T_FaaNXL9fz(t*?ZPQ93$rdoa2AN?-4wjLk`kEhjP!5_KiLLuZ*02uOgoeYM zgZ;;f3004GHLqdKJ3NNDNar^dYqsuSkH{U!GSU~Gc`GUMrL}G+HvEqHTXNq4Y~l6e zkZZ`R_;nxAmkQ?)fBiV=Hv47OLc#gj{wa{H!GsVXk$zu-9XZ+MK*AQQP zybF7I74xaima^ssA7{_>u7&ftCw+>0`NCn%?brb?Wp8sI^Xdym^bD%(b&oB(vALXl z%ecpV8Tn+3RqRpKw<=cOBg^JBFD1{!(G%Tes>_+^*Zf^WJ9mSNJoMRY`tna?Y4stQ zvsM~U?=Y?u*EG-7#~(nx>Ht<`algjB`u}M^qv&m7-pLni12~dD+(7KK+7ll1m8*~T zjq#~GEfd@4>0h}nucy5s$bgEG27VsY+*^0t_eKW$4{G-&^l;s8v-gL?yM0$I9<|N` zUTDR}Lk6+VCrt)t7jqYf&Lt%i|7bt{brlOs**~4=u2^^$c!eZM-RT(MAR zl$Guw-LTGgdX4BA)QW{Av9#=F!E!(M3TS>>xtzTa?q7SCJ&=~SS_->foK)D%yS+W{ zmg;_0m$%;(-4795d*M5D(eWR_$07O}cBZuDp*I-NZS-9$-nf`=$&M86W%C~s%qtd_ z9_xCurFYkh=l4Fwn>x>-&OX3@Y_G$(z;mSHLF7kV8jaU%IJ3&32TQ@1XzgfVWApgp(bEU;$$NI)?_t4{JVPe~I)0^0hl%e#Nhwr?%lG_I1z! zoc>whqYJsEg!uD1Q~j0riMs4MIzR2Q##6&TS#zm}Ie6=Tm_t2AQjk6D=pJNAaZ8MK(TxgFWmAetPU6mh+U;Db(y?stg22j1a zGwIjVc>ucEaC{&*N>Vh3cEj-#;LtgIwHps>Y;9sMG&NX6o&(HLiWQs17K=JwK7PxJTqs;)H2`(qO)+GvHSK;0ef9t2{0|Qt{(|3=230>M+3R7x?YGj0G{}a& zzWeu}hA?vTulOyyj^=cY>x;STB#UwI(QWv8B46Zp`QDf-y^Xz1*@f)2!+N8?S^Uqu z5X$pf`+?joSLFRVx*wQ`?&#p2`FWhR&SwvhHrPsHd_kwV{xhuKv-k}yn{*$&^wS#l zOxWvua3i>uPwhm;TXm3sa$6;cBcEg5zJrn#0 zKEWm!F9trrCK&U;k>D%VoQB_j6uz@gg75z8V(?Md|6lNlP8R`}XtnA}n^yfBT6F&S zI{C%uo)zXP(Fs@+6O7w!Iyup=lc2}FsZQ&>dpof_i_sA@t`twSnsdZioQaX1-A?RI z+FBRxZesv@(NA#(EY~EGrkEGqy(QWPi}m+yeChu#%Gscf2cTp5%(@FYB_3r^K5xK-}^Q`yPm!F z<;J3{<&H%ylO25T&-Ve1&u**C&EtC>-=9S`e)cMrA3*tmi&}OY-?WrFzOnfJhwuRW z+XOu~K$k)At>V8NU`#oXHD39~u>9-96O%X}F8*+U%MI|D%Eae={(JJOPvKe@a%XPv z8fevHs5cTuPc_oLO&hCwM?y!9rY?MI?!Uq)I-RvrGKuIp4_rH02Yt`y7CK{eTp344 z@K!V(oVSAW7s2a1VjgLJ&u9PLQ=02$+*$NYV=Y?F`tbrZecYdmY{7cx>S4tnox{F+ z25a^*|Ap?^&{%MUE(0gPZBy4bNXtm>*@Wsmwod5&z3*PxC#DrR!(3yeJI19Lig79 zDD_O#dZ@efmd=^i>|nl|PG2UH{sHMDxF1P$*Il2x=*M*UVX&RX{YVy1AT#Xbex&K> zyhph2$12DDNJ`WFNVVLLG(C2go|VS^NJ`WFNKbP=(sb@edfP6?{YXmNjC`?!`;n&W zek41M`;nB^hU~n7`;n%jYwzNIB&$yDM^aiRGDIEsBTXM3z2nJB<9;Ni>3*c`*`%FC znq4RNBPmVyBW)W_+S%NXWT$aIlG0`|W`588NYl^dek41M`;nC9XPo?w`;n&Wek41M z`;n9ufH$_<_al)ee4okvNX78Y7I>px_agzn?nlbuekA4&?%Xu`D{chw!6()bKdS;c z?#5+vn_n25=e`%e>-|rL?#&&__?CKYqb2cOSdp zmP4&iOnHcJpM!@bFAT~$?Uk*CZ}5NOD|LmhleV4zA9{08RvrIe#8V`E4Z*h(9jxi| zOCs6yGlbszmF#EesPeTK%(s5&*r;OjuY8BHprh8XM)-Zf@rp6xIXnGEcn)~vgiRQ+dq)Q{-(z52MJQknApR3@vyC}2A<<9zTEZ&9kd#wDIMdpxqN-V$H z5KpVjGRn-pb!gUwu`-$~Rc7#2*!$3>KRt@g;h^L2O2r#t4Xt56QNALRh~@b>Pj~^c z7X7NZmGux9YuHm&j1cu-{#x>VveNy?#(WRY$A&f-pQW#(@{I33-y4^(rpkXU3E3=M zfX@_oxR|+r7V8)Kz-c;@lw~lVU^^AQUS^KVLr#mJ4;$p&%Nnwi$K-j0XTm=w+%n;n ziG>qNqk5j?Cymijy^Qgna+g*jJaMV3S6ek_guILg$(tR({v`SyJ_*(u{JVv>9D9)G zr==yw6ua?v|2XfQCHf!u7XRf3y%(2eANvG-Z>?GJ;0B{-Ky`%B`E(C`%QEgV=ee=$ zr_Cy>bD{0YdF}=LKD0bNE1i32L)fp46@TU5b!kqrs9*QyLXgK4F(fAv+=HC5} z^KVJ8){vfYZB&#WX9_c>P z=UM4d9lC?^k~Qw&?yQGWFL2*c+ATu|b^c58($~Z)dy|Klh=F!!wii3A=9yA>LT9UQ z)SLd@z`Fzc&OF{xAEp7{?ZdRXXYj{IjsCA@=eZByC+Ljh>y_M_FcY0C9xu)OmQ3Ff zhF4gtCA-J%!TaNHAyzMb={n4#xD8$m*6AjMiw$kiJ{{} z4xwx-`73&O_jLKEx+{9{jXE5R|G$w}KJ}CQ6WxD{<;`aP-ACT}r4!xzVtFem{~Y6T zBlWAyojhNUn&iII6|KL6GJha_9#09rjvo58JJ$cZ>4)%fKX}o+p+2{hro6ZCmOc4D z|B)`7A=&x$xB13;(WEmHl7&#=yK6~#upS`T^z3YiSYw!9s()B%WqSMqnyCmQG-e!L%_V+)=@*j%kueZM+lHEVLmu}D9 zdUx$h;r_%&UY{P@SMR}j?{8xJ>YrmjcwyqLP3`OnHLgas!u~2d>{sY5UxKfwE!Nr4 z*jDazF^Sk3u$l2_L*Twe2&*pbEc85>@ z7|j=YkvjtpMEAlcK+92v(e{zkXscr%Jlk-!g~ufY7x4Wto(<1U;~c1~ZS~>bzCQD= z9#x#%vi8PD^1r<|-eY+})k@X?*=#qn5B>qaSGkvD=>-u+emUsppO0V4Y7Uk zk4762?Tx>Fch|$aU&(K(ghxx*M|$i=N2G%N@SkBr-od`;O7>^V;l2Eaj2*IDhS&$c z3Y;?r&5|v~c7wHI0DIr%72fravj0^1v7tScb-!i5`{7$$)}Bge#g5b`*bk5DgxFiy zpW5?zdSlDczKve$LN_=p`^kH$-v4wYRcC}2IGXluvh2i*7eSXAdoO&AWluSzz3?!5 z;g(Is+6%{~!u%Y+4<3r`gX05w(mwcHYae`owGUo$(mwcr?tSo(_Q8`J<`7`>xQs*5 zeelz*eefFW>GGF|?t^Et5AKe%xEy9nMP+U}`46Dqxu9E1n!^kiBn3kS$-!Tn#zReM z`KIRVUBmLt9V7D1rgseU2;XIM`il2&tbOo-4WIM>qu_SnUB>oR?1Oua!EH5fv8Ef^ z3m>pKpEw8DMA{BAj_0!HJrA3`_NkZ$&6=l(-^+e@c(p`u3gO8HeV2qE)Hg*7dJ(lKeVnfNiVEKhrtm!BA!?&N<4}S}om;+u7tv5{7lg*sa z`joLf8{FhW_oJ@y4ca?XI|GfhVE7Hy4a zaBo7ypzT4dfnURK&o>%7y5O@8_^iopx7;wZnQuf3;oW!~UlrP#2Q0))3N(;JG9$QyKmF(?27EFJYZS$m{D|w${U9s>|q>v z&|8sM5$*t+tK5V&J#&W_VMA;i{EQiR#Be@5lo7M~4AdRX(IIk7gpX|8)e6s%3{tW4y z#W&${u4_nJ%Y6F7yd8d#ePPCXJ9LQe&yVc>AVcN=Z#Hv!Wp%7SFP_pL{3-4J-1~5} zKd!j`yuEy5s^rqz`dEK%IJrNA=}!x|e;|nN3a^SjNzlirNPs@iLm&3wAF$$D#L;JP zXWLr4KZDy^2GJkZoA5sPXWa>Y-casn+6a9-c7KqCheNjw<@rrHz@5#S)cQ!QU;Dh~ zf_OT$CR+VUf=>6sZ=zEz@J)k8_rP;+(J#>~jNF0`iCL5mtx8VxZ5p)tdPS^nz#8AT zjuj{Rw)Wmr`!=Yv^B%izgW6j9(Kpu2a0`74#Pw}Sv~M3DiH+GgvA!*#Z@`|-y4u0| zrLkMva!TL4y}SE%UsaT5>YMtb{(ZH)J~ey|{i=@j>$;Qs^(Osl*IIfXvJvGHpjjd` zYhB^2x;yzfXqMRdQU!5ZVq?n5n5xF_el*{rJUFner4RjL%@6N3Oz*uX{9-nab2Qca z9ZfZ_80I#+Z`k4`L)N_FHHQOxHnPFSaja$cMEj@tp>{VqOKfg3DwBd?|H>xK757(r zN3Mo;`(pjOhyG>X6-kvnzqZOSAL^eFS$S<@B+R@~%@{M5d#XaTeGl{#{9{;`4#fHx zrhWBOeav3&tWrPMmZ2LtqH{;IpN`JXJMDft+6?5E@J?v4@9+d(Dy+#`c;wyk_lD{EJ*Go2KF8Q?rxblntz&ZiZGH=9>Ga zn>q9`2U?#=|BAtb&ym(PesBVJ;uw}+&<0>XlRo9q$L#)z5&5U&uRwkwhW`D<)KkHH zG=IAJ*GrG=3~{!n;i(=G&4*gA>+pF9G1p%Xtl@X$7nIo`eY23?8_-P~o|+!1!xy5$ zk=l7F_M#mVj_h1pL7naNeLeb0-=0nXd#abzd*NlD~TAt71Mf z5*q&dYvZ9c#8A7Rm})xbGu)B-Eu8Ev1}B>>d>jsC<~Jn}Gu*)*%&&;g7O0{eX*W3f ze5+hO@!0PpX4+oQIBH;po$u%6^w*y-NCVe=RY|>p9bpedaym+k6-< z0O$2FoX?Nqe1E=Cw3hR_Yqn92v}ul>-@>`WYZR?q&AE5@%;HmIkg5t|N^I+I;d~)& z*TbXocWT&H6p4T<8|TU+ybI?lAEE5rSbjTiwZ<$s*EzN^;61pRbM&$&z34R+FIGI8 z4$ed1{8x^?Re6r2&a>g^FE2T=^B2`Vb6;Aoz{-wJ}@|is5>kQMBexpLu^d*_+4r%zySKxMaf%({d1*Ysj(_G)it>;W|TOGq~ zzbJ0!4#y_*s{-@U_1vRPT8Oz|xXb9KOU|+InqniNb8Zg!olo7&8IKf`w;f+q+Qh!m z@FjkjnqTd?H3Y9dP1;8Ixzaf(AX}*B;nA88TD;Peh<7!_!a;?LJq7XPDC%g(RtL^B zcdrZ-n7^nfFdw*+_#VlQs=G>&@s+;gVlJ53gS?#VCd@(LP3wfD$8gJn-3q0m6 zjh^#pak{MeU_%U#cN4dz*p=A%F+Qmu@Xf$?Dq@g6FU0gV>u)^A3fdGkr5nvSAOG)RV$~s`?ltu{%@o48*G@#BcaWI z9F1Lvyp40w5lb&H%%ey08}C}Rc1p#n2c~>;%-8sjMUKXIf97m#A5xh+_veQBF6S=V zId}2wVx#e0&Rw+p%+dJYgIjZ3sPEau&c@~=-o`!3>vovCzrgR5e9hGJ1ogOY+n4)W z@>G+ab;rKk74FL1p=J1PzHgZB<@<6^uf(78_Jqc2>M}SlvEt{6jlTu9l6lNUGnvbP zt>R}!<8P^NIrXgot_tc}b_4J~X_(7zrjK{{8Y_Tj_D_w**?hl_eAn^)dh%XRS~2;H zNuT>mhj}4+rjVY;x2dGhz1q?3CyI^8@@J7>{+5joKX|qMH9mi8OERq5+k3q$(i+oai;0t?yYw2y;xj%XIr1sx zB_lSBoe{C(#EiH&vJv@=v(%Q4uEzA{mZ*=ecv8M-CTY}b`I7FWzP+5^0ftvCe^lcf zd^ty1{-}$nyE`pQew#V)xF`62nql4;pC&)nk`Y0pW4KkWn6x3(pUv|}#zS`<$`=|> zzH_a7KO*0L)@YsY)xL3_!5sOAF8MWBeo=z;OvcP}z~;c$$=8}56r7e{Dd#=GnK>;A z#~}-T&Lnxf@)4aHoXU62O|rA9eNQN_J1&CqD$n`RveCXj`v)_)=O#A1e*&c8p9?b=|)#H5T!^Gjyp2d4kSNA$#%jDs6SVO8}Ye=8i z`pg} z*okM9CZXF7>iooQ6#dM3Was^3edeEu%a=&~Ye)FZz-XWOr=clT+AkJ-31u60RXY+o z*A8W$f%h!l!-?^iSAIit@zOK!p-i-V9@#s=Kd^t`BgTgIUgP;`%dV68X)j|n48MwJ znWLh<-rm!K%R~nUXGHjpA6wKno3o{N@Le){H$QkspUe-?_s%GNPw>4l(xUs~xH^$- zqIHIP28-jqTQJDiy0w4s$9ylrCN>a!?7}XlbsC+1tL$TwG*1DaQ8F@kE%~~~uy^o@ zG0c9o#_&~EJwvQ|c4CjhRvxVfyVM-&=`I@@a-wW#aCH1zWd}#gV*3g0isw z$9N^aY{%&*%61TghyD(ttW7)pw*2bBXCmK2uSCzQZonR1g4`6^8LJoD!N23{Ey+4j zuj1!WkAw2|-1DCN@>{d4`TFSRC%zxB#y|99uKtqmHONtR8IR)i@Llm^YLIVvo1c)! zhPB%t9$5d*_inm$3_Jl##{dhKcS-kwn|z%Gz$etgpUxPx_O{M5yh*xvRA&)NV);5a zGhpS@nT6I~R=$_w+bQXPqMed{Ry)s=?xnn9oYD`?S%==!*$Hnlb5>%one^`O<209P z-z+iMN#Aym=3^{+IBRTBzAyNznpI%_=JEn;DPHq==eK3vmH4tN4g&Ur!=VMy`D!n| z;E!EXU_LyDa-{v!nenapiuKK!uO1nJY&^Qa?4s@3cd$PIyT<>#xVb71dHn(AD*0S! zKTx)&TbQeAcWUl(py#`ouLgB)L5{fhssdsNI~pYCPQRf?RSUMYoAC?MeD#YN1?HbP z4=MR}ZC-&HDBw=@!O7NqHQ$=AYOVQ-y=-jWX`L@2HzzP(Wiek#=9Rp=7rjAq+Xu+H zny)k;i*CZH2l-XJf_C>^5&9f>HuV1&O=L1U4UF&!P%&CWbe~IG8*q9kNZ9rjq|Bz?E@Beq%B4yQypF&D4cVokiN;Z$M|b z!`b+cn~lcy!N81MeX1OMChL~Q!UnjyIcJ=G^w`cL*OSTVtJ6;MEtg;Um+b%Ae&zBhzW}|f4x8{?-t}W0-23O{tgLta#)F0_ooqOE;1Kt5 z)?fpx<6h9uNvp#ScE|B;Yi=fu`$U^IagRU;`(#y|oq2J^_^KN2EzQBFGJLtSX+Qc# z9rt(MuzY+~Eq4-paIAh!&2DFtkFt+rv)shJr!`p)bBpd5?Zd+z2F=5GcNr|rNo~Ya zF}=%^s%p6BpmvGWC^qEse6!|j-q^%ySnF!A zi`B4h{R4b&;ogG!IoSKC(v>FtCp^euHuF1txvweI zkNrOI;lW0bO+Pfp8kF7MoquRUm_6F9-M^U|*@xZ2Z;)ca6ybmMMK-YdSwwzysCFh3o;seUA?|S&qwD9kIOgZXX3_hc@gKEit(qu<+$&S&K|~T@>%z~ zG6T2j9yacJ(3!@O%!j&r?GVo~!`XH(XPP!8rw5#rf5Auzw8*ardrt>GPY&+rvTcvn zJLVU-mpOhkzP26M3sUh>kREY;`Kaa!WL5dxd-x_j<9htVfYtK3H~4madA4sU_ zXHzQh-%7tV#{Na$Z==sT!;nq?6*K7`SKmO7<2dmmpqXs|IUU;Eu#1)pFOjHBp> zVBADr8%Dt^d<)KqFAmO_f1~^&YEKzRlN+nc6C6 zlV#6mJZ;R%HzVLi_&$cu!zz3<{(zr(8np7kV_EpIr(jo%-p_eXAj)6JCeY*Zoanur zqv+o-=y80R#*fRQ$9%qtzm6{(#y5vGeiX0#IR3-zBU$v&otqVoffhY>JP~Gv8!9Z=DMq`B!l60JyApsd4j; z{E_9aRsx&`c-ugkWbDzJ3u>^x>)cV6(XaE*j7jlyxb&=D;*nYW&ga~TaB>;@^fpgC z@F4Ae?zQ;$moc6=6vq>p;7WWUd@TfDnqyAzL~n~HY<~DIUeG;(7B9f##lmU7C_m_K z&nQ3iu=pXpZ4k^-J2(V-@qPE%L#tyD}JbOfnWGR zeul!Uc*2pE98jNn!w=Vs2k4LZTewy~Lh!Zve-FI;LX4L+Uuymr{D0ysg2wQ3-S9gt z_^(Kf!as(2Fh}!C`50i0o>A4^8{%g-ag|QMpBQj6Uy7fj^Iz|Hem)8Q&~9H7^UdO3 zw5`6Z#7A5GvHPL%tG)<+!LGj8{ZfClM%!c4ric0xK@WK!`Dt@({%?oR+R-O8KGT{1 z&xF6<0{3n7=ZUfjz@BE&!_S%97wFFuWliFKBpL6+k{#)Ynx7**@%fgPOb%fYZ*879lZ^bx} z&9#lU#-YYv_IuHC9wRM~$al@3nm7H}2km+EH9Lo@UUBd_geylo%tFu!2_+%zsDQvVq`!4hW^ zar~f}0~s{MIs@*Y><-q;n-1xGXum*>aH)-s;~YtulXhN-ll$YBHKr+jLJvlFu|||_(RBLf^&Bl zHoW!7%G5s;neTvgt~|2=p9lP#^G(O|kQIF(l=43`h5qui=-jH zSvX2=2w8m|fInwH&a)3~P+y`j_iIr3k(B+2Zz0MPv-0pr_T3!dVGHm|PCZ6BwW++H zgL9n|-A$df>wQh?f9Pv3?b4skj;1==A0SwnKkYJo^_#IKJk*g-V@^1z-JIXlxJdg; z#$mzUi?gCzUKtV@3f!Ry(Y|Z|FFR@nTQqPoK81tb;HBwcMnrexZXcF!J`KLG#WZY# z{ySMmzjnDs)nNw}J`>Ug2C%(fsTe7;ajFlTW$F9LXU0PbhRz}nvS{=s_k6cF`}sQ< zbK(iz9V#AFOfbE_K!4lv%8w%lU4usLsJ%AQbZ~a0j{P+CNqv7BT4)$o-QrXpdLH;vfKM=qCpW>9szY@}klR$Z z%AZ>9=~K!H?+0D|Mtw=&H;tPU*%qULbOG_PXwlg7#JctAuZ*HFI9>&=)y9^~Gc4ZR zF>DArp`&3NvPq`!KR+{yf8ZYvexi6!YN*p#gB}TK11!8}F~6UR`vwRICcP&MSuD)x{LP&M|@kSwzK4aXlEhqXkPgM-_sq# zejM3y`Rqv3{5g@j7(G?L=qY)04E~Oy<1uKO2`n}}Em|U@+O!n^+4QX4=4?8ZHkVtp z$?T@7XkpC@&_(0Irb+EK_z1eZJO;XqWxo62BUieKe-M7M{&q{Q+>L+KjC@mPEmMGJ z5^K~@Xz)Jx2!HN1-{CycKY{fD=3L30b<9}L)IDgJjo{(}*tt3@WQ9uk_%QT_5BXc73q(maeR_ z!mg~Tg~g?{Q|1%r0z6ppYoD6N{p-l1x8QfOfO)TF*)7eL#Dm>BFwcGXn(B-^_7RKw zOm=6LpTl~Z)H#c@G#`*xaRXYGE$GhsFY>nIlNQZ8g1j#4JhA*)TDVK#(6IB}@4Yz1 z9Zer*-R-=Vy$KJpisUVP_5Ay}mplwzdegsp#!wFY7>0g6#_QQU%rV`4Q~!!f=Th$^ z_i*CBWkECDfi65sC)C*f3v1w7hh2YfzXRU9ns|t+KL`BTxYIoGH1pfr(8$J}^#-SZ zniR#UaJk*W!4bE|oVP?|J3lh06=N zahX>>tU21xcwF}OdpOG_zE@v;aeaN7v8TS;{Yydr6wh??N?YiAdF57gQt`^q>EB|D zSAO1ngtMu4*K?^A`^mhaI^L^~@<#FZ^hf9J1UvFp z@Lg9@Ak0|afQ{mDR}aoLruiG*XV2{&uepV>zZ1VojdkJsfyMavF%K?JHG1;Nos|eCSx`J2&HBSDfPA zvx4V1=Z>yVG4@oWr+vzIAMK@J`!9fIimO;zqC3xB4c9E4-~4l)uQ=a*HFo$+&awU- zU&uW?$9QIsp6uRBtTa!l-Z{-p{I9q-25AQ0jHNlv6Dc#1^Gtu||6Sy1=G{e%5$W;o z!Yk56&U2<<}2hz z)+WiEp%3uENx*jrI*PV8kHY_kSbJN*Zyos8INnVxBkBCI6_#7J#LNclD-c!dM%93t1sWg**u;qg7A)t?_>w<|3a{kRS@QC%^9z@_&o8`^XSV*&ysB_^ z#_Ymn85xCtw{(~k>->0&qhDtwbhTt+_&kKXDE=IU{xX{1;j)Fz6FI;9G3S>@m1a+r ze$$DLwUG2|&drU+2Pj0I!LdB4oF!MDHslcH8QseW?jd~_<4tv>a-Q5u=Uk$d&OL3- zq(5S(bEe!%PmQGyV9qC93M- zY%J;5lKv6+P2udhm5%It6Zqd=c2n~s^vz1+{JG}sN>@MDzy6GkzKn~0fp&B@2l018 z$P=5!4UPOvat3osJv^>CMsk_vp%i$U{mur-p_|5C7eSs{EE%gFKGzy5IqT)CjiPjT z`D2Zp3HhdEn#;K(;4tNS@zx#cy?Kk*FS@B@qQ;-jwEt~sN%JnA!I_iXN3bbYV2_dB zg8iuPXWV}=6F4Pw{b4 z-GW8+TV)?P0ncR({Lk8@cD787!3>;hBV9!$(7KXy5-P_U+~2O(&i_C!hXu=}JssUP z;YIx4LjEqTEvb&8$mD$UUhW~8OI=5ikGD+dvFN&S>#y82j5QNEdCI~1+c&;qn7z`^ zcFV4o4Nu+d8sUx{Wo}0HawaARp3F;H)Q9*7jo|s?{ynOGN%}F?ze`vHR$UOT@;H*) zBJl777xbvw2w!Tg-ITzcugKXx>i7t|U=Tg&3CN(`;nz5M?AM<4mW2FXNpLhxZ?GZi4Tk?4tYkep=DNw_@to7AL-6P@6 znthyWW1SaIXuS^w21hEH^Fxfa64t9wyu!P0^Hi3@^WE^H)k|+MlsUuD+Id zdX=yD;Y`ZETzwm!E$AH)E{x=%fv~?%B*fVD@;i~=P4m+uMw%mFBDYJIP`>jiTek$i z_NNTfNJ|TB9&wsgUOpMwoZIa|Iq~r3`PW4LgDvmrS<=gUA+rn(L>TMaSofp@ONS0^ zV~?EkmS4MiHmLoL^s8|k_hH~iXi!&ZGyT{XrIpf~!N1N~^h7==_Lnzz3>)hlLiOn|JX)eqZSB!E)+tVJ>KGl-&>SbLM&RnCHmzloubT zextM(Qgigj5zR#o_9f&u^t-pbW&;1qr|CoHj$)%vr$JkJ=uMn~|Doz)@4u+nk>mc5 zxdY#jqSU**Z*)0RI|D67(Z{ajQL=5k;-B0s-`QW}jH*g@3<%^coZPG!Zq@$M=C09W z-PQiHnyaZ(^ONe`zv-WGTy*8jZp`(O6pc)yzegWdSsW*SzC>wS9fABXS{aN z-_1`WLy_O$S(7oUYF);;RbhDXblROso9WI0_%f6l$#lXYxdMIc3^;cjSyE-(>PkZqDNgyXHiM z<2;^sM^AF=z7KaSZNKjLsP&re_l#Sm6UqjY11}{D$M|pt%7CH}Sv#tJTIgCB@ z#fo>QyKJ!e`rCwOqi1Iabk71;79G)*+TZb9Z}9{Fiw60;Ro8perTSFQRGodN9^qDX zOTJT`Yv6-(na3-f>Hf9`cwrmUZec7bDlWz1ePSye2y>e$Y9H zF81zbZ4zA2ZrIuGwNEflIvlguqYoHPBdx+|_&Kv*Bw6Dn(um2_XXWF@c=3mya>Mz* zl6FMD(e;#tcGyH;Tbbdhx;tZdmFO@Onkg2p?qbd=UkLr?HrFIw7wJOA-OYV@A=cCD z!MkWzhb?Xr@~~)lA&=-+#d``goE@XxUC`!2Xj9DdTOQHz9M(jwF|B1?JATa?RfF9n z8ydmeTRoxvLCvq4FBPi}-wsY7WBjF<Jor87yPfwqc|+t;I=)d`JLJ!T zkG3~1&m*dXwkrRpw!9g^Uy@Jqb$46F;FH=qaJdn=hdkZuBz7!&ZM^Ky+=-*Lk-Pbz z$KeN%0}a+PYwenh?Jc&3^^03)Uk*gq!wh zqMyoV`$=m4^FJQ-ldLcte)*i1FvjdPmc7-OJmT_K{$BeAz2aoKUV$T|+v|KjGN#~K zv@eRQo{Tvow(i^Ovvt3G3=fU3oLJkpEIhg00q~K^o{H!Dz>(l%9(YhN%9brzAVso~ zjo)XZc%g5LKUqM$P|}Z{qC=H;?f#YywFumNmkyN;zGUyR>~pM{(u<{k%_V;rI!Q(q z{_C_}&}KdBRd`lZ|9Y7@-Qpki_mFcB*MSq&XY~vD;D^Xr`u|O6D4j^_b+d2^Uu&MT z#t=TGqGz0c7`~vRf}-bJ9|7}sz;<4Y&J$xWcEblh#lzRCy+-7oi;h&hv4MVVK*p&_ zkgOrU7i0%u+_FA1QjeS=y}$M3#M&?A_y?aJ!$;6)$6RMs0uQ+ygDT}?Xe0UIlkG_(@ z)7V?_v5%;Iq1Im-MIX9SM#(=>d%#Diaj_fg1rrQ&z`uJ|n4(-sa&S0q>UzGS@R^I>qeg8KgBSve(crr!0k=g4w8YvhdkXiaKz6VJ<@xg{NCXhpo-ksT35UUTItNs?FS7#-9oW{t&GGYb$vfZsY6Wk%%*By%;Io!|2 z|Lvouy0gm0H&+-=zs^d*C)Ry|UCtE$8rBolEgIE9kNRSVITm`I}@}f95&;-*z#+ zW7J!_dT8V`=7t{vM-F(op7$a4Tx+0XA$4-b+pGtkUGUz{0%wzCst|B%Tz-lTrzMZ(UgU%uO4oyujW-J8gR46Xx9U(`o0+(iP1|Txkst zmEG7}3$Jb;HQvo$V8a)sQ{e+w=Vo~6OwObg@Vo^~J<^QegJtuZKQFzr`SwviaR0kh zd+|}?Hpn{0NoT1w8X8H}9+*xAS}8E&*-_`LfRl&t>;4s$UDg?)=p9K~>xO=4JhV$|&FbqS^~^Cl3w%xUX=9`#IZ$)CuW2T4jmbt} zl7GWm%b(BXpZN(g9Q;v9Oq4qOOl4cTow~#`b+oN@_W^7eA$TWiB0d=B8bx7vY!Y_T z5^SNm@9I8$PcFa*cxp*Be&(ClJ-e`bzRNS1=S}w{_Dd!ezRNS1r#+*%@a@cN3y)+D zE-b_TSz#nu_D|aE^kUC+0Cx>-6kO~H+)3=TBiPIoSMol;Y@QA)cIHp6o!eYVyCb0A zE_8qoNl&)yok>>g%;m%`96{{NN9;7q*2(@AY@10|?93&^&K$wn z$}&66vTG(;u`_QccIJrT(Kwe@Im@P*WW~;0oK4zU(Kwe@nq|+VfAHFE!$~7{=3u){ z%a%$1SZfy$J9EUj#0JFo*mdOb^osTr5!$b6W&qm+4nwRK80tP*Ir-kpF8m&wnU4L%-J=4 zu(|N|4Ibv^tW>k+Nu58?d0{*MYVv2r@)pPC8N--RTl=VA?fjW{_$qvg(OcBsFxD;A zp&0%1pldB{)!?^0kMA|exACy#tA5IPc^iX0ZX>Rp?}UZC-vvu31`D#^clNnh?V$T# z&--2O<#hk=+9B_EwR3N*od>?Bogb^6H1_U!%U(P9f7cFqzpI^_W9=;At@?z|T5v4< z7O=kE2R&bm(eqB)x|-+fj0@a@;@bN(MoZ;g5Tj*9T>53uu@*YkL7OXRrT99X!~d{z~S~o}*|#_)^x zjfdtTpH|`nwJMGC>EKp!Xcj)avRP&k3t%q&yBi%%H1zPSN6*w+W$Vvf*l1X6qUTnf zQT289-)9SW#HoLl*W4ofBx_dmZ$P#`Pc2 zpuCUsO=lGzv))4*9#L6WzWE!yk-;9)yI;Qfpx%S>&2@Tb=9|CNn|5?{kieeh=pn{#M6uAUVLoB|5Rr)ETW~f(QE< zkpZd`eM0t>K}NvpfK_{aZZ}%UlDnFmaj?vjqTD&a`6S6Fdh5fj75b4?GV1X!|xM|MQMf63hP zvsim4_w9_}t*VnXpu3FhoRs;9dP_+YP2R!wW2akv&^%yd2TMrb!g(n9rS9Q>@#q%D zxOklXgChBoZ6WPxJB{DO8e80Y9%U0XoSwS3+=0)=N37TK&#pP@H4mZN_hB!2 zBWuJ(2|WTYU^8=~H~$WJH_CQ4mIpm`BXi%Aoa<>LFZQq3&$y{{qHH_bcfNCJY4e+U zGA6jcS}GeuvbBb90&gR+xBLa$gnYR_!{(BO%`0@eQADg~Yv1|1Y+e)SgY^BWyk+B} zAD7Gah5po_bx3^@{Of>Sb~*WYJjI;tXAL&c&23wl{5?Jzf_w}f_v7nvfH6Orvy)Ts z_t1R-T8sC@*5atYM_%EctUT@t$YV{;E4(Z7Cxwq?&Mtf=Gox@e>v6G>7+sI?_sAY- z6dgvVp9>BaI#L50Xg>$NeI)Dt4s0#bH4Y$i&-0H$_ert*J>*9`&y^Y&h3*sYQ*eo; z|D;;}9+!}36#CCLd=8{{$mie^O9vtye-A62b^Q0FUu&mZdJyU8NLD&}(C>babMPq`z&aTY3@c=>Jyv z;quqG$@15*%3Hb->5OkH9o?vo^hfOSmVQJ!W6erOKdL3Y%ucs-B+}85taNmw8q%+| z(=9!Tbo3-E9X%;b`b0b3(v?VO4YktIl|rNsCS7__zNIgb&br1r8+aBO`EAxnD-E4V zX97k!WwY#W@$g^Z=@#4HgE1FB9%Zv#_g>r>WbU%Zpk<$hhTmnM)fkhlReP=S_xK^t zr;GuO&CS?X#a~ax#@>dwvG+H|T^Uc*=i|iKOOE+`MCY@Z&j&DTK06c}d+L|^p*cae zz!UvT3yfo~5r0cQyoCP+UmE|*_FZVCw|&f9D!cdNX??MQr!l9_lie3Ra9(qDd5+E> z28)eU%ibfKtL)y7|1a9!JwB@H-uvG(6UdDS$khZV30Ju&Du^gZE?6&I71QdG)&!_R z7!Yr5xhRREr8;;tN~=exOlA_2nGnE(2+<%Y7F#1~p;b>kl?VdTfZ*}QR3*RnXYIYi zfY|5vJg?{ZV_viOUVE?W_xoMn`|>G2T1Ft}N_2V-O&tn-#&65e=OD3zN2vD`@YK;G zQ{Sw{GH8lu4d0sjH2?OvIvN_Ce=YrY>Qg^OBh)wPVG60+<+o;VExIk5ZT1Y8-wF*e z{8q!hQ|(B5;DejqIAQqUJq{l{J7M^= z`ioDsi9N?VqEoWr$S>sz>SUiV`EV*nq03_Ks`Cos$>_YFpFh+19!ZZnRtlFy)4pP!26I<IkY59`Au%Qp(T_{ z-=g_}mQ+$c(k(Z%gmP$!DTkJXDDUZ(8(Km+v}6X~ThNlN=uD48FZMD2V+}2_^Y|<8 z*vs%3q9x6gjxOmp3?VJ<6i%e_qQ19nq53q5ui;-(<9Xb9M+E-t0RX>oY)sNb-$hP!l zAZ<$a-V2{lNqxxmBYM#82!7h*yHjTYFzU+n$$YE#5Av*X_RNvfO#3s*5iy{#)$$sg ztwOIJ2G*mrU(5K%IPL#P?IWYBjw*0B%$$ste++%8b@U5vz3Rug3uZR1T*NQy3V$!o zA5;AvNL0*U8UaU9MXO ztx?&V(2^OhF4rwf(B)2db-8XCG)CWbfW}PAadf$E8T3VEL!d7ut}fRtgSMz_0&7*~ z>T<#T({;IvU0tqQW@w77%U$5;az|1odYY)qosTZJC(m77uAwEs4RKJr?gnue8oOGgvCu^@i?i7R){`Sji=6p!a)&s3WODDTKwV4onn3rD1jyOufMk-Kii zUhHbhsofMZe16`Y|cWdSPgRH5OinEF*m1Sj5Dh4n1NC(NhWMo>y zTbRoS;63j5uvaj*y6;W80 zrkwq`n)1zVx!Irj9$YfzW`DlT?9UoQd$T`N4nCQ3_U9VDKkj~S@P=}5%9QsNf504o zrYWANzi#^FLZ(wh$1Rl4^euCa`IC{|EeZ=0y9(@S=# z9PTeI8?l1(T|tGFi?At&XISyZqvT#E?_1?#Ry>RODsy5}Hk4WT z?OM>8tXMamN6Bp)3Rv;n`$nvYrgMhCY58e7@Qz|wbPkiwYe?b#e)_HRWKVzB)Anvw ztTM>?HO;`-lar(W;9X*v8}iU)R|e64JY*H=EQm7hcm9UlzVv_M!^oC*=f{1->?;?= zPV^(d%ak(W^v4qO@<(JA44YU^au19I4K1? z@NKo=Q1Nt&<;Rg8n{oZnplGE08(sl!&$`bV-kZJT7W}lwvfj5W7-RB+r5paZT~K}! zx0qaEZAD$8dC=HvBsiYs~Sr&V{8X3Yb+X*#-n~;%ULIai=8w zt>HQJUw-CZ`agzT16vdFDJZwa82DZ0*U7I#{u%HHZo$T?Qz8+qa-y&3&AKwhDXA9<76OFNEo;^mbhsLGx zwRhG*(s+DA1WPB(TDZAd+8bCpF~5&l z9~+k12T!mz@E@IbIDO9+?64ML)&g4e*-mozw{u~K_0U`s8$3m8@iKiC4ruNLKkB3K zSLfs%#P8#Pw|&!C=HobPv6yw)j{n6U(vuBdn6+Rm58q~wCCWM&*iw9}!H-n49+PLd zWAX*j^O2iF@P!W*_%V>V7k>B`4NMr5k9-|Aez@x){1AMtWQ`7jAK6x~K&68pq6zMr zWUyyzO$2jcaK~K}7w!f?-!*=%O9^n72y-Fk=6kRv{2>m}g)?`2iSYLJ%?`ZbZzOnI zoB(fgtPTd=7AL|R?=3z9ylH&k6gC3RSI4g;rtu}f+uYgs>0kr0%JO$B{$2S5#OKCt zNQri3Jwwn+i}R^AjJIj?<`q`Mar`Q)`XomieVxeL;6wjw=XW5!zVrG$)^Z>6(<*Pz zKrVQr^Wl^eV8eKwNzipr?1pQiif>mNRei3G#&##0b|S$0hO4dk<|nO&&6BT-R`vOQ z-Tz_g?n&Ktz6;SYyZ&CW*zT+O=DO&Ht2z7O$^3@RE3jn&r$^w|+UN(@VQ9S8NPT#I za!ORbY>GGW0f#lLm11sQoSJIRJ%671zXG>51G~o=XH|ClXe>E7YR(N|UX=48lR0wN z&&~^A&&AEa)Lip*!gG6z*b10Sb@chSQ=-G^*9Q7f^0kkh1W}pAomlXR0`{IJJIsSFfs|)G-EyygweeETi>jXDxu`sZ= z3Em@{vJgIn8v?0O`4s*)c>tyYr=k(Hz}|P@>SHQdXFC50Z$nMalgVbA&-fJ7Y@v$D*0i5@K z%zM9GIG}L{G&jZ59p5zecz%1Va{~9HN8SXV*acYIi%r}eX9KkMctVW6#yxO^J?`O* z^|uE$-@g37=tax>+%~W>UwH^e5(F|S*=z0Mk`)OZavLgJ#t{=M$VML zSEU7gV1N3yF=#ay`I~mDmU0#d{h3F()-juJ<|5l=d;KkS#6#xcAKC&8XJ-KG_#5`& zd-;*fV4W1R9wN6{*&9X|!Y`YDUr_le_i%mR!ji@< zfzkf^u+M%-{Lb%ZFW_GPmk}Q}+W#}&(f!ZhEw3=wqy1NK{W8Bj{IY#X0p)1JccTGV z#jf8S+f6&rzhxBk8gZT}Le}9YedVX4$MV!H`eQ7H( z@3WC*koN|y8GLP2dBDGf?)u6Gt`KdjyaAg1ZRC+Pk+i62y74(-eJYU`BFtmjhw$>y z9P#Qg=5|eFTvT>V@%fd|n+W|7P0JWb{;iJI*|K|zS6R(k!b9y+F0q5`QAhcaue0Gf zXrkcZWppI#(UEx3iBtkJ`=P;kIyW8OXJ?P_iWY32%9(MgY@avTw$HE85xTZd`F(!v zKWY1Xm+S8`e>UlNSwETdLRR-lzl6WcvoefMr1G2m1`qip(t-OBW3uoyn(Ijl$`1P1 z`E!k&e&oGXnRD^^l-{TXz2f;+Qm_P{&uQ?Uf8ia;>Ut*wU5MUkf|t}g)9^9hO}S)s zQ;sggl%oqV<;0KfqWmVe99@VhM;BtsiF5xm7D2A*LK0 zFy+L#zfQSy9j1MBA*LL@%9Io5zJv1j-EwpxrW{>}Deq@h{DJb#ZaKOTQx3kEa^l=y zqx@;N99@VhM;BtsiF4mh`Fyt=U5F`17h=kZbAOfco7{4AA*LK%h$$z|{T0eby5;CX zOgZ#iBIH0_DM~RuVh`C$k zOEt0XqIo6Y>zY1k(X~_YVF%V@OFKrj2TuMwunt|quPerRCVvjCni!SMz7ss!nm*&A zLwQD?)IZ0TPUc(S9-1Z?-%I=q{Cq_iUCB$>PX0+e`^{OS{LdhBNe1)4pU7@`kbWG+ zuCIPQXm!FK+bbZQT@G!8XupcKX>XVCNAbGCowxrqvgrW(zkEQZqpzG!8)dYy$I)vj zCuRZlmow&i##&7qJFJe-iPV6T-(iq^FvLgq#%E6dQ~5vE=W>4u*H`{mYmxHWG~c-D z8I55FW!gLTSX~04x6tteu~WxrZ0;EV;Ji zVf#DDxfk%9adp;wSie=SSi4`3@|=0!HI#pS|2Y4y?0y8;lHNfy@9_Ps4>}9c#<_~S zgKox>iK|ZV(R<~;Z5k<>7)!nm9Tl7fn zO!%=?^e}sn+lPs~@Al!%`%dZ=Cai5Ox|=ae&QQI}80%c_u@SGwKD>TkHhxQ-E6rpl^6)@coqp(HOIuSNhp%Nk`>5pUw!X>Vi@qJ8 zZ-+lPbKm-ci)ZRv3w;w!5e>0EZ_W`c%Wf5 z(6{}_40Z5#RnXh$4K|F=WzWmzeDYHEMq=`ICCU%}S%*fi;&Fma@295Clu5?gio~K(&2jFCoClj73*}Qkp!qUdy@{Zz+mh+DKr`(_F-#_lVcemTe zJLubU{4RX=!bx{H{nI%_qP^1RLQQ`}Hr-aAu2AE2Loct^29z4eYSBM<Fu=JkA%vni}eAQB8 z5#aU^@bDj{_}lRP$iXB1PnVw8xK*(~eyeCaV;sm&=h**)_lC`y)u?+te}ef{Jk`as z&TCW*Q4~J0cGNY|I(SIw{R8;L-3%-$?q9iCq+8NjYhRQ88~>pOU?%Vn^2>;)kMXR5 zXVOdeEW2!l)w;ROmUbujD149c{nz3xfwzfWv4y}(q8~N+kv;}a4*UWrp(9Z?=bz@%iJ`h)4Uej%QakIge)h1O@3mBW{YP` zF+5`_@@F%=}SI$pYN6%o{@6l1^TsX&^=sC`Au%Q z;Tb6he@r>{vr8!7?3TkbW&>NYpP6#(XTvFf+AW7?H0AJ&rX2g(rIa6c%i$SKx!_*y zV?P@~`TK6U;TdTkp3(HbuT^n{+DFbd<1;)X6ROwk#cZ*7V|6n*+_h_dQxue*oJ4c z?PrS9$&oJ#{G@yxz3`0H@CW7aPU2aVn_W2?$~^7t+(^*s81z|iyDh^S-V-|u^5kb0 z`M$RQjdN7BzXGqK^Mxs#&j(FD0IYI;(3HOLis-)n{3Cu|aO!pZ%?g1ZVn{|jL?5d7 zJ=n9K|K~8tUNqmSx)88!&fJoRmc*$0U`^tKC>v-X-t`5ecRJ4f%<+$3L*4zov0_w%?H|1($r z%vXSa*_KLmKaca9^&jBuZT`PoRLFN-Vv0#nY(ipO0`|9xpZ?A2D!lAXf3s*$?P|S3 zUG!Zw|rAMxN~$I&uWTw4sJJNOROAxeUx>YQq6uVUEcx6j@XJm zZL7m?uX5~&_So(9*+UMJZSX40j~T!A>I`@?(Wkb#Cl>^HVYD`!C3TsJnRw&BtmWcq z#RL8nzD8|U)}=+YkFFJOu%Tl#mp-ngKgqnu`b?>;8yA&qP`hDrbbD&IrYQZF+@LsM zM?SbT4}I3E)8qrm9+C|ngof?0dId`0amCAPy~KCu4D*=NW)f{`jnszZA<6yXHIJ~y z(pM|DwqVBObY0TXhw~d^7NA9q`~k&)LG`U0;(68!sxNJ z1{;|#=^ZxGk1v6ZFMt8*mp2)lJq7K2S_MIOy7l!Y=!R9+VV-ME-#5()_PT~VveZBsr{rAYIl)2|% z>$TdU1Nq#8?kc~bI?EfM!T&Jih?+&@cIG^lOSu0j@f6{8NevHjeHCYf{F3`fT~b4s zb3A8o|03tBR4&ec^5}T$yK2t(T!fxx3GYptCx(8S6%9jZ{qy9YR*Gl zJ(+Xh@o{N}m(yB%i9Ons$NQuB1vvu>|1;V5R_~KP8qYfN<4n}*Wd5Jz|7!l9;(sXr zEBN<$U*_D0vI{wz#uLAUdwcBU0N>+@UzB+N zwI_al;{6An_(1L(IU_f;iF4sUCx>TxVO(RaqCXSQ^^l8$z5pj0o9@ei*`0oJ$jP2N zzA(NI|6!eJaUt?R!-}K^*`Phxu$Ll>mSI;L4Zi_jWzGD+wI>MwFcC=N7Z?_kcq`4Bm)*yC$EALawbr1!|7WzGk1-`De8 z#;o&U>b}OOj&UCb-tRy@Or`&~FkYSEp>@@mr*Vc_2-witf5hBu9Cc*_XSkYkWA+hG z@Eh#+ny)sS@huv6O3cf-KlWH{UxY`eTElbEtBzq`>CIRd<4d8~&vbY(`6_9wi}9T( zLuVRb&yj!A;sv?p>=@f$sRQG)*SV5)CY}v{3f9@E=`z2>EYxZuu(IpI`CW71ETvQ2xxes~x&L(1sdNAA8Rq`k)8_tJ=03n2 z+jCF;w1l}=Jc8!F*qQr1+WWq-{a9k04XQQh4UB0VS_5~^wFd0{PaMVuss1WoOf!0i zCHUP4H_R_#{x6v9&OiQ%-T)XqG`7USeH23mZ5na=scBVOh`0A5$eiFZJn7_Typ7$XR%s)GS$oF9W zS@`8dn12>Ox6|kS6<~-t$A2J`@uao9A={4wQxnB&iFUEaXx@dx!e`C9a6n^0-mP;D&WDFx|j@EE=LQ>pU>Qcyn5EQ1rZ#vHt^|g!bl0USWJ5upjjL zf(!6%{ucO=EOHs~iJzgj+=u;Mc~3v#3_jt@i|}GD{b|)a^tOtm-+b{p&Ob{=*W=4H z`}OU)$o0&F-tA(EeL(@WI~0 zUW6x;3{+irWy59c-7EQ(`Pu~vz-{@tXbjM?&im0}YA=jjePshWc;koAz#i=G8?{>t z;x0Z3PF*(+VAia2|1-nu1^xc-!K=Ze9yXk6j~eRWkziAFRdA`ke(Llo zl{x>2*tqTRONlu2cD4G4!W;ETu;t>92j2zt)y5ll-%Snv(ZL(>JetpF5A|If{(suZ#T%RFk$>Fj zJkP1;S;;@{%skKOcq6=!ZAAOP*0+1gz&En}?8B!rAPB@TlwsQ&#ULUj#5+^PVT3^RCXLAzv$Xuij1WxAzL*UwXAX z0`DAUpHaPu->Dw=+s^;u+mG?VcmcU&Kl1v9^uoAsJ>wwuE_ZMK#44%R$(JYn=H5kLu=lU>o9oIR+s*ijMZh7+YSq+5J%hTl|E}(p zA8ppVI={11L9}{%LA)V2wjmqbY{u4)oHSVAt_k^Xu-j4ngc&Mn<@YGRX>Eod0s?Il08m^KtZ7^3zD}_3x+Lf@W#Y zDkl%CyN6xIb9+A0O#fZpK>dftRftDRr~fX`wutBUxRBxY+Vu#Jk0;b`{rzP9TZ@Ul@4uqO;^&r!Gki#1>6?0r=hke3wIGHvyZQfvcYEAsc|X z4Z!s#V2v{y2fYAHeZ@YaGcyE(K49xxQ(uokUjt)b;Ws1LQk`+$TU|%4mUZM6+CYv0 zV9niM5@8Ns#Lho*U~a49Px&Qq_LUbnt1F=0o`XID&T7_?7ZV*p)dpmG2j1`n3xtr9 zREK-!=K;nUVn5Zn6dM@VCdRdyF}=VzHg_vV{Lu@H^$Ys;PqQYBpK)(u%_Xmj&g^{YB%L|Zh~E~^>i>gh zdGHzV5Z^Kmt+n_L!N5qyy9xXk&n>>=90MyJe3jUXnV;vGn?-!H9@?N-hb~@ER65A^ zek)qVdRM>h!8f&QP_)Ngd;Qz~srK1qqB(!~i>>o?X^!-k%UOSN0vex>b<|%;A1{Mf z_}o(vJ#cP*RI#^}jK2z4sD8a5p69b=V8ODx=Fc;B@d;X2t#4?ky|!9ot*g7nT2rmj z2FB{Hv({DXtTop9u07NGLQmV)_qRX1zK=3KpY}=TY_ss-lj~dWtnX^Zl(@cCzy1FD z3T6}6SL>a)#)9X$*rnXP3y)dfO{}Y6xE{Ng;P!lM z?HY&p7Om|I^z|$D_9*<;2Iy25p4sP-b%|+T*Z!`3T|7h;V>^$&n*E(MclUSngn=q> zrhq+uzxn|Di2iBr#6yI9!X#@L*}fazv4TD3+j((LN)WGoW|}sf%|sbZKpYH zOP8c~6W{sUY40TRM}oyF+O1~J1d9{rTSfMs(JmH4p4R0mprdC3>gLE$m6ytCUk#zTXY(hjG?j{^Iie6zo;gw=lA%b=NQjm@6Pl1T1p=EoRm-T1s9AS!8cMiLfa?YkIzWQnCM>~aTlo-=u2!gZKKS;|m@eJr19aVvp?)cLy@`Bk-k@*#Ccm4&=4@x3~F%|MSLGnZ@|* z$`^d!LY)QI-JAvYF6VrW!>{Aj`M+%Q1^<+H_c*@bA1&0GU}@$oxN+3Gjq`Cj<>dL3 zUK`_=5BQf02Q|u8XrBR-g&qU?h3;7AmsK7uh>NC6hoUhFCoW~qKEmf+e&8D4wS(>P z4QG76Jve;Qa`}M!f8qFlpE|zBhn^hYj~U-?Gd|n@+Z~_$zt1*j-E}kL+vtq%&%`{t z{@?ES(v#!18)bVjXBjXcpz^iedSw>Jet{67y z*pDJdi)Q7)+s!_PFFf%16?nNB*sBIkCC@g%V`%N`@yRH`J|y}i+9a98$ROaHD}#{# z75sB#4`5NWsUG`O4KQbc2ZlZg52(MMITw8rKG=BBB_>%ShAbkS673US897F9Pu;?) zdg`sAPSL!UU9ti83J9;#SkHRut)X7gyxh}h-X6yAC~)lVCFgT3nM$&gp}WW@%DcRQ zx&l+G+m=;?H|{TS&(RugWL$|di{zCE^@>(XX88(z#muDqsN|I%=orMG{k&@- zb&rJ~>~3_4qR-m<`4dNx5NLkcGaw#^hK@2???|SKGB@R2CQsg zJq-^}-v!6e;XCUmSVf|VqGR$iti(p( z_t4@@oSS&Im-W=zmy<7Ba&riH?trgG2s$c0S^R=*eCc}DR1jBQBgr54;^VWGSe2b! z$ZtWPK4X833MRAQ!GN8$%=akH{HX*6KOqlNJ#&2__ma632b~9Pdz8Jt2HM+dac0OJ zTq7&DTAr35*BjW|QbG=FXbDghY0KTEEtP z>HcrZeL|cexpv5IKkY7<}DEg`A9xJcnOV;w)2fP)l$h{~Z&~ey?mh-*#`&Gnbh$r|HJd$+w_afuz z|3CR()!u$zxf{Qrd@JAUOd95Xi_RX9-|}MKeU0<5kM$YpKY=f);vh6Hb9r_@elX?e zgHBAvC)W6;CRfb;v$gzWzq*)y369;qy+K>2_f2PFC-&v|X?;=OgtPL4+4dLrtT20j z(RpOrbGA~}%-JQ0wD}Uso(Bgu){Sk*WnSyaH>bRF7kRr9zv1PqAM)dq!|9Pvq08XF z=g`$Cc!Dfmv5fabx9uEtUSdOJH?-}egIcg7h{giH;y+~bAC2F`3T)$vZ>V2<&HJB&Zq5Y8&hCU#8uraE|2gR)&*2hY%zcjOPJcRJvY$5}zf zA5ZUGM+`?7%ICY~_~V&!{P9dVF&t-8ev?~{Kb|QEA51wh9Gxj2>6YV4LI1INneu*|_eJ?; zw;X>w^F8=z%8B7fqWo#M9Dh7hjxF1i6T{)7e7;+bKb|Q^E-~fAaCj-d$t}kp&y;(e za$-0#>@>Nd6VtkJgGe*zIeGI6Q&;K`Mdy58lBqADXT_ENPIFiw%E!raz6XTln{Gpn0_c{oZ43&x})qp$NqF#lX&iC^y5Ql zXAW)T(MB0{3&*paTyzoUBZQt%Ipma+PQJI&OP2Ka;OA?Zb66@r;LJAogD;@9znqvK z#jc8tp=az@(+Zg{TDu3`4=DD_DXroCUhK>s%VKvt}8 zw*u<2^*$wz{;L_fTDv5pVk7z>$${NH`Oz*vD~uj@^iP(?#W*w`TOZE3x6sl}z=XyY zVm;OOHW{^!J$fB9kvZ6xW(B`?>N#C!tp5M_wEn9u_A%45(Mwhk&^dV>Eg^ z`oJC)C@D8_$(=uB9HOTa&$Eg|KbyX`@7J*J?cwYH`0l9u0rKT1#Lg$b>wrG`|IeQD)!X=_QlIu5 zcfZjdR7`)2oDJ>`VV_*hd{%X|_pWBXQG2UdgDUVy`_mEZrTB<8nHU;yU41>0;wh31 zLw$@TBZq)vvIA;ujBSMagokZ11#lu=LUgyUp$gg|x%fTWQr;4+_j>3>dvugZzZ)Bc zX9-4kk8KE{Td{TCR-lq|U+VCSfX_t!Pq*b1;8AUeE=7ey33YFy?ih8nP=6E{Q5(|d zi}nyp5D-5cpq(oAddXhXs2_Rji7-5^A9^6WcbNWa?mlH~VR**F;Ke_%1Bq9a%-@23 zF9W$h9~xQ7cq{3j^aJGRd?Lgc&qJ3GVr~@Q5vGsRvD<~|v*u_kJna$eb>xd~8J|x) zCp`N)Uq*$_fO*x|$()&a;Ad9!ATrrl>fB%IiORPy4FBG+#MjV3y^R~-S!r`JaTt5? z0nxhDvrkqtCtEoWCKaE0^as2Av-XcJ=4Z!yRFAGEPF!d2h!@14ZMfvaf8u}jE%JA- zMGG4>A6EqI^Gikt`a^r$nX_Orz3qYr;QeoAybocg?Y`)?#!CYWP0YuLfNZwyj2&0+ z?RVbmy6D!%OL#{yAH#Xa?OQ2%ceNJk-`_Y7CQ-h*kiLG#Pw^iY&T{*kY5KdLKK_P2 ztBr4I<0|^{BJ1_*`S&&+oPC>#|2QyPea0eH1%c(0muc#vFB`)4mS@gE=0 zK69TRn15^IKHiy5{KsD2+3NKLT9C)3=ew1*j|Az|&|==6+=2+I9<9Bm?cm*VV=IBU9~jiuOuYAt%0YnQIL?>-to zDNp0`Z0gRyXGn6jTlaG6RvmN3wH6(K=XL2-eX>n|h+k`y$?KDBx^v_N^^Px$tB%P& ztLcBBnR}?CLozf4>)>C8#~kqvZzgg9zf7m)Fp zGcSiu?fa+r{Oa9_&^}jJu#>jjF&z1lemeAV&TxDDL#WGrcK#=J|I(D(-l5YfoBKKE zThf;|$+Idu53RTREuE!Q*2Fdy;U;#omSyNb~~F9${?-&9sUJpet-aRym4%HFIu${laq!>I29t|2wfm2Z$YNC2yFKSIAuy!gm0F z|JYK-TrPQqHe2v@I0~+IUJx*{f?}2jBd@d~-$-6*VGbm(9EB!y;vLBgCaxKIMeis- zuHHFH{7@Il=ey;|E2bRWHs$a>XH$NYTW;i)jwXJ{loLPHjq=TIxsg{WM_w`I#1D0) z{Ast`$Sag1ub6V;hk8(c+$}fq3gyTvrkwbp?v%gpmK%A6a^w|L-q)%)SM9^|oADWW zg>vK-Q+}RR(M#>SV#+U+KS@GdIP!{_ALJENPW;e0 zl#g`3H}VSKgX5;0_@SPZ_oVz}K1<5sOAj*t7J3cIGNuf9r3P5lK5ike$TnV&4B+J8 z3%r875<;)FntgJuE1zgzhUVrk^9(OxZ*}2$-A?3j_Pw>>hxC`)my9fu&3@hf_@)T^ ztK@K{jx9xEk4@-Z@)+ zAbnlNuN8Tse3^$FSIH*6NWL5spw-APqBHBia^j1Sr9^Aqu|la8ne=&pT~831<#UHD<beO2_X6kqw2@%V?WS+IOcs0;eNvKQ}q?3Un^ zp56iej`?+WefZ|HQ^I+L@ekK-zUy}$@|@9TE;#r#*MqFI;D2$R_~Kaklz~a!rp52n z+?CInoH6>gw6K1~#ET!D@;AzT_>}HkxB9LjshPnN-kT0xi~I^3)vq}7J|#1lpPU)2 zLG~EH^-I)S&v?dKR?}W@`II}6AKvy@P2>1hy5uqN2EO*4g2$-iB4p#w(mDrYD>%~+ zJ$(zX^_vm3E9&Xv0LB#qreYneU>!0|9pjBLS24z-e96CA99|K|rlvgqb&PvrQbzFA zP;h%Ta!6(+y=imi3 zE0)sNW!NbW(w8;xdTUs_y1OZ-4e`<{TLYXUF9(C(^k6e`)|whmd=CCR!NvFO4#8{Y zAH8>XU9u-0TwJ!hrjGAB@;!aknT9%-bA6o^?}Tllaus}OgdcP>fWLZ8I{2`T_XD1I z6a3Dn{N~Y*C8=q_SYAO~u>Wb=S;52f;b>Y%-UnuQRs&8IvX<-C5y!_mU{4_S-4oxN zmLAkM;Za?qHO!^>@4b2-em2aUhFPzF=zarp%N)eU7Q{c*{R(iDv5#j=F>v)$`mlDU zC*F~{uBDIb=J77De3V>RH8najvup4<;+j57^9RF8nZep&p7^?_JaOsl)~%x7Dqlpr z*VW7+bEW>Cp#STbn@*{nf-eV%d&igIxyknPnkPN+tNA9(noPQKc<|*Vp7_hd_?9sw zPaNJ<1H9D0$F9B96aNrD{>#1w+S((8? zm0SLxd~9F7(Gx#G{+ybx`F4gCf4Qk3{ua6L*G`3wq33=J*h%MC_fl5$Q{G#OPH=6p z6_?-Nx~1gHjugZrLB_cVJUnQ{-$~5~hS513zQ=e*H_lqcd4A z<-2uh(XsHx5#VVbb6C5MI-auP*HIoJmVDpY&^=(i59`>ha@H+U=83N-ZcMza`Gz%% zu*Q*j1#$DvOyCQ62!T7>Q+>ft_%71IoDb^Y8(E@4~ax&IWcvn}|2%EUa}MJ4HjETlj)lcTOxm zDT~jYiZ3m(ZGqdKn3940BmK_WyXIp5P#miGonJs_8uPjxhHo(TRE^ECXZ9wJ-DuX5^eXdlP4;YaQ`*;H3|3Ma9@{j z-^%^EgnJ+Lv6h9<=kVQJgTLq%E5b9mCZ=!bt=y z-@x@M=lVUaS2)+Zxqi~QZsPhW=lX4~(+lF^8TR?jwPnE64d~S^;*=+{cH8aT8ztkp z2DcVtYgYVQSrW2YC-Pfu&5ytJ=7UqRv1NTar}i#x20CQraqpGrpQq4!Pgnk<4AyOXv{oaBZHJO7di)ZyX9+&yiQq{ zf_P+<$KX|DJm<(cIk9wIMqYvZXYu0%pWY(J!BKw8_(et)#8ddMrQKTKUE`QREWYY7 z&uO#vJ?S;Tw{->a`(_0iL)d^S;iV#V1@XJMzX?8Z0=!pbJbn>BwLY7M--mRbT;F*F zxg#=_dS{h1zLaKljetLQ@=b)chNWHPzlZjQrVaDo$M5#Eq5duDBm95=MUU+7e$g}g zzF(e`eZ?;`v$u>I<)3o-6@Ild8y@lT-WU3ZthS22BThE5yCA-0aGw93S%Vuj|KEA6 zEoB|hnN?Xuzo%Sfzvr23X%l1gWl2H&efYw%Svidzn2!i_!_OL(S=N>aH2*{X7Zdxj z6JF=>-k10f9h8$C=5q?d%OY=U4DF130P^T?P)u!t-p0*STHa0Yfv8 zRSaAuz|jn7k`H<`k9XYsad&W?4m@ey{)9{<{}S@K6h#bdu$LoyDc7s$^Nmf_YDcn_RY0g=XY0UrATuUbIMSCIE+hVO3@a%Ga z-TCFS2HRMJFl+m4`e=U^&wf0APUG_QG5$ULcBc>bw}J;{i+g0RTHG^xPuV%ytI9I7 zTfu`Zqw@Tkhev+xDcS~oX@<7Q-+X=VJpY`_Jw;*W&*Ays$!$K%f}V4e^!lT00Z?0v?iC=ZBfsx14#+^K@(}FZYm3gPbJ)Vjkx#U`dZ71$H}iZQ*LBWy9oI9QYv{OWg?VQ;*EP;HdsqZs$2@2M%JX>x zv3Kxs1Bb=m_}> z=XxpE@R{aY$w}~Z<{I8741F@!OL*r-UBf5B%ONiX{;|c@g-PB#awj?});gR0rUah@ zS6?+38%1b)K|BJVB{dz zXL>L1>CEe1#As!6#=v3r9WV9B*LETKHx`i-YvJI_{h7o`%6M2y-)pT1 zGae8ACgW*e^U=V*HWGYXb1(Qb3cAI9R#uAr515wyPcpmurCbf-W2*V>u`FX-luwXk z9LdO`KatAyIsn8b6jWrc+$$upH6Db>@{g6`ma@< zbff<&W}YqbI3A@R*Ro#u;x}k>F#O^W=z?hTamFm&Pr#hB-NEF~2~w_{i$k#2i`KsH zypwM1^&O189zTNM`Pl1cu=exO!5IA!`me3hkFi(Qs}1(9=}yi;Q;z;?mCCV0nD4RI z-^%x!-S3V5E5qo&%=g&qf6n($yXEM=%=h4c`5t@y-D=;}Z=wG(?L+^~_t@+2Qu}T> z`Y-c6`Y-c+Kda(Sz8~q98~qpUqyIABW3RtMIS<`(qyJ+3=)cVO*z0HV{c*Q{M*qe4 z&}8#H_WIlS{(ZL`{g-JU{4n2Rub-y&-EyP<;(PY7I_7U6_WBa$zo%Pn?DeTe{{>tG zf2rI&^v&e{LH{M1E%m?q?4=CE4qZo!)`dul{Jmsr0mhP4-vxSy?f~ zE65+KAG$1T+ObsrWtVTyzuQ+ra{_&`bzAg(m z@`3E3JHS2J%0myETuw%}^-iDB{@1#Zciehr%93NXciqSS_YOWwAEPsdr!YFNy{?@C zoIk%@v8r}%haL1^c^8E1!ZY)nJQ^UD592?1Hp-Q=wS-PqE(}BR8OEtmH8H@QVMaWd6YEC*-#s+K#Oc zeBS5lWa7SL!w|g-L95|G&JJZIHI!i2ldeU2^lWtMLGlTP4k|{gW2}-rGu(sz(l--x zFqFLtdgD#$7z`1Akc&);Ow?46+CG@x!MZ+2?XzE2c9CwZYp|02uYmU}n>@r=5aX}w zx6K}N=gymmnS;j5hM0~HT>OO2Em+2UYae+OpSiGT_}kJul6d+H2&U5T(<{jo(`&=R03HIU`bA4>#^hW6yJCpk@2Hm`H(1rd^rM(-AMJK?M^WbU1 z{M7av*cA^foYkm0l1rx>dtQ6z-45W4@)D1uZoT_4dDGhQP8GS_l6c4M^TX6x`?`I0 zS{ixfYLB7|q2FG9+W)*x-*x_AE;L{Lejv#jzL);Cho8#xT3a^D?w)LId4d1ljQ<+; zka3(lpnP|?FsIGxBkSs6OgZOqRx$bP%J8onPup+!+7k=!H}A^!`_F}o8?$)N?0vi^ znys;@KFRK?^Eh*K4)4eg)RT9}vlj?x9PDwuk&o@Tu3qxXX_3#yXZW%_1wX#m*EuGb zk={7B`N9fvp-5-E-YU7ELN;sVoeI8=Zw@$P(Qlo>qF9)N{FkxczCq47*)w+lYj44q z&p<~iKAkh&d&H0zdJBG7i!bP3H~J?#ZdZ+!7=wIld-9DO$L}%TFW_H3bmOmg`pvi5 z9&bzeb;>d64Yc5ET1%g@J)V{l_Icr;{P{G$rvK$bT^`u(Kk%&nPo@9v7>#b+I-eNq zljFRBa*fq_=W*rU(s|)#9?+euj&V*MtHCY#GP{0D_4+p3_FGyFoETdGFe+O>VfyhG zPS>G7&HEwBe#ieFa4b=u&S6qTTk$_~{UQ!yN7c3HLZXjF&S`m(mQk1V>n@#^&qXG7 zT>0P);`eVPkv|yR3Xh z_Rr^LbgZy_x>Ai#*E(oI{cc}F@3XCFzhC>J#q{T8Y<;rNOU`{gFFz{Vp8RQFeR6E{ zQ_kd+|Cao{>UWQAQ2vR*_*B7UUFz~x#cesUQVotRGkb(=6goFKBhbwLDLanx<+}5w zxvOBT8sGWYixchItNw>M5bVHD&rLtcTW7G3pUD=zEX}qLPXtC2>pAyx<=`UM5OdJK zmlf^1+!yV`c*ERlJ+C4*^~&XAqjL_OD0+gvX^yr3sNH3^pD0?*Gx^lC!5X>7+F&u? zYhZ2N4jVQm>^ae9KX=z^F8y-Hk>T{QgSWNlQR;PV?dr!e{E_rO7e2&&f5P8cUqj>3 zk9@~9{ZPL$+Sy}$6nc?3*1vsrW;^|xe>+)EJ@~J7hT!w`Jbh4o6R7Vm8oM*!N8%@n z-W3cwZP&||@3eh{@7(v+@cdO^-hB_-y$!42z5D(eWX)%sc6J^*`RyF8H#)vrbAfTq zdCy~K?*E!^YX)3X{;y%p_c=Zc=QAg&t4wohF>Yr}r^C#nw5e|o|M^5w zgVVn`$4?Y}!nM0DA5*8^8N#`(k0gw9BDwI)975CFcPser5Wa?j6=>VzqD3a3Zz#>2 zgWew)(SDr|ei_>N>K4Ja+7((yi@>mWdDiIXwO8d|+Sr zc=>Bc#{UdE@ZI!R`o(biF#p!{EBq5vu0X%i$G`Qyr0n8*+huPpYoA@VI2rxQ1^(ri z=lP$8H%?=`iTafbrC(VG-i#NGDqxN!4||#_nG=h1+2o6%Sj9Z#!PdbS`}63p)}n2G zPU>QqpK~f+`os61N8P{}I&ZE)~DxTg_Lz2LuGnMX2?^&hfzlP{%B_VES>^Nx6O@iTP|t>!%D zGV&_ThPV5Z;?@TvgTw2GhQgNu14n#)V%1&X-8yjw<3V%=@YL1fwc+WduaG=YO-?(> z1Cx0!{0m9$hj#dB$MF5c`pI9=#H|><-y0YVo>XSx^N3AXy#HAC%$get;?ggK;Hmqk zWSCf%dhkT?`h)Q?DT6LeL{^rqOuW2!sSb*Vp?|WCi`U484_BUKi?R>V;jAic9$nk9 zFfM<-58HG(DQ2Gy5kJP>Iy?jnSPt)&ip~MKzTzV2K`MOTx8x^2xAab1S5u155q$Ur z*1QznIsk7ykoPp7Uy&=hM`@|?@9SPV(CBo;x2itLGJ5Zeg(dKXr4C=H^HtIUb;#cN z@Q^Ogy2oeXj$;+c*Yi!_O6LaOz`Ce^TC?;u#02KqJgN9p@u+XGra6rF9p0A@#wq+A zd@gl~zkA%uzu3^qU9VZo^Lc+Oy0<#o@=*64pU1Q-o>clOoAHuY|yPWAaC-V2$2u^zz74y}vnuN4H(?hJuLeOT*=oHs5TD6)JLHZV7EEirn4j_Oa?WZj^Lkpy5uyB{*!h$L zqiaw(X~naPU$5uC6aEB+l;6VhO8Tev{GO{y^HxrCjaahCMii zmoB1R=}6|F*NKcOjNbvRe4WMNJ#yvr|7M{w{S~5QB5+jzNudMS4>%r%x3ZaYtWmg(YZ{J&5M2tN1>m_$5i~f zbdx*qdC%o{ke}rG0(ckY3<#lr$wM!=Q@okr!psXW0Zr5y5oy@eL?2z)%0;f(@4{=z zFaxjs>Hjg#`RtT=kzYLJxRfrqY}q-1bq-lG@yDf{K~btW1#~c5+u{`5oWSCxb8=Rl);wK+{-qo-c=QRjK7;r_;FkP24buCf7%r-Olk*SmUA%i|8nQZe(DR4qf0qvJ zI!JuOwX`9)?*I;`0w_7q0e!2v40tq`T{(-xYRQL=z&FQM;Wu?$I$7Y;Zjabl=2>$p zUw(&odi;>$%F2gVSlceCcyGJ%855h19H*G8Va%oUUYGMP`YT!G0C1uBLecvgXrXA4 z{GP5wA8dTJ(Rb~K2k6Z^lJ(B#T6ozs%RY;>j(Pt#)@LMmp?&FTa*7ETr6bmURAAsk zdM|V)(8Fc;(B!c{H6xcnuZ-?X`kmg?`SROWZs~+>ry0L>*=vNO!dIgY0#5QQugR&O z4bBy?h9AOXWka*xU>^4H>}7HjwT>F&Ki200{}AB$Sf8Q(kC{L5>+byQpUnI;k1+G| z81p0hs#}(uGZMel%M1?vMrFu$D%<-|`IOx9%PVI0C0Fv;E){`ZzGzLKP8DmI*CQjX z=>ATg=sNbq)$CoNJa4={;Qg+09=f4@Ne#cJ9?`(cVO=U7V7_1EzLGsm*LwbfQ~o>t z*HLFJZOVV?$YuG_{hbSF186e&T`n?taE1xT&`?nj~`ySLGKM?#Mm}ZuSQ@ z<>MX*OdlCwZImZ_54@%3u^5~yU|l3*N*B5VpDX3eYlc4+9xLy1fAIYvza2gM`d?2O z;2!`#;#Hdi;A6m-A+$j}QiX6}1X#PDNkF^O@-DIJdX478-It zvV&-58Ee%#E4NYfM13x^JS`uwhU%l}wsb6qX;XPuJgl?wR%B4OtD9M*bHNNeSS|lR zW>WiFC(#d`6JqaoqbfvOq|@l8Io}7pC;xFja_aivIkoT96Nf9_x7LRa4ZhdvSUzPM z<00G;(-V7F1gpULbQAaeoNgM*BItl`U9PN)r1bQfW1XDV=M8L>F8^f z3*->-*y>kD#qoZC&y@Z*6>tWIhx5YVfzUbHvR?a^7V$Mk-fHLYI`BN~FMAhEH}P$A zpd}vkN+C~Ph3u7QF^;Bjy@S$~FGE%sMcI64!w}~Et#;O(qS2xu%lNtTI*{?~Wln`V z$NG%&{|SA7_I2q{UHUMXc@llNnEx>FX6rJtj9;f5VXhk6~C?C}whEC|*u#V{Q ze1UEB6}oF^g+EF0x1;|D%2aG zOR^^S%1107=q9d3%e6n;%=Nj<+xkAaX8-sV_kvBqVSxRx4BQQ{uN3m`H8&HxHxgTp*s=hdD8H3iSNQ*XK|f&?Jneyp_V99?Q6-q5-`EBX zOsr%bRssVnfq{Jb&)ThLUDum+ZDvh!ycJ#PyOo9yE_48z`9yp2t(22nJPrHzV07xT zi{Hv`FE+;r^gy)hcKSb8yyu>R_?#4C<>{~XwkGEOJ@&he{JtD?iT}6kd2!lh-am7B zPsND7BK{c}n(;m%`T_mfrMfGruN1#Q@sxw9KbN*tFS19`J=7^#UFRW*R^H9}?soXg zuW3U(>04H(rVPHZ_wO#T{pjNZfmSy}L7q`ww!>`hTW*5Div;6)*47O$)j?qO2k98P@)ivfeACn-zR*{j^5jhy|RjqXRW5b%DVSyii^2^D*ZZ|fGTn(B>bu?|(xodmBv{xM5HX`U@{}4S@8(yakoq>}= zeaXOITRYC$4klmb1lCmTj-xH{;^HqvL+3i@%+GC29&tVGKh975=P}mdE9OajklNN7 ztNoN$M!>Img1M}>X^%D!(6+{vo|0nr!9koARGNOW9r1A!Xh-q2Wz?Ss3<j8er#HBTjNjoy_9DW8!9&eS3h!t=G%va6HMJhUrO#S(t+zWbm8^r-TWftD^WTO8%zrAp<-_R6l~bq~ z_|Hz5o5VH$i1}_NZdYyGOB*3@n{#;YR9h>lcbeiH*mJ9Zzk5{9K75z{*`M#wKX`b% z{$B#W^$(9TTmQh(Ed7ryjNhhzVC3ieZ!L&V*Z(m5P54)ys9SWuwIKde{r4!0-^~Bf z@%i6ppyhec3D%}<-#H&xKZb5Qnp_xv8@q-}e-2acLFyemYoPTB=sEoee<1r#s)?B= z&Y;b{Bb{ein~lfuo#C1I9Qgxie~=G&tK|(e&pDx7CY?W}KN0FZLYw08nTII@@mV?m zU;o2n&1kb9?R3Vd^JhwaVig6zUD=Ps59d>#V8+!&3ihm$?iCXlr}1->f9oGlwE4H5 z;){FqRR3SiN9AB_@YE|m;Mh=4-1v64aQ+Lvw$pQ`wvBY5Tmg>;Xa%D zriA+*+`pZ0pT#}=Q2-x|y7BnN-z^{Dc1`<<4^S>x@=rC@UCndwKY+haT_4-uIM$~i z&Sr!TF0G|`j8zm16mX_kGBnWkIj-h<%{=xI?w^GhISfq37)u?`WE&oc?qN1%F~(Xq z0Q&%XK-b^6E*qM}z4o{{&_3l)*B(6^-ALtN^iaS?Y$$O6;6~Lb;;+V&pYKcjOMBpR z%y)J4#rPc4?mT>tWfS-`b=d#X=NNsR@i~4I-deuEbt@d32Kr0+0_Wjx{OBNfXy~tO z8Cx7%#?Arw<1BIfjnP3*=+8ZS5BkY1b-?T%-YbKzubZ47zfbjM;X6w|*Y_FYe-NJS zkHDevL8kpPwJTe}&hwautMiS$r0#X<#!qet?J9nyn7R*9M;?1kKK+wDrf${AzPt8@ zN2%j|$KIlE>mH*X`ujKM+iiaP+nDoh5#!dkdDwA|^uo{D8Tap%WiRD9`1i zza6@v*qO);-Ui|5GB5Rl)9S17Q3c1hVK)HtH<7|BVf#G}bpD)KA1@B%Ix!Q&=`KFX=ELozLUZY39n{hyEN6YH`z4R zU-9+Jtw(_w z`K~J$^`9A2;``~p<9*RY-VeyPUU1KMMis9fj`rc~8#X|MVXTy->VPkh??5D4JU)KAN_}!g(jr&zBrp~&jY}z8) zmj_I|!uxeko_r>|Wh2kjx3+p5+o=sJeJkcrkNWU2>w9`1l6a;%+rB*o&T=Y#=6qXq z2AHj4Oh5c>?}|x$`@?gVTX7ZT8q+e`*Ek;0*nnx#`=z=Dj>~}K2f0=(!GpvSM2ICw zB9@ayedI;2tbUVa8=>)eI;gBy( zdE&`)k<-xQICXU)M{t_a-6I&Z$q;#M`up~V$Cun7eU9wjs;@kBqOHE{g#4GBOL@w< zfM1Z4=gX-{$fE6{@j(0NH+LsTzrmh$WK`N$&jjU4Laf^J8yQD3Yl^}IcMLF3VZL;cMKx&DCq z9azw~?Xn#I(bPQu(Q|VAkIlZU@iJn0@_ap8D$ynFN4DQbe$>$0`3>3Fu5+@iB6ymL znY{DZZJv%_`1-|`U)3)dPw5)$$}fcPX$I}yeyg|RRkV%X`-u=S${}oj-_nP=VeRLJ ziY?!9sS!`dI(-+PA z5!oK6@{IZZQ%`uFvi$fod@?NB&&4NWzU;Aq=F!jcYklwKNqGS`p2cJ2^3YPn5bD!%lV_TC`7fS=N*s%SzieyZ6X4^11fynZK|(c~xdJ_tK3QqfeMd8*3iR z=lrX#LFKjEFe8K9Zys{F_lj+tdKP)=&xw7>nr>QTkyExq>;Z57WnQl}qQombz1{yN z`tv6D>G{}i1`hF;1Cu*=wv}fgV6ru9Fnin({<((!XnY%iJ>@rjm!EQ-uHxLET=ZWX zW=xD~t~O4c6y3Clb46)aeQBhRUifi+yKVM8BP|boSa?sP+lLtK6)P_*ZLA_MD>>v1 z+-trzP){x8CJ#FQihuUdhU$a=tSAXg8(9v0Dqh5zreEMMMlYIYbu+X{z79I8;%UCq zIj5oY>!UYguM<8iuS1v^=MZO}R)SY~7V%%7kgsgmRdfHzyxBUl%rolDj^2>}-H}n( zqBm<-aepKBa{3bn_Li!h;AH5S6&ne>3uXm(m6XYcSAEdCDx1K)=)@fIO!elO^dMhi zA2j@CzOO)pvW~Yc?XwW}vIoHwD-g%=_h+VHavwaRmNAb$t7hwOsEV zpdb29?{OVXd{^)N5AV6~*Sg*JgY@}0blIlQKIn7G+z~E)=G@i4E`~m%cMq+z8Z6Q0 zu~t0Cq0f~!rbk70M4$5+gU%Sxn0Jy#3>sxG7WS`Tvsx z9*3Yg_y8JuELtp@Jj3h7hCjeBdQ@g`{v=&4o824#Cr`@+@ViX7JXSOdKjrRLk?1n# z=WgcWmQTy@Sg+6QCPsR;v%Mwztk6`C#GhOPQxIds|QPeRzRM z(Wg)_HJZcvdPTF*3o(~ZgwO+ppn2ptXrY~=5NoUJlFs&=XiP`YeTR_wMSrg)Z@1{R zMf)R&4bb@Z%x)fii$iRMqwW zeP$*Jfp9fIfFPNGiU?FKSX3^VNkFU$wvg6VstHo-B~rC%iy9<>p!{m|uOledw9QPe z%s|8zLL31Tv}%8i7X({dZ6$z;8m&@PIH=A0`JPKMiD>)w|Gs&iJZH{1`|Q1Ld+oK? zUVH7*>ra6veR}LOT!HQ@EwOcO3w#<4+<~IyJAQoq@-7__K~`J1|4X)i%%IeqG5wie z+OpqI>q%Nm;J2$cl*3Fi=f)YUpBt@x zLdPGs^~O2Qx4_V)H?q+gCi+5g$#(hF&_5_&O}%PUI>RdC=nbPa)rx_7lQNyYq3DW~ z=;!60(1wy+^T@(JtSh8OvpmM(qf7c?&-KHeON;&^r~gvrob{nE6m#k4syLo}uD7Bq zveT;`jyz?UGdkmUt<>)p^3N<}e|noQUQ>!6yMr7wz8SH)K^`+%b|CpJf`ch{sbPAS zshPgFjjh60cIjn5)?RUgF9`>BULy~Eq;IbS(Uyk{BuDMjDVm*g9+$Cq^HiW!v+ zmr;Kux#+j!GhX8{cX1wcJ#(%Gd`ICv#LtxTZVBZ#8fN`9T+wUwMO@jFTz@0i2JVZw zmToTt8Tx)o~hAaNx`Ur(M$hWXfwqgZAe(H1^3AR5Mh8}RThJvSa-LtB?oFZCIp zh3^VijE?F&5@eUMgQDSd-ceT14B`&rMZ~qU{uWcKr%R3*xE1cntYnRr=55@E*Luvi`376`@bj;be*qZo`HP*Sb{Avg#*Eo<*0>gw zvyWP5Kdxc#^c(oK!fko+N%U!r6=!tj?mg}3iu-ez+w@H`PO9R3zP{`=)VWJ5zjcOl z_Ov~}`32|uwxYw6(a*A*$FN4vSxQzOP}fe@d7Qvuo#!aKT<4oMGEdCKcF}r6i^o1& zQ0tM>Nzb!}T>l#UV_X)@Lx6W8FbUoXz$F=I$lzb805}oo#SkB8^7Qg4t_(r&R5=W4KY*~%&52q89czcns7=2 zw#m?5FbmH!!0{3Ir1hKr;1EU!Yo6I6KFkx`$+5_{dcytOg~n9HTwlOAYV+YVY*!oZ zL_TEk>;}y>9X_mf;MQ7C6@E{_9qywzR`|dgig*yAedU`Gyndu zN7fDYlM2q{1Xj+`mT6j(ceB_ zGwp0+Y8i6lHIgba)qhLI?kIKSy~LMf$@`d+>DXDW+$3?nre84~LsmooRAQHMj8WG4 z#7B|$v%Qk{3`^cOUdp&4`vDmm0X&nys}>ob242Fi0GtZ>UNPGt3-*B(bNUV>9=#j( zzF)KDr}|r*dEY~RZ1}%@hB39BxuD=zf7SWt-Tl>uf5olm_ke!|`X?3rBlzpsgPTKt zjUe|UI6uekuOo^g#9z8{^hkph+qFQtQE1v z=j)ua+*@{DM^ARs*<0~CaCYkz$xd>Q{<*Z-*6UXPywQfym38&g-a5sVb+>OuCnUh? z(zZ)JZ2kV+xc{zycEgQ+H-;9ilwNW5SlY^&Era+^=RafRO!Zs(NEf{~Ed0-Lar>=w zP4tumd=hlbd!xS`2hH83(=|r9w3ltIF{&pHJ$2)NM0ksXrgZocM>kGH$BakTB_HlM zsyxpD}`Y+K9GJ&Oz`HAEW&Zih-(u4?*U^)os}4uXw0)bXx?Q zKC&ig{%rZwO7@{wM4HL3;Ny8GWy*u5pJ(BH9t? z0juiYa+EXiprLHWnvD+3)E$1&J_D08tu44Sfm^XwqmUE(d`Q8c8RML-&_E0R%!=?U zL30FWOeufPyUatk9OVqBr#CgSws%Eh>Dy z`}v=`+GYPZaN6yrRMgt_hhztIwAjyO7aX8{yWN3Bh3pG-?S)5qt}$6-aqCmv_4ugA zex6now$Asp@yd1ZnCo13Qcn2Y<6K{Io*#FvRnB!Fc&OX~%BgSoZ@2q~b!F_v#=80W zd|U5nPtG5ew+xv*fE-pMhv_P45DmF&U~D;J0*!^oH`yNNPez*xPQ{KAS6 zlng2!Fnq7a4A6g#@JaZTjl=ute~}KKe3dtcw|Go%|Genz!3&Syz&V7<{Y{yU{`?Mi zAn=(FzGM04>|mrCmx}#W#of6wxH_OVfZFg|2@R1N4C)JiWO^>8|C~P z0#OpLtviJLc5=R7;{(*qco4y_&$w#&^|Pj84-C@&-1Le7edeIg+cxIfgELkm~vzF3=FONF%ukspgDa!+Ub;ckx3%yC)WdVMmPS&fkn2TTxf8ayP#V;En8P(L#H2 z#OIYBV(#&QWcvq%+KF4F-rYuP-_XWww(sO5@Xw~4Xb^!WwmuyaiqMYs<~3Bot7n52 zt@=>5p-THLjM%i~W6h%3Jn___8RLybvy*$#?0_$+ZS=JVX8g)`^86Xs)y`N=j+Uwu z(Cmi}%~m@!JC*$`1tmWu#_`|KjCtI~6VNO?QF?DQ^LqS#=pW7ZJQo1(k$~9=O(N^T z54}}~POrV!)~_oWhicGS5%A8wiE*gI!Z)fs98t;b5zbqmLS8~j8EZSGTbLYhJVB!V99XlEu063oZfu` z8Q%9LGQ1BNR_w0um+W40T{r&kU2Dtk-8_@*&f_ZCOT_nD@D;9!vNzyo-S{RuvNy69 zz6X5CZ6lDq5x$Z0&%Mq)x8sZb^=f2KxYjwccN)2f3Q82;|8H2ug<-zU-#c=%c3iXUcrPOcV+N>-Xnv%6Ln}tFP=yShf48Fu>WPVHyTr|IVtOw zvKN}l^Wv@@E}Ody8{9A+THwET!%y_y@UcJsrU{|ZKMgdFSsrZM!MtlH^R6eHdDnM- zW83b=cUYrw?2$%d1vP%pJHYr|iLdtizge&jd)zgEBjHc!gz4za|@n-`L2V=$irT{}Y}%3w}Gc^_C6~>&bm$H4Tg( z*s|%YYwafvMYer$zv1j#8WEcd{%`n3p23>K5S`PS;~Q19AKO^CRxgyE%8Uu;L$n)N zYtJ1|1}@dPr9^K%KmwJ*OjbJiH`@zh=n;VAr?fyqbxOUNgA1Q>;{ zi=*%pUIW3=2c3#pf6wt{TJx6(JYipVNO%d49K$G@h^-O%G-y^~*BGxD`AwXI@tJHY zXnV=W#8x}ss4PZJSK08NjC_@=0=Cbf?-ulx2^>vn>}N-|+S`x;WT^cQ#?)cYAQ!CN z7|ihsPczQ3?781N^E6_eF8|0W;F`@Gc;$uJ71${Y z{HY_`66v311a`I)H(dyPo#c4QBEHa~KX!`f?_r;07#Xu|cRT-P__Cnolbpv|o!X8p zV|=51wXJ!#+QyDt(7S!B?JsE$8d>dWts)mbXET2;fNqPCEzzWPl;~i$I~iN1`XKSp z(E0htjr>|-34F941eR=I2=5D!k9+)>nfx30qH5;?AHJTI^!ruBR^_lyu^pMQaVB1b zu{#?&X>XQrj?fOz4*MU2XZJ3O=2Gui>J?t9%P*fJ?J2kTES{B7Z#jD>h%M?-Zx;26 zmZdIk9rilk`^3K}C%xdmhu?~+5gk>hX!tCBr1nt26#az5kAy=;(9C0Asn~}9fi}wT zIGg*ry}`H#dr|cE8@@Ihh6H{(FlfD8xQVtN>T6*y$V$tRoE%zLz7RO;w)|)C7Z+WiX!oAJFql z;iX;R9U^*WdHNKsgr?O+-LTax>B;MQ@p^AJudf!b(;Z%46EN2ZCWqJi*~jT+zh7ei z{VJX(z<4;DdL!aDZLx3Za2@aowlMnenJtWIj19ln^_rmhq^?ESPr9z>91L9&G;hLj4zIUUUC8J#+NK*jX4zC z!rZzoFJ7Oq%9_tM>YT=m+;{{%lf?R@{7tJrtGz4PNNNLzo9FSq2KXBD284dW`1i;- zawgypZ}^n)4E^NgOqjYMM)Uzs*@AVPEmK)qUAYQ9w7zut-ojL)jqxg0KhG0=ptPy- zU3^dLO1D=2?*t>-`q!lBgQc9!(hxAK8538Pmh7$G&KU^A)2ZJo52tb#w^P@6_@sGF z;PcYGVdnmR;>tCjXFpb3_*0FiNgX#lfJ|=Z{ELGFLf@nO`OsLna28h7j=}T9(hc$n zl@AV;g;Jy8a^|(2%sq*DD(h3WXDRf%gYPsa4Kv2HuwSiiy4O6luys!@V?-T!AL_6% zz3eqDBd>sL72k*W1sp)2UBuyP{9^K96|{_o9#R zuih7AZGK2dG!Tu-C@(sRF0Dg7QPIk!$+OF`?|RYYy?{*@%_$<(okZOces7b_u$MjD z+*iNIyhQarOP_?!f+gGr?2eDVl<{l{eM|9a@&^eg<+@VNzJ?a+eF|F|Sw|;?YMCo* zoFPueI@@|9@@%q>`=fcm=+)S!8ruh)#Myx8v3a{XEuFhYw%j3mTt9@Y_d}Oy%x_7b zz4H$Gg7h!BPvfVdZzIU@=dWd7Ie~Q)_3 z9%}#OA>rn+&-{D~Us{)KO1x5&<3qlR7+xPS1>{lai1cUvP+;4t=U}61Jd;m$IyBru zo$@EkPK_h?vPE~u_e+10eS4a4eJzMBlw#Yg@Wk~mEG70yzEW(pGe$u}@e&*kPgag3 zbkV}JkrjU0BgSaKQF6Y7Kk!&Qa&0@?ejOJ3753eOzq5U>RX*D{E&C83{28k6d2+_+ zY@;L8A)8k9$)2q{8Zb`=ZrQYI&*i`DS=WZGWgJShVO#LqY0Ood+4y>w@L$J&l`q}O zUnIF3Mg842X+P}k49Ax~EXF?LAw_}}Ivw?ns3`D_?y^M-d6$EI)WQ0^=DQ{IvGWvr zM8D25GCM9JE=qk|eQ2>_egeJ_@r&|7 zHFm7pE1qq9QwXncop&{3_`KO^hAiq0h3{BEE%jg*A%>IwQoBG__J~Yy26-*s~u$h`qKl zOluQE4#6`YzM61Lz`Q)oXd@=sntwH+r?#N85`A#$Bl7+2|0XbZ zfMUg6U-C)#rQ{3A4Hz%g0rvuL`uyKrTQj4;u~A#_CAUk4@X6^cSNW9xD}USxd?CI4 zas9pBG}z>EeaW^jWU>LyEj@8w4bHv&agF~1R&bW@$Mwez>E#oVKW;F15B3h3f7XBL zkNYzJ`9Ap`zYJGL23Af)uZ>H?zZNiq!vfLE2h8jCgH+kRUis(L7v%qye@?z%^@~Gu zY=7Jg@f#UCU)PJ#@tO3GX}$W#$IyajiTxvZ1iAN7*L3>Y6l8n3r!vd%ZVcz}+i-k$ zmA-g3XOddJJJrpZ5ti=`I9$0*l-=h(V6DJe8@YksZW+su{Jwqf%I;$BCA;Bgfqifw zTFaPo5;!QH+x6ecZg{_g?-FFU4?HaEZ@iQ!yD15>`;5_N{*Q`mxecP{d;5@W|6P)` z4stblIV>M?$%*`TjIk$N2hnqT9VF3z_uQKaxbwRJyJ^xJ_WH;B2f-DY6|UoiD`RU7 z`2P7(`HkVX0NwB{hWb>&s| z-}%U_tN#|i3XYX|@z%c*pTf6yK@0hp|A%WB|DAzvCG1Oz%V*gBE86qTj$7jm_D!M> zubnjpBYf(Y`tZEuOH_HSwYz>l>zmd=U;2$tITz8BKNc*qcbf5CE`fi|{H7m--|TEs z-)T`l_&5Eh^)2?jsSN$9kaTpJDqxR-7AeX3n*(&0~JT z{N$O`jEbYgV`zN**k_#aII?@3x@|iyCAQ&S4{c_~*mE*OYjkxRJqy(R2A|TVoEv{;ZT@lS zv12o9{jAF?SLj8=gMS1p*p=)%@ml-6jsd&L*mMNH-N(d}NH4aa!#LZ^d|7ME9eHua z-osJ&SPNg1{t&pWbsKWnmKQgcpHsUqc&`^(gfv%6sW-Wc|~C`7-r{I|Jq(u9EZJx~KdLT-R?qwoNkMrf0~)`F)Uu z?*(r2@3dixtj#0VIJ;8*JL%0Oz$Lq*hPIy7H%n|esi8h&`>|$?bJMZYG~ZRMMJ+OG z#fPj3TI<}J=V(1#eNZtLidPli>fm(^GN<|0R_d+e`y|;j&^|)lbrzhMqAM*rq46zn`{kJ8GyEo4k-~_HJzQ_W#Z%-~W8)`j6*!PEE!xk7kg^ zf%;VEGXB@yKP$8$i@y3h>c{T?A8`7EMu`fa}oy%OH zW?9fYR=|7!Sl^y#n2#T!&oOQs802Fw$*5S}IL!$;XR3htUMXYCYxWp3>rb8Qqcsay z%gl(qg>DRIs(vp%#Q<_+M57zgl~n;#vF~q>_eD3<1ekAlIG$pq21HruTzBjnfZXeFNMt7O3c#rS; z@XCwqJ#2Z%Ob}m+>c|e99Wn|tLkFRy;wvtrth*lYd~T;5})09`ddt6y)=&)U=2{{Ub1r!%(KFi&&mXCI(b;E%@jE0F~f;bnZKj8UI8 z@1u^docATvdm;7KQSW~uU$RA9`KqR^|4P2DvE@rNXaG)2zJRCx<^PZ5i~243qRwf^ z*A3vNIe889ZZG{+Hiw66so^OqnnVsY-bt4jCB#5!Zx?g@jT1XLhrw&@c^yl6$xC)2 z=M}(vOP*TOL-H|54*t}L99VTQFYaJo%y@T7X5jc__R(n_%pUi$D~;vDdW?N%AwQ7{ z&JWi5>`AQ8KAcBiF`^Ck+P0n6X05m>hyTCNWvtsCFh@%6HV4cMUFQbOVY>27x~|kW zgzM2%be;o~VxTl0&y!CQdTS2ee);gq^U;^Gb>iqc`8iDNgkj*i1HGp`rpK^hn$hd0 zFh)h%^5Ux*XSSf5$1fjS8L4!1`itlv^sMX`?Po2=hWUv8ew4a2uW#CJn4e-Je9V3A z#Rhhcy&t<_vw@Cr;{u0U^ZO5=qctu8OB3oL@TcE*5z7c0=ukbN!9oZ;x=(7WQHt!WpgXSM-Yu+*2{(OPo z;=^Y6@Fu><1FVyO6(6n=A3AOSg7HyjekJ}I(VDUHCGng1^}{aDBa8ClVd#4b<7N<< zn23)p(uR&=j+bZ$HA;pUXEa`g`y6YohQ1HOr$ge;!Bl+c!!3Tu7TuvW{sM4;7qTt4 z6;CXFOgGF2utPt^cJsk2@l3pO`O?i3%T^e2 z*O%}_{17jirU%SV;DKa7GN}29_|xPa*>+TW6<<-`8gBC?N8^Oem-xX8qaOpq4(2z_ z&|WZx=NjgB$YY`Yd0hfM{GFZ6nf%{&v~!#CL%Q~5Ep&|{tLkrs_=*_g67Wp~yUGp+-_8;A1_>jvRIL35Vi0KOSqWmlfBd+Iuu>$D{L z*hJ2zq91(eMfxzgnsl9wzH2IZ^?~vJ0)Wmh8Jq?kPIJu__})9 zXp^YlXAG+-ASqnQPbToGa1dOYK_V8e-vL z%bRS@!uiLVf1B4o)Wfc&J=bnKXFmI|!9#fY-;zA~Vu^O{N64EUPdpSoVB5QjCqBN( zSm)Zf>#SH`JDym%8MZ)g%igT8ae0rjt{oZh**04fJXX81X$7Zi>$)^Pk?nQ>`BU4k zQQryeTxe&tOZ(zw7#*cKOc^gX77{yr_Ick{QXA zD>v`lXvfeja^&Vw;R0Td=t_H=bftWZ>#~1#HcKB*`iJIc%nNv?HtjMV%WoZ3dHD2~ z1bJ`hgS^w{EqQ0Z_le}4#8c~{w2Q5=TX4Jcss?1)jc=^Gk@*$yO5PO{*nqrNcXay@ z&JYg3T57>S{Ex1bE76s@Z{?bC-v6cSV>^7A>@TJM-m)(_Kau=@S1_RyW%my_2i>~e z9^cM~p6ZX19j!xZzEoT6$TRC1(zRXki{50-BQ_LWY0tGKzeBYK5xR)_E%~L5Vs9pE zNu#V-b@eUDka!@tYYQ-lPFja<0|bIk60@7jIu8NGAl=lOB0SHM@r4B35ati?~kr?W19ud>LI#^?z3wvRp5ynpnu zX33mnO!`UsQnIy1{no9Q_#*Xpo$aN$f%aWK$C+qhY|1S5p0)JahctyeNZ4Tu{P@Ro zos3RemSE2faO}C~iGh-T@J{Rm>FtBiSZ5W;Rx>U8ZFo#}-7sT#h3o>wFEnonnCD}^ zS-vZ541@L3&*)oPb2-l1V-xGs`{^@D#J?&33UaVu$5GjX8pph`=1#@Q4a25loe`e| zWi5SQ2VLajsKMu|wVLJ7Dv3F|*1Fbl2CDp(HP`~O=@v6*$Idw80Cmbo^D%p69;C1B zI0}4>k4O8BCicv>85md2u>DRW@HzSLIVH!!;P5@_{}cInWp_n7^5W|M;?pUP?LB}v zIq^{TnEGXJ+xy$%4TPYfTG1$$P!i zJ@eJ5-W#p`H0Lz8f91FRLR(JwZJPD%Cf8S#^nb~? zA06?%EB>`j@FwfIWPc;Fj(l7F_g;^A53FOBIPd?# zHKKZ{Pi?5LEu&twdx&?g&MJGgbK7D3iyAZk!gIHO&13D^8c#WcUEjQ_chsZbuQ=Zy ziFe)YhiU+BBM*BEM0=IoE;1LsU7u7Yth?_3x! zX(P4{-D2yN>`F_=K<9UWOZ7LZtmq5f1IIfpns4A)gnnb;kIsysFW-eOYU66>`Y6}L zbUj9k&TVh<{)@QVGLywOg6+h(r-d?juXt|3 zvlg5c^Q_;0yqMX-m2O!=i~NHW?p{=F{|%N102Tk_FqZGRn#eC749aR0~tmA{%XLOM;bBoQy9IeL!P<2i3s^Z6Y7Mv6OeeKAY7{mas`5AmJ)qT0~8 zP1&tO@xu)Zy%ROo-G;s_Kqm*ti!fhsy0pK%bDR78LY`Z+hX>*Gtmu!O`C_i~{5U#Z zFwNp#KI}w$OY;i(u4QLwPSJpjXnZ)45Br5#j9Z@u%yEJPA9l8`lo$P_A5Z3*agl8^ zE@d5Ea}MphapxVHb9`ZLaShKB<`s4HsakMU9MLf9s|A)i+Nh>}`BQzw*OcHx%ktSi z)v4%3$?(6Rm2gZJERG+%@avt;dS+PgA+t-MkJfCcOKUifK_~sb8^4RneL@|s97lXv z(a{baKjgXFw~d9J+jRbvWcOX3YiwEWeE*j2owm!qX3OsJyv}Vpk0acM%q<_)V=n!w z$~*ilJiBw-U*!KG##>{Ae8YQq@7iO#8HcrIHHR{t$es3A{?YmVX{}{c1k9b>pRGE; z^Krdv4w#Q|J%eWk_z?kT;YmN~vF{4G+iesM3C*Ld-s!$er}JDo{Q};pjx7#Ny6WiG zGgcildeM>;+($Beajo0bR^Zcqg;-MZ?bJ;4#Si+% z$HE!t>pcEt7amgn8TudN+lCsRHSo`zV+VaOGS_1+Hd5MZI{2OLVLs+D-zINNq}VVU zKIOX-`qdhbxxLb3)>rYnf%pI`uMIwY?6roY*ahW0zmYj?2K}#;-=}y`4Txm!4?_PXZ#l*jPfG3h3WX;wt zQ-2NLJ_U|d=_a<Cab{1~c=bGc zU7CnrR2^lsue=jC(7xj9e@r_yhger(f5o7w<^#Jg8#VD|#6bmrLxXT(g* zi%(#0e>r})H~JbCgQ;hUF{DDcT}OV8{mkKhnUKFC2i%nVVHacPb^VN~yT}W19yrWm zJb2=^^LFg>Wm@@WUibMbSkL6yEcRbzT6tTvN8yRvvUd!|)?Y%~tJy1?sae|O}!C$YDo8z17$9DI^&d~Qj^C&|X=mPCA#DxM&Y)gXRdxqx)e zN|rI$%3%-z#|c(`5pNNG+kDM^USsT0S(P!MpZkq+B8n!Wh2nW#+C+GcA7IbloU6t< z#g$7I)Tfh11ddzls*8N_c4S3;*Lp|4?D5XaUYHEeRLK#s1ov+}(_@z_uVf1A%!)*3<9BVfE?|L{qj{bwsL*>$!_p##cvWc0n#>jBhtJ*&c zexXPvbu1$vo;S0@bG9d6{kWdKG*;gfp$Bfnen|6HJUz*X=5hVwuZTTn%&cawNw}kP z{RYaa&n466`l-*sSK7E)u{t%G%m?X{Z?FgaI_4#{>Av{GD^e_2im}f=#{P)58RnMt zhPiloO6B9t%-8w|ZhtJ6hED#Bc=Tlfb2h&9$fe9hna31RcU?tlboGe9ZPnmrEYGZr z)Oh2y8`+PEju0I#q^@m8$id0{FV$L~_r_K&_g12hSJOiY2b{5x2O8=YxaC+t>#mfuDM2 z-B)lAKC(3xSEl{*`gWy!gV0v~ORt`<&5K8l1moUR{8PxBSG*ao_A@#z{vX#6e5@14K3zqDe_~f92;PJVz_;TaE{=h=J zvQZ0Ix5*9ybDHd0d|QrO4Mu*#TLjavj$khDx7)v0@>}2R(z9iHmeH|M^rIgI(!rx# z&*)bUZ5KmJJ#+D>5FLTvqHU>-N0Df`sGGJ$zu+6>*200Dl+`cdGZY;=96HjLMaPMD z`xT zHC*D*tOOiusP7PQUT3N-KB_9{lpxFCKpFOwUVuL{D`+09$Br##JVc(eQ>Wp_BBl>s zZq=F?-!>gI@T;cFZ?%X0S7tSG=t=Tfa!=fCY&-p3zOJEGe6f62%6($R7l&S?Zuy<% zuiEFe*IcTh*%9719SqP0dW|)Lv!%PCtKgME{x$N0aNX7 zrH^js+a}<3;k00s-w>H{Vbd6A`__E1b^S8gdtt*^@4)y4_<(Jz@U1e;MS>66@rj;J zKWt~ML3H$!=S*}|4x0M}XQ|*aVi9CYuvWLp-{6b6@P)4lSiWGvt#3Sn6S)(dnb1%& zrM1OR`6dI}x?^)U{PLySurH&%B#XWoUG%kR3+xA}V|$BX;{XhjtFm{1`ITT? z+^rfoYJg)gbxGc=`C|>dF9Ij0?Xu8y}=-px^d9+m)qsE62?Y>h`6MM3&OQ zHN#rJ3saB!+62L(agaWD&l|K&zxWgy)n{B7jkX0C<5(w3V_k-}!!cv3_A+mpma_B@ z&^Mfs7k?zD&(a;~UW+dC$lIcQqY-Od^%OlvpOtNpt~dt9)<)ug{m&cs#T&@2$~Bw+ zyn8n+7*jT9=grt#KU|Z$_e|ExZo?kyFL^l>FwbTW*lOiB$0mCuJ!pP^`JA0)zVVea zZ<(|6p6TN&=Tq)7?90c2WgBs3KjXK~j#MsTKlxIWLtFW@he99Oc7w6waL;k9#){eIt&SOMpoc5;3~ z%Ps87!X~+a7_@B8T9K_?z&U^RJLS;IwD!mwyeqhsJiOL7{vFfP&L1OK@B!s7?~^oN zFx1fgD*ip}nM;K47GTQSckYin_s#fmR{F0mE$BMq-ri3tn9jn^takEbl>*ymX*uLp zo;jwpbaYk@IqYOFD_^?{qs}7iS;mI-J!;zW0+yZeUT`9CAuypNr0Sds4AY z(>we#J^BBj?+Tv{?70r}J`vYaY^rdL9itZnPit@2lAe0O|9ieeFSL$y^a6V6t~&HW zxuX|+xwc-Qk6La_g=WxVqq{v|;OlZe3e* zFktK2wdgYZhc(n)O}px&{ubcur3>74ucR)0Yw3bY`y1DW=zP1|hA^I>j?Dq{o0NBT zLF-PQ(bjC9Svp7e=z=mw7tE8t4PCGmJ^GO|u1F_ruT0Ph^wksVgq~~q(`Z9FL2LT1 z{yxI`$yRh|nEJ-?{yFWxsmYCp$-yR_H=bt^+LvutEqy?LR31(3!Kl$-q6lHfXA@ zt?*iOu+}Q!%@q3oiR%BXwpabHh_~PhpZ>|a?Z9jCs|f!IxJj2=>qpSyet0I|quP6& zvf|a>biG$);RWRdgK`;Y{p$$x+FD>-k^qZ~=c|GPnk%1yi)$_QS+G!-VilgI%wI+K z@wQ#E@l13ma;&kwu%WXlJjm`dvQaGC#2HfqF?+p1vcHo$ELtHul39P_v1Z9{7=3O; zJDVfr0r~dho}_7&Ut@gsgWIEgBl|`2=KqW`#gxIWQ5k&~h<9#tVM?3W4O46NiD6>w z>Im0$=4)=M`X5TDztv!!@Yoej*bhWvH<2^lvLAZm9OnEP z)h%0~ED`56_Dt7;Gh?`5FWd+|*cM^z3bohatV0y@jbvFktGvqk-{*>qt6y0%oNiw) zbny6*+YWTUl4nWyNv>jkjvrz7w~&GAiFxtg*yGoNrHonfA>7E=7GW%#&)D-ntZDY` z=cyRUye!qz(|_;__RK3+F;>j%)MvyIe>E13tcxb>6-e@JRY zF5}ILTW9SkaQq>;lvB=6<NghYbe~^tYq{=g_s1UyqXUYwc4?yMgp4g^* zxBTlomk(F@)rI5R_?2?e^}n{X07k0DdS)5Ysa&JY%E!do~C$JO9?9XO8Q8~K8S<2w!yCxK() z_-*sEzr{}%-%Hrj`+e|zy=2l3@|#%xt@GGVFMhsWa$W*IlPX?k{Fc2Y-_8VU%pGCn z4;4QX@l}6w=TO4eEwAS;KfT}@e>R|V&%5xw(!sSB+#YKSnv&aWaK0Bj6`S%4Vjw56 z|CMoe!T(!+&MHZiSDT-+N)qL@Z^bO|(^|dDA8ZOsUjOX1@iU4z+uGr$%IW==@l*50 zD)utHHwry+Y0!KKzuu_Q@s$QK0J0HB%64VlM0T0ye#TUEt;*l6^5|Os&%Wq?*rj(l z=mN_plG#y|$vr+A&E2gz!F1lqFXBF5)bn}Ae%e8IONR|(PT9g(7x{_&h3MQ&`MvOs zpp(-tCD%JJq_fA}g>mtfd<(xeEg29x$XKIT1$%xw((+H-d9o3`W3ne2V=k=oAEU_b z@;C8!Q9gz)OF20ZO`aT#>ddVuyj7lsp$6YhwDG>=b?Qgowl4mnzhI@_P3y*c;y&&Z z@t$Ji%?2I&xr?{+JguGQ=x^aI981AFSkR5P#xTwI3?K7(U^oZ^ZR1E z{5;Wu`HcK2@AF%Gi1U5qk*EoflL)@aHetNLZ(gDNj+*l*Z@YNh+OKj!&Gw-A4f?B* zyWuA~A0@I@aiD$K%aj^ZZmMIf0X031>wdDZI!<}{wk z-q{MTl_TUR`JfaVGmSEeF|PM|E0n`19iONm4qOf1gZ#4Nu_{EqTkZQR0Kuo;^NnbO>ky$Lt_$z`q_ zIl}LO+2bwTbT&)f<}uMt$eZvg<6M(n=(_5AWiJk`h~YQgQG_jG^ly7GIi+Gl3BJfR z;Db*x4|rEGuaLYiW=`Kwi9ACO<%4WNt~0>1U2(+AZ2T2d7B1#Dax$EE;tzAY&=7Q} z?8M)eddx@5J?04fi~+_o@#RzP7lF9HuW9UVa5O7a@`J{=jxvSqL@GB*3@^WvyVRjY+4T~rOXQF zT&)&zN|2w{Is;}bb!AiM3if|$pQlw1`;_J1olJCO?>VemcO!uKkx%mK=HlZ^ASJmAZ^QmSWU#n}Em>qt#C&Ql$n?`YL= zIx?pHuxi8lzQ6N*KO_Hi#=NmZdwoCH`JQ-r!EpMBUf&OOz9$yWYJYUE??*V_6C*d4 zxQ5gHy}lpqe2=cM+CQb&_kQPl)|agBPw(~pDbDxU9@h7hdVPPo^F8ureScQ3?y7wyja0ET*p^r(g=}bA-#tL7%_+0wJ zH^~3;7;8tw;f%6;HtcaN+5o4Xs0MY#hbn8#K*S=KwnKq!;s!BMs_}Uw+^WhG# z2DF&-;mCvD&vV_Rb4&601yTdIS@>K#>0IpQP!;mF7%hD+8Gm*I<2EqX0oPReYc+M|bIzdrpX<=) z!m+TZ_}nmO%eCKD+;wKtRB#wjQoN%-XUjECm^>!Tc}i#U> z<{0&T`>eUi_L*C^O_9xo-XGO5fE-l9<>geDq zJRd#SKlB)5$UFSA7Pv<^P7yBPpn6AMZbbjeJ9}@3_Ve_ODPL0Ra8FeBfCod8=!LbL}FWYuBD|uH8prW8IaUYnR3UO#XY~=^s;i+teL86R*lU+|oUp zfw37pl-FJRMcy73jGEsMM4NzLGEqmnZ&Ih$c@FBz^ZmLao7Lz=>1eGNC{M9uPkT!K z%zp`bSg}9Vj8WCg@TbGG>SD%T@Yh;}HC7s)q7L-a0mjj*iRIZe?SiF`iK}{_^WN(PBeD~w&Yc$ocD#=4RAC!@#{W)a zr=IpZC(b~AkfBV;4(E(gVjcLRph62DW9pa8>*ycM6@E;oJr#q030N-cxpX0;YXwZVzH}1KOu&upic+6FNl9 z&_Al+9ezWtB^y^7Q-6z{D!~YK&-`=!t&wIZrelTk^th8P@rku8&aklz#XKzW5B~868&9 z$=RavK|V@bzoouD!vj(6FHSon7(IPKAUfd%;B)4Vk?R<{=!?Qra}&Yw@8)I0;hW|s zngOI#)$kzZQx47D`DEGu`D&UMj<-T z0W(TFr!hx5l{r%QHE8b3{Q}Kv#|;Q=70qc+^llctU$g10dFmEueJ5~=)^`AF-BZjt z>D$|0_C$w4bH(~^IK^NOqr1N{Bc|LA>n)mRa5jbQe;xqMBeW$RYL0OlvT!Q0aN#L| z=yzZ4rg`=i(44t}c(-lIfKW64f+vyg&(N2i?$wtb+uym~?I&*`*KdBUyPuS;>CD$0 zGfX|toM28_2&{?~*4$z$_-rj;J_0Se;$0SbOzZ3pVqFqrTs-gmYg?A)if{ibAKmfN zZ_qRH>qou|4(OX2{F90?n1(*q^IdwL#&dkNdcNO@SNtaJE1p+<^a6gnzG|&g3UB$F ztI?x}q!YMKrHpjm*SX5Se7*D&dglnw$|f39)z{Sb#5eIQ(QoiIzOi-AFh}PMWq*aO zbFP7g%F{BMGV(3BGMv)OzYzSft#=d)uXV~i=E%#4q4@+Ekj!q^m`A_)2pixSb6=Bl zus_w@mvQK0Us~+M>leeV^>LjisN5k9jJ2{|l7YqYb(aK8a(P$OgKq=so%_RGar<8Rm43{BgwByPiCZ~70(bwj@> z#di18H#Hain6X^4T1mUTeNfUf^0&L=N&C6SnkVe8t7!v9({1N zGd3iCUv~Df=3ngX_V4TapY#1lXsvR>ZyCI)hhBAzd!FwR+tyq)Dkd3R>x*AM!M0Cs zqOBNZ#Scr~`St?jdJei#^a)Hj);x{>^N?fhcaBn4{HVug5m}GS72}&w92$OwbMQ~d zSNx4(wqBe#!4ut&uXs56a4YS~K2{za#e4j@pK@6av&NwX7N0o77XD-zL#@4i^-Hif zX-j(X8$$!piKhpnihFA)M*jep;(+E3HKG@9@I>3kE3eYX*i7oNaNrxoyY=C_v<=7? zw$l?9+_Ha1#ssqo-vz7SJIa`gU?pvN^pyACxU(431ENA znoFo1_S(^|_DzbG$FV~s)2E&pjGnV75RE~@t;kygc&UHa(YH6!P8xMe7fIi-07SkZ z`2g9cRm2`vbdk=lHh(Q$H!Suu=@))0W<@$PBTQEV`oeX`_kX*9)KtE>D>q1z9aeezuMVchrCA^ z6Qw`27Aak;aaVd)`3}aRBcy9AeSsbshK^Z+-^DZKgV^08QH(fGf&tw@h#IY0en!>RR>FedvZp=902;-T@ZnNsyiukHmB7V7D(O>c}+=aXXuM+`)T^4=8NY5|2EodroQd)TWz>{PyIu_QjHG{3G#HC3qS8HJ|P#% z9Uew6ir3^y30%dx!*hqTx$DV?FDPL*L|R`W%KFzGbgb5-lHzr z^Y*;Uwt)nzzicU&j^ypjmkt(Q7l2o9 z9Xtluze-16FBrZ=4r&Aga_~Ksp$%6Kegu84PM}Zgp3Z#D@ikwO9NdW<+|f%8=2C}f z`wZ|uodEwD^{MIh{-SL5DrASphcw5~9wY5v_4CZ&tnpVWnbS>VJb;!~Isex}oNeK} zKi}Gu^a5qvy;)Y7va_sxj@tWZ*K>a8=@XY>9O4trR)vEE1TIMI8*&+_5$ee`yuww?97lWgF`6aTjo{2TQ}o`(?`w>rF?l=i)R+Cs9P|7 z`Y`q8B*<*ww9pCb4V)VK@XO0~*GoCo`zB?TH&6J9ZrSbQta@GA8I*Hjf0eQ|YfeDB zvawxdx@hP3hhCukSJIB}49Zngr`mW@a91Ya=+8bej(pSn5Zq?~ZvWWn(j^3giR zfxR<4#98*Wi=jrp}#OLxOC{k5n1`RRrgom z$aj*dYUxzw#u0AQpWO;W1HNG{c}ez`zIGzzATodA2z*_@F#uyc}WX7Gd;1- zeFk$mZ_GQpY|l*U_`GD-hE`v}pI1)ueW)^e?=PHfma%R*f%kfzQVL?7KF)pq zkn`M_W0gPIeQqS%<#*fVGu-F9lT5e0EY|JZ|4v`(ODV=fdoK8T_@AGbc%v!A!F*nB zgtYfrxm2Dx_eNq**o()x16vk)q8||pt2sl{A}_hVlI?siOMKDo#mUh~C3?XiH$gG$ z$(6*0J~rF*?wD;V{_eTE?L6G~=*oR7F+`$`@y2X3_wCulU699NwdK1y{Cv4xwy?s; z-#|UN=v?;8?YY=6+WPs7wt&ID*5c&QH9R}S@AAXH-jlL_wwVVGNlmlO~gORqNa zpG+~n4P9>j<_$)EnPNGK@z}M(yU??c{l)h^#s1w9F~w_iu6bg<*5f1i$oaY8pQE#{oA(!g5Ky+6q~c7JYa>%(R2 z%^ZgBx4;mY*1mZ^eKvA2@^ZDYwUEZH0=|c?^hM{;_Q$?yu_auypsngPT2Bdi zfw$T_y6uO+yb3&tWBR0G(06Ld?qh3 z@>QqsNdce2(&WnA)TbZLGEzD=U2o)9K_mIKhqhKdtQh1po~g}ha+De9lWO+N5?k0* z<=|2VF16Fy7Ysfpx%gC&?*SP7=o{fwcAbsW)!5u4<64rNP0Y{UL`h z_);druTz23kB$^BVfe$@86Q3bO#|{Q~jE5y(GyRD)Oj zRQ?C0MaOa;yI^nrn=hIRopXV$3Va*yPKrLhH92bRoy|GcMpFTOKES@T+A8X6Ain}I zsm~dElPs9R<>ZE_3h*vqs?YhqZEW53uhP9`!0`a>6+ND3zKqW-aw&V9pUES4gJJ&Y zi9ECHbi=Fyrbr3%C+Pcvk=FJCF)%m$G0$8-H7Q#7aGrUu$J2K8gL&o$JP$84%%9Ib z)?CKA;ik-#=*Emb(aqC2XA77f1f~dc=J3UWFy zV_?Uo%nSH_ZZtxSgx|RIxIr9_aiNj_x7&wSzVDkF6K}lqm5tOFE@f@fGrDd6?V~F% zg?4%1v?((+nhnk9$A`0_OWE@KFQ(5Xs>6qj*@`r=} zifwu3WcH(d$ePxTkK~y@{#~B=$3bb89^_-yEs@7MJ>HH>rlFg;rg6>ncq>|nOKZ6` z+d9K)pV!mzNBq$2;SXKp8NnAmy%(j)R-^_M+ zSigBd4<1_lL#NE4Uk?#%;3%E=0sO1q%y}y4kTCkh+Vf%2!PD^^{5uT%s{bb6po$MZ zUa@z{@jSB+JPe~>1}kP4o);QJDyuwc9e0a|(~dP?|BpQL?bN{)@A&%1mcEr|Uj1&K zx!Tju;-PEX==vo5Y!N@dF54oxqd(VG#Q#)rUUinkPsYU#t+`ErcdLzlmVX0#Mn9cpc+{_$HkzzScsAIN#S%zxcOt%lv39H0a{tlz~x;hv|dJm0*~^RaxHG zPnjRxn0{&0j%$H`1z+Uf!-@Pu-)-dkqwqj+DK(x^@NiT&52p`C>d zvEc!s%ifzE{Xr7_&6m;kICY6HDr4zG?S-NbsXr~yGx~?sZ!Z(QFF)Q&%;m}zqbj|O z86TtX!sW!AqrVb$+IP@%m!qTS^SyMv^n54rCH;v9{rPz1Z$=03{dj)>nFyE{y-bXO zSLYw%6Mc?z*po9V=j>*E2zn;5Mkf6v-JFX|?=!p|&zu2dBwf#IYE&NB&?qJ|rJk|(Zo0}7oz8<&42n|PP>-RAFeHrcjeMO*=*e^>4 zUjIq3aVqjOv(wkO@8`LVvyLP+{%ut2%$zgJX13fGXq;J`(zyNS!AAeZhM691F?urj8IEJuYOV9N2aR>u*k)^%ZOa^GoXw`ZY#C(m{*~Bj zvNvUerQ!>pORlG+@aRwqe#=yN;VT>yx5|Uhpfo1> zS%X_=`cDs-e}`84pw+3+$`7p+gQ$2!=6xZ}J>|>t^M4?R+*xJA@$ZZX{UgmVCqN_7 zMD%!rxvTodXlFgAf_Iu9$cA~mI3o%zch7=$+nGOPZGCFy6Q%tdkK$|W%@?(6$3WU` zxBCXfWCzGbsLL4;eT1?9r_?PwP2>9;w4w38E@xh}5!>St#`H#Pl|#UB89cFg9BADW zPO^EdJ^9Bh9*>A!MLl77tUVrusoi|mT*BpZHGB@k=N9;!54@Z;xJPrCTkx@hw_+I= z=)4H_k?ryG-@)@PdQF2~g`?p6$k3b6>+cUR|G`d@jdWP!D`S@IlgZni@gI0nSTop< z&QpFu#be}Pr{DbqXGln=(Vvx{@I!Fh&zRO-CavQ=@F6mArF(P1%L#@h;8s>ulw{`yF#o`@8nOp=$g2qtv$>ziU^0zv6kA zxq{*g7z<4F!lRlu9DycdDH|l;Wo{rnr0=p@@zwiJl7Gj1nD35~AE4An&XvD`KRQTz zx&-@vV2{|a?>>+z8p@}5vPHwYyW!h?K=ciqB3sIOcL(p<9olLCMHPB|Be^_1&_!|G zs(U4MSEENgz+=JGeyYVE`Hyr~Ggq_NZo|SA-;a%JU_fXw&&S!cdzAHT`JQ)Y`@ars zcHX$FdG7~bqi{l~fZtvChX;4#UpC0X|8m|d?(!$l33^*?u?E~l*9&+b_Ks?kT!k5H zExIy?*_}vN@=$isHJonMJDcy^`nvcB-@l#+PhfcWcYe;Xq}^}ue!oL=`mLGm&%|#z zFmwvf1HkZ8i zoIGWt7}wd`^eKAcIP-S-jkIUV7-?)BMn6p_pM)`pc;2zYLwU5B)$Td`+(;we%bvZ< z*s~(PKy{8`{)~6kIo3Hbu_csEN>zW%h}Ats91Ql$mOO9h&2{oWWDp~)TpH=IAM=fO zjLzyPTaasHv=tH;!8yao%Fx*Nxc;dhxtW$fu*XAR-Z#(_Z_P~#E&q9-afL6ivx@(} zty(!_-)+X^6)S>`e_yp~MiM@UIsA{~|M$Z^6JB3cK4agi)iX*j&ux6_BqP4;s=UU1 ztL~U_>-Do6OMWt^@%Gy;Xe>Ryb>^Q}-8tixRcmJaW!3-8`0J`)%y@OxT{B)=RWajl ztL~oh_f_}IczxCXp`LqZ%mF5y$MNJp3PZcTeq$)NtUor)Nuf8sU4FlBLHVAnKLq9l z*pubjutvZ`->I6B_1VnEtj}gO>b#M~$hudyD8D0&@xTB1?V*Ewzq%|VdJ0>+IQK00;fs0iTxrp4B=GuL&teVL*Ab-Mr*h|o zUVdR=XbC>}b-5FIlpW}nB}PhR_g;Q^sQAfKDKoUIzI9KY6-uI9De=52^YUAT)H9Yc z#1%Mg7E|U^_*_MP9hC|H@|O$n4-R_y$G3;d;tf9;c;6{wrXa8D_RI)rA6x5Hw}-O6 zHGO9adbQ9yc8q86nPU`V@;-HBu?M3wXHeFMG0T= za&PG9T67KHMT)(lZHER&vpx%aE}ln<7=ITUpO2*u`DBZ@t^!uUr1k}eU^vHt;gVCB z{{h2aowl##xng+KzS>gTfK#|o!_eW6AQ)>u}r?x{Xy=-Re^XrIU5Dz#|Q7Yf5aPi>}mR}<)4F6gP#ZT z=7qlJ3;)xgABWMsvTwq9%=60w@n6!`)k5) z+#c(GMA!Yx*1gV~vET3JUcXoRhF7TkbI$!Hu7O+cTJWo<&I*sE%FC$5sh{>@VY zpKC60WMM8gYml)okFjqyW8a)8{mJUTqU$FPT}2<4uG^ro=qmb(R-&s#-?@g_>jI;V%^xwfge(iG+4Re7_bWEh7`oMN*cs;O*9xjbmTKC;FEVu5vX;^CA zkL)Thn%%}TeSbOE;H`J;v_%#*|L{c`B|0CX&1jvs`s5n%43qmMBkI_`pw zk4SGpgT>3r7D(P*`FG_$NACfiUHADrL9;atkAZ(dgI=`k>34MVcHT>$CQ+Akit<2>y-7McJtkNLli+zycmc}|j1wc_=lP3l7&>{b z{dIyvZQ8s|M@Nscbo5P5`_j?z|42u(cT_sMs9Q%r;J_G1N59H%a*Ldl)5o~Eo&Cv{ zi~?`Bjvg8luLXMqxTT}l@r^C3Lu1*2l#rLPAi^`@DEw5vMQ3#MFmMY)-~Z*AaB}gH zjuw7a+$8Ta?pwd-Jgbh8v1*GSLt_~O!vCz`ndmtZow3>aJv8=9^u*8kEm);TjOGhM zBhV8@;H=PJ{vYPvKR)W}%Kv}QOnyNU5(MN&a3&!NN>E@yQ9<%!6s#yHWEWSgfbj=4 zA|mdJ1W7PdECZFOyKWn6W-|FTN%-LhTSy56)Z(_$iqNfX*(E_#)JTEat-k%ie4nrP z%$rOi*mifnpU?g=kN2JTk9*HO_ndRjIrrRikriiT2(sG$_VmacE!lxg*|u)lTRNX( z+2d2*TD`Pv_919TvR8UntK@F9pR+7jg!h4#{9VHTg-*$a$p59*f60=_|HamS$&$!_ z>1B(!r~kQJk--O^XMM3vdYWVhdaY!~j|;kGhktFi4EC>$%3x%(`ssLxF#)!S42IsK zV=04bB73^)$fS-l1qkLTZV zuUqyEuxQgBOUa&n71$??qsqd8;FRo{YF!65CUE_8@QUvC!tb}zf5Dw*=?oFLHD-UH zjS;}=$d0r0W+Phn3GO?Vl+9MVde5fa_ql(jpGJIz6B+vn_w0TiqpW^@+_zh|$e_;N zbla_43~gM`H!oZL9BTEmgZ~!)M`3xL|5;~&Zk!RJPIL-Q_UUS8&DV29(2M0Rh zTNa{&4GHg9S9i?InG#O(@zN2M!49wa+f_p<163~U=_!pD8AIBC>T{a@Pn~92V%hAg z!Y%7+ebl|yX_l8}R@QP}Vnf(z=7oQ{t|rlCt|=W|S^tR3Ixi~lj0^u3Yptx^)opW{ zBMn!3?Hrd``>B^bx-PS>%WGCocbPS_xL5BqYro+B7QGkO9xUbg41OoPW^EPE!aQrz zGiQ74bNqK*Yu0&r{t3_L^FNXQW2t8z<>YJ4S})f$u5WT3z_p$0V6Lxm&ET5L)x))% zYc|(XuA{h?aLwWR3fHk*+qh2P`UTfXTqkp#%(cjA&Su=Q5{LRO`hxt?%UotAYn8Rz zooD)dgPy1H{FBEH`g5YsgOTThz=`7J^LgjHoDJ;Hb+NaG+(2K}uB$!dH18%)lAkz* z+V=Ps|8tRVZCp;|8~H5teW1i;j*I<2*<}*>*8O~x%jC3!?*G{?6OUQ<|M}D%`@h&_ z65)B~`H!D+nE{W>9L&97DeKA^F7uUDuF8d92G?bi-{B&1I|RzX`*f!n9PBdfv#fiZ|!L{VZ=G&TCUMnxaPb*!fmv#FhzF!dM@&yM(XvOZ^R~wO^<+L-;W#*?iecqFg z9TZ-J<;d?SE&Y*qq!&xBp3?i%z2;9Uz2?iSoRyNz1z%RL%Zp>_8P*Q|fUYt^5++fgXK$fd1Kt&T$01x}^zaugcm-Qr9yb0OzQe4m(| zQ{*ys<5$SWCOmn%fb~??(XshX|0$AtK7sg@K(g0-l|3qDoYnP&i~J|xlDL(|ETf7#oST5}zPt$h2JuulEL zic4CH$;VZ|8nj?3b!1riy0#sf)Dt`}N0&~6QcT1})Pl1=kjAOIcYlgsMCTmqi*pqSK z;R$l0on{}CL4S9)C$y|ia)X0}#+`gy%se3+2sa+^(1*GBBk(Zc=I$JA^TEe_#{df- zOHz%Aqw(v^VU4yBe5@*&(5mkK*G7@Ug07wD55%f{#?+Ui1{< z0(++aKF+f_?27m8Y@Y@U(^{8 zGkvW9C!!JI<#BK!8WH}gz}cG8rpg3IzxEG_@7~+jBx}4@{aB~El2JeNh zz*Wt?Uh_EbiC$iH#QCQ6N%eIRH}F(qH;!_NoBKJrXx;;V2cZ?&5N*VSwUOs_FMhIH z;*E(vgI=~7$-bAcdk;e!-S|oN)#5ilOzw>~BSJ5=ymxrTMXjuto+@?>_w9pbk3{kF z1hldSAK@l&DBN@y-A!HZ!e>X>zg)Wn`PEebZe5N2!0mS#^SX`#vkU*UaJ$o$(6X%< z8hj<8Wgq-$;TU`L6L9=1a9objRUB;Tn9nhb6 z^nQGX%Xse&XfzhT4%T0Hx~8?%Msd5X7}|RU{5n#K@c|YRztdmmdFq=z_!ey(DIcVK zo=3RWE@55-M^@j2FZ#5G-`>yID}<~Q{)C6%V6Sk?PwC-kwN`hgOps zck=BlbhsUpT&B&}!l!aCo(-QBQG70s;&WBWm0!cB_&FAz;`!eA+%d^(COP`~YLRz4 z!KL_HG&?_v(;L9)ucJ8i$KX`C7lqSK;dDR*Z=2}X5%4HHiNA%jCj8WpeWIa%13&s!-;{wryAI)0bfny+#P}dfhg!TSd?kagE#RX!&Q>|Vna67` z7QQ6E;2Ghl-AMDjN6v8JXOSb_*92`J2RD*knm>2)%?@xT{1o?zxAY2&$4&}I$&C+# zBipy6YpncopNQb=r6|6{Tiy6dweTe#?8a9r^XG(C$)ru-tJuO`CSwEYqsqQ}^E9yD&lrCnSdRm% z=6KG%Ft;+cPV^n=1WSNfV=i6bT4bj9Lt}c%mEI_Q?@9cu@viiC={p87gO4Zm_q{~j z2|P29-x|}7Wb{FDbAE^}dBe?@_Rt4^f7qD#9r`x_eQ>m;4^FUj9nt#@j7>xz937(% z8kRn|kAAX_?kj+{I->Nhanl?=-WeIU(x@(oj(92^pOEs!<)aI!UyRwt>SYl)ziG_I z#EjX`-_@8o8)uvuvt(<`-u!K3%!1U{pK(aG#%p|QDLR|_QS7kCE9YzDrG99<3XBx` zF`!toPVu*?V_by`?|FK5N?Fgp{pUm-upYvgnI39+cZo9kddMaJmcfPwXjw<@`(IXs&jxjP0s z$*bgS)Epd~<273|@C6{-Ud(ZtTPI+@Pm=D_-?wd9e2a3eZ$}sU)bh6`HwMu)m18uI zdBsDFd*-csG$E z!^xxF9T}tDhjT6=#~nZ3-CeA2FSGKLg_Zj*c`~`+u4c|3R@@gmWb1?ia>xv6?6P1V z+_)Y5?HF9Zo}xjckKL9RN=L?j{&)GI){Fx4#he2AU0`loc3q2Tcsn|sXuQ;!Ui^zs z(AP&zTiiHy`r_tE*OSlfTZ_-|^DT}-jiYS8o8awS_F0Hl#NU$98{u!spA+!7c()1u z{=I9YTXUO14vz8ALV_!~Js$r4SLQX%X?u|$icOL3-Us^C{1spvlrww>bt`wZJ)eoc zL*(X**g0c;vG&clw~dMS!4HMZ-E-jYekBukNEVAPWbeto=~psgN34C*uVnNN7`OH8@OU^mKwLMQ|!Q+{)8z*am1?G2GO{nZj9^CGJa?drz zeTI}Nmz5!(;ohxSF6_0V<`H2nMZ_yXWB z+4%L0dlNdn^pX+4eh2X0M1EMyp69w{ZGm|;<0`qzyor8h+2K#0T($CPKl-bOoT`_+ zVHCc|{HpUg-a)tU5T|#+gZZ178!9@EwLNg?*v<$3`hVc418wdWU{(E**lOx;1?=#Q*&TQY8G>&fh~?o)HC zhK*k|;>r&6l#f%5!o#i<_P02F%8OgNe3kXiY2G2<`c<04UQaO!r*iH{e=B!t%yV+5 zTF=RyYCYF{6Z<{6Q?2LteXZwK?$ns?$(?FFCwHp#+{&FA^PJqN)^m8odT!-Tjd@P) zRO>mpQ?2Kjz1k;ts`VUu)p~wmujk}WwVtEfS$#OXHKu)Xr&`ak zNv-GOdVNpsRO>l0f!1>?cWTV{ z(LepnC9!o%CT-??7}aI#fPYP$`Kl8>jjdC$$Ni|&4-fvAVBA?iuIaJ^(qGl@KGb(9 zcBA-CFxv37_3E>9&J*BNecojCxu10=ydQlywm$9Sa9Q|EJA=Q!q%Pr4dot_O@NEuo znsqsGEltd;walpv%&8&d&cFKbAtHm`a5uW&5ynVzCl|SM4RS}hoBw*br1&m`e!}cok<57qnsqLkdS%!d*VTp0S;KRu;r5M2=7g8u)kEfl zoqfC7kvVrbQhcM4IpJ8Dg3Pg=BXg|hjAf7K$QIX#{u zbFAmc9P2qUr^j<-j`bXwV?9Ua^mvZUv7RGytmnv_9?y|E)^lWz^&FYg<2f?NdXCJo zo+ER5JV)kO&yhLS^KreNBXg|h$QDV`t2M+vj0caWRMA|}5jbpK7aTUPi$4R* z@pe6`<5KE65|taae6#y@t~%G#KfBH>>a_KVx7M*21o^A=0_hX7E2L9MmyzrhE=yfT zvGfu>3!v8okUdrzy=L@I;$P4!%T`UUl-_TwbW|EChR+~2z}8{*(uQ=Fa@Gi>w*;w6 zI?D!!qp&)n7akae&bbvkQgGY?Kb=M{Bp}bEYsnXqhVLm@1uT5GiT%*haW<_t3Um6V z`6N?ajQ2&z=er&)+Oftk&Z}9JeI@?Cic;pTh1kdu+kG&$dxEb6-B5Uy-7Ejbd~B#J z{E_UVv24E8=#4J|i^gAYbslYW~uKC>6I4=Xs|Yu?ZGXXMS! zwqT04{17#Zimtp1+G~5XsI}_R?A8cu$yQvaP0Nw<$`aVClTqx5!k3OtFZl9-N$`!w zCJmss3O><94)A>(g>O_We9uSW`w{SMvF69w4f&&TjaQp-bEFX?@`@g)g-x0$*w^@HNH2m;Ap2z74@B{(v)B9|Pay{~hq9 zR!8v%oWZIX_%i-?z_-C4#a{sUo{NFc^S=YW)T$`{fHOEh2EOe79q?^{Zzbb4ya0Uj zV&EI~e+RxT$QNYZfpN%}L}XtVI=wA_FOABUOM$TgdG`Q&RW;ZCtPlALu+M9e-|?&; z*mIMv*^BPH(rXx#IE!)za+f_kah6<;%)L58DI!ylas7*t$zf!k^05o|alhrbDqn|>I9<0jx~K$iW#f@8xEqVxki z4alr>!C{ZlUxJscUU&(_;KlK0@Ur1wqVND$12XDd@cbok{CCFZjprh8ya7B7$fEyO zaHK}zNEIB&oO8kPmyS=VE4BE~jgR>GvM4{dvxaM;I6@s4cGI`qE@Poj4|hrU-y%o94F$8dDr_-+J_<1dnz zdjfeKR^=VkdcouDWvnmZU3_7k*p+qYpiTImtCygQQr8&jYGMth4qa6~%gCDifa2;U z?4LIh@Y9jI2HFiA!dHqPvl?4g>m*wLuyowH1*Y;=us_l_l)C&!@u%X~##`L7XQOes zwHA`%e94k8i=Bldf$3w{fYHZ^0qEk2d^}I_FPoPUA4A-X^ghdvM>|f-Chym%eOGlm z<6D|uiEpVV-f7dp_?9j538F(c<3F#KzD?U(T)>8YT`ivo>lA8Rx?-hFMzP*lb zuWM;$eb-~Sx<;e7hU1L!#CaC(HBx4bqMbHJa&gxZr?n>V2KrSV`%{1KN*?`8zqpz2 z;gft9pYD(`FJGhk6Y&rJ6ThSQ(O-Tn@0s&6U%qBAe$JWSXMKXUwa;n>x`v;zdQ-j# z-tib|U7Y>E`8Yg-pA|FoROw}vo%nw~z-QYBKVBQ_-IqMcci{OHIWM$s;%1#EjWtgH zSg(0A<(JX%`*Y27rV$t8Z1iyM(&{IS!Ue>A-^Wk%I{f)pv={ln9Tl%!laBvB%$Zf1 zKMt?`@yzGf{%PiKi#w-WeP8F441VFaTV{qku6`gK<{aX;C(rcU=bvKaMdq5kXNGmSYelix|`UuOg7F&Ewb=#th(;0;fn z;{LYE^h0MB-|?LXTf-TX+#Q@xGXFc{TC1E!aq=2`WW=*UCtdB>=4Y*w97KOjoyDuW z>&(GkKWm*Se_fsJtGesNxGGe?8|c5?_kwhCDbfGo^jBl0zF)AMa-YcF_2?tW*Kb;nhMukU`(LphEnE@bF<8D?)}D6AR!<#+-xK*Gn>U`bDE;^WYFW$B z9F(Q=-jFQ@u&*C5b@~_4}-<%Eqm#_!oZ1~@u@_z^a3-AXjenR+{-YcEg$gyL?`unZ{ccU4X z0D=6-}f1{CLA$5=7H#rnYHci+G}@+Zg_w&z~vyk76fPgYHx z^2-Mpd+nWVy3%>ZA9NGEDPM0PS9^WwA2?@W2IF4pOfK&HN8m+-%Y6x?72cNA?L$+?FYb-xcP5hssr`3OkpF5-ctoV`} z!KcIUj2IsOX>@$V>$Z&DOY9>&zW*C#taMJ~%wHA%!#Drk@%jHd{wH>Prd#}zSloF} z&+)N+W{x|^U)(Uv|ati{O#Zqw^f_IOc^5zxW1t{NDi2-WYiH z0?&ukbEf|b&(Z(e!-a`4^!T;@1E=Wmto;X88;|+m@jqkQ>x9nFhHu9m;lcsm(4HR} zKUaHufz@trFKs)h=S=_Lo3pjI8u&fm&|W5Ro~yllV71%J2k)sd?R9bn(b?K_fajcV zXwP4C?)Jpfc6)nidnomES@I;g*gzg1V?Gw`hz@N()k5H($b09K_j|xgth_%)eYW2% z3s~)XvcUU@nD(SooUOgpz_0U|&edKScsW;l`M_$omrvUl$Fx_bx#ukX%Lo3vZ)h(M zIeV`59KdR~C%JoBYZ-jR=d4?+P)#CJ?SyA?ICw9-_t_im)>$V`c(fGFb-#Huhf}XoCU0QJz2Cp zi+bc6*;C@Md_u>E8--(-_uj`Bbj+24PbdZ7(16h;yf=b%wh(r6IzEN;^NhFh&|hV1 zk0mZDgl+BYYP|1JNzB;I$@vhmu+s_ z`=!@Wm;QH2dBPRvPTHbeh_y=4Jm}H9orn_NxVb?AagdG9Ul4W?eOV0A+W+@sp@; z_EnVqgy(Wlv_Qzw$_QyiWAcI(kas`33jj*svdYs!ktsm4Dj zUtu*qwd42++t5v(V*k+h+25i#n=RRcDys3V$rtxA`OJ?Gb%Zt(gV#j-T~@jA>}Fzg zw(?Huu>4R8=bUKF(`dJe_#%h!i*4-3&$x-$#z4n)*4`=nmc_>3Itu-?^&aziRYKk$ z_K;ii9rUF<#!`09cc25E4P}pmaG#ZTl{FT|0?t0+oD_Q;HZTtICCYy&f8*;jP8as! zoG$xb0%bowKo4izFGN4oJ7cc4&NEzk+!Zdg{E+xq^!@9+tMe4p-d+cJb~7)n$XdX8 z59E4SMmvfX6-*X9oX4W)pX0l^pJ!Uj*P8y>*7M)sxz_Rf<3E6w&e^XMv}5;cF5i3& z2jt}!J&F!vad0E=E=)Ei5|g^rAjX6oakqR4ZtJ*j_x;GYNZ&WjcNEG`EZ^{x=ozuT zTYsBlqWE$lImPAAwRux~D*oJ|_vxo-@HqZDJ2rL$W#RQEt~TE7HWUM2B)Y_YmLIw1 z8T`n^!z$mUV#MS}mQPyne89f7c-ogeExkA`DanfWvV6foe8JoB1>+Omgip8zK5Br5 zYh4K~o9898G#4kd1mPL^g;&t;&GV+UoB-D^W)H5oa711xd)+M2r)4K7W}+^Le|Xz< zE%E`><15~Tueg@|Rn5iIS{7nQvQNs|^Vo)-uo{~UpYo|S#IhbC?p6Nd&Wnsf@qT+} zxNu+8k4)Uh(hV1~{!PQI^Uf9nDx$rmIhr3QX4 z)4IY~msuV+)OVpP&gX9u|E@Y%10UbTy&(O}b`dj6UxVPX27WFg&O6AS=yJ}s57u*k zGW%w@S8h1kkKmX7fW0&FlLzKH&4tL206eR`H4Ewg{m8iy_#Nddd69K`$r<6_QJPZu zt(4)FHN-wVo;tiTh)=&Se0zgqxQ~4_Z&hz|nj_eU(1;AWg_!XMc%cGcv|?*Q$b;aq z0#km6%lIF}52igXo0Iza#_B(E-~|60v3s@<`!P=Uz(=}sxDVgUTOr~>BRd&0eT2^lLYC@dD?>XX_bbn+@(Z-Rm_sQ+@z{W&<+l_kH^L6ceHLPa?lIv2KwB z>`DCB*`puyN%9?G-l#4C4n0Rcl@p_X6K!mwKbwH5fO0kcsM5Xw;?&3!c#E{8z-!#w3`P`FJjJbd^}GiB-1_L9 ztPM+2Ne4-B+);v-NP!m6RvDE0d>M zzWh6Ku5y>~Je)kmJ$1zh&iK9)Kfm6e>|V8eMC)O4%gX29Q8L2vd;dav!@%QsVsCDM z_q115XZ9V24-^xg&VBKuasVgsyOus%aswJA7R{$QOKUw=85$^c#TDPj+1+(K?|MQ(3>2YH>fCzmsYrhLuM{&^WWB_i+b{}@@U zImhTUzV_Zp-U~AB_PghL?>O_+d);+zeOGn*IY0a?Z6Atx&uY8unzO$57VkxMl&zMI zvS6|`C+J)g^-p!%bI3m4-M2G5v4eS`Y$tLmIxjroi0CaFeittMHF-lt!&-y0agtM}|R4CNHHVC(!F&c|V{<$J}z z4PkFd0sfHydkC_us}mno-%RH%k3bpf?1CrPazTIioAcNO%zh)BU0l_1VM`5MM@ng-)HOOs0`8xdc$={cK8_Y}oaDhoq(iX*~dpJkoy|=4| zwUMhnA;}whHT~AlZyfF@%tNo`S=YxIjzT?qbx8i_&DS}|t!|vE`Ay!6e9DTeOyF$a zeK%MAZjbbO>Z&Pq5+k|lndDc=_3w&rsY6C<&rB2Z<0x`)2bd4*XSmFVp(*K`PUx^+ zW5vA%+Fw;F8XDrOL(UyR?`UFPt94!1qMVP@rE~Lc?xK5JOOaLRp2XQCblrqsK)Q|K zbPo51uB8vnk2nfDzpS_Va3f_syOutr;&OQd)h^RqPgl%h&7+<)ZUm7dwDiG79>{qKPB$`ivn;8{h+(-9vFU3 zG_deVXrK%l;C?!N(7IPYUAIFA^v&<1FQN-*PZVjqOiZ?DBSa9T?F9$;XMt7Y{j{z-`Nke+@NA7c{W+Hmu*duU-*=C93T4r)_~-S*G2>17uO4q`uMQdX zu<%LWEPT>G(V+P18^@dX{*v)t|5*2UkD+YCeq%}Zcpq8u4dV@rH^z=PaEfOv_|7%n zymMCAV#eFS7~A8W@@vMsDmva}(eb8^dip4SjvenB#!_-mw#mK$5&qtbOq=vJbV7GeljuY%p?BE%**gx;1&8XNpbDi7tnWLg625R8i&5=*KGf`xE9Hc zy)BNyoy)0L@`5^kCZA)&zkCK7sq90efH*^>Bcg#Ovx8eiw7(=?+AC8Q{U7ABy zItr`oIfSw;D>QecK1ALgWJYa9T+4;X3+>kl43?~jYZRT;WRN?Gvt8?RA~bY#6*5uS`yXd_sAG_k)Yx9h^EPQ}R z8y{^(1Q(ttE}*Ta_cBlG+q=L;Jbtli-p^fh_t$W-c8TM1o9>%|Cjbvw@{RXpw@R*c zCVqWRQw|cz_%dyh0fFBA z(5>h_Fc><9AN=Lr^q>DhxX_|~=C3dQiMpZrGkVkH0`oW6IHGq~RA*w0d+AKx&)2Vu z>P&{KD~EC$V^Z52?&SUa_2LM<0$bPpl+_o> z{`KGK)}68_+q#qH%QN~Dz8(u+;FkXM`D4HfTo$~*QxD8NbtwEQQFv?d>GXh=cfST} zj6B^7Er_lJ=j%&>2f6ni`^qiaYKzd7WT`doQCvw!lKy0{&(GGMmYx^YneKKJK5`%9 z4~|{|Zq1>4b=?VVAv>#!(APv?=;r?N=$>eF_y9VaC0DUo0?6M??A|~wauWUAUlnbC zI{&Nqzcc!O690GdpE=)x&&z-Gc{{i4>JO8&u|6^15u@C&g$bZ=a0YCZ#dSW#> zs#fEJf)5YWuEmBTKUE4gS3RUd_Xe`8oO2I-*jkH|l=sus=pi5a zXW5zVcfXCyZsuiyZWqTDE${G5V)7GE~>`iil5E{@61zQO22bl8y3@e~cX|`jCG-P5vU< zke^&~xBfZ&NQ_4vW45`;X*PrVCdOkfLozTnRT>{FknnNA4x{QT~0!=*m}U<*24#0ccEgV!=(jvGC3W?%wd$ zO@g2112b@M2JU9yZUW{U!3%tK&{O^VD7?UJ!Al>SfZ2kVKJ|ciUO`WIOAE{e;)5=5dmI^R(Eu=>jRxul17iko0qZ7U z-3+YFz*+;WL16urUAse;RS&?zZXr&CoP&-gRED4W&oeG zc)5uGqLID$rTvo&%zJ@Vxqo8&@Mqx$-lkr-tq0zQ7~D3U1-JD!ZqGuytdCo8igx`a z=Z5Qk#@c@_e4YcY$N#HvbrqPga0ySsm+qvr3}9;lHtPAf z1lVY|4xF8leZVUIl$>s!5rr)xOTG>pZCbD~w_30rjKG$Mjx5l z@#Xuo$`#<1&oLI>dSq!3nA>ca!C@0{$IdVHz!{9fy}DbT^nlxvD>372$ra#}T#;^T z^@BNaA@b!l=u+cvjXiW~kG){-fnUa1d3iShV>7vhHiHNG>z);?^sx>c*E7}@tiWjD zmo}Tp$#X7xw8ow`E&Kwn1sC(P#=cZ%+BO)4wZQ^&33E;bIzj<+<)y5@$wwa8R$#6x z-BKw%Mm}lzIhx5)T*rExeA|9xel;*_-EIqcHaC)QW)r#eYJJSfT=#J=$#AqgUS2)B zkv@fJf8EvJBllL>fqSW=nCIo$S(OdQt0zletX$0=>}tlfcD~pAeq5sO7|*o^UXu(z zasQW;8@4;meUz2AO8f8DbKT88;|hL<2N)HJ=u_i4H+uJL7li74F7p`A9mFDUnOES8!+gTghqEl>8*91Ok9DvUX6eBv;m2BZp7*eGFJ!$-zU@=iJ1M>fbeyDX z8)k2X_O$QtL;TiTXkYb(9x==idew2hN&9rw!5#E}OETj~?7$`X3x@#LjxNL8LBDqM z&DM6q+|RSkkFXacImK7&9TGa}>fiV}<@dP1>7ZezCMWoQNx8PoFn>n5;Slt2$S^PK zo8Wsw_kp1qyjO6o<4n4dw0jkJtqpQk?sVuV+iSk~HfMp*hgVq#+{ZU{O+4fJUG_|_ z=R2)gE*?<+bRB2B)p_XGV05`rj4@~9DYxuCeaCyXTsaG` zop)QR+OUya%)TBAB9GVHq=*#@7j~S-3Z=$c}3&XlET`E2~(W)=-Oh#xgW!Y0B22F z_cI)3fHOI*@?grG(`l6lP#!CLg>Msi-xd9~ocrPEJEfGrh?Ywze;O@6Liv+uc^Tys z(ee_?UD0we{0;GtBCXmvURQoJ)CUv^<&e_Goz$7@*~mmQOe7r6{AEaCq zEx$>5eze?9d0w>q8s)js@+*|*M9XcIXGP09DbI+Ow^N=TEpMajjh44i&W)CvC{K=- z>nTr)mV=ZhM9Wo_$41MQlyjox=O~YgmY<=V9W6ga*%K|VrJTmR%ls!FqSoN#Khs?8 z6~2+>!|~|{2TX6_Y_#I`!Q|dW&hBIVvj#bMH~vb^*+tA5l56@d$oysfM^0GvF@Ng6 z)kbmwaStwXNx4`zcd>@fc)1E#yK;4vJ;0nud%;9}8mw!CCo8AkXx8d;+{ZYl>@??+ z?a$72e`^W3p^1TO`;D=bm`(B{u=X`4v8Amjv85D$V-wGVpXQs5@%~DckLH^jy~8|@s{Bg6 znOi!{bC1ex`R2YWGd%yOa!0=T>#H+7*84m2%@>GSSg!kr^34l!u5nx6zO8zOM%vn* zZ&p!{)z-Fr^PY?$o=5cl!F=;iw+)H3wMFn;<+fmZGvE9+^;qw>=bPia(YBfd&+y2% z_4(%e!-jdRcAv{P&z~2qKd5>pNBZ(izWEz`96zEitG%c4&65Qgp6xcgRr#i;G$Yb} zWxhEwW4HzH-_0BDx%mgirSpF~_0sLj5_j!>ByrcSlEhto?gG!@d~@%xYuvv|8tHB! zZZQY_T7K1^J(A)%ukSebzY%v)!dM2;b&ir7aRsm}PoC_y;%>gkH}CbjJy{ozb>CK+ z4*u?G^&l5yPd+>BD)+Erx2J+QkYg8*bdMLEJXc^oL)=Eu#bewidssi?Hx&Y1t>KzJY^wX%#zfD%+}}6k8h7o*qulAEC%cbX@0IsE%603#iMz7)WVui3or|Zq zYd;HIR@>zI>OKC~6({Zr%uC!g0G^q6v*EdNf#K==&fTp)EOvO-(2u>vcekoP|5j*t zetVbU8F}B`t+f|t(MFd0idz#rxhoSqrI#2>^N5QJPRD;q|6cK8b5h5H7q* z%KP}Gf0cN}_-nh{SV0>F)UEo}&VlQ@+bD{*G2zDUHXP{K;^C9TS2cLu6&knAE_cOk z?0c2Gt%t9Z`^8o2T#eu}7gW@sn+)OEPrZq|N*3DE;RmLdy@>gA#&K@?x{Va6w z<6#%N2i~1~X*gq?`@Fw3E>)aUQ0o)Ogk{6B-EEbLyA&6toHefVT$R5bc9B~??rl}v zM?Vf`@IJmY;GJQDd4FFo5A`&kN@DK=BU0+ z@+rPfu}|fym+@#DhrL7I_#bi>tiLE?XUMOTUw@id)dF)m_JnM>wWal(Hy-s5@tu6T z$wp!i8}5w1jkaz7pzKZA+Te%m^@(XSP&&_kdG4@)06wiNr1U$nh!n6E>mi-yU zb3ORC@H{7qXWFy;A>ca}*Y60|(1-08SuNiKFbem9vEBA^zWi}*_yg$A8Gi|M+rws# zfx8}>&^b4X6^yl+UlYvGX&rFaLkkwn!1^_txfi^9E{)KJVyxSU<-Prn#K3VrC~;UD zKhycioqdUuinq=R?Y-apO4`(#RXKL_-Q*G0+SR|T%C6M9XeRxUf4zpa+~;^tYii2j zK)(*uJJWp0@>6xu7y2eY0dd_2C6DA+DureO&RY2+xYzo9L!#nl<9v!y zzgOq$fJf!@4f?Px9voizd}(dvUD7At1aHHgmG#aHpVkuYH!^&|cF}N#uiO~ms{t1O zTGm96%fT?R%U59fzlg}dN7J2^kMqt#BOduU+*eHuT(y_?(LWdPz7^yB3GX78u0{Ud znUqjj^9=8B_K!jRey_{)zoNA$%HUPJW0jY<%ueV?XHCifXx*E@^SRM7GCj}5H;m67 z;8u*@0*eL{TI$ea-yPr-sF6LXo@`hmfq`+KAydU$71tN4KhNn zUJ!w$6{7TZ*qC zT#Wg<+FK#Ml&pdOkadN%;9vYFpN-9bZSY@i4F6@pf5`9t@ z(a#roZ!317J00Cqc}=9xWnAh$jXrnS71igEp&OYyIzBO$9zM8n*jDca6}vyp+tq=e z_Av3L)_2%0C;7%5)d4@`e9Q)9bM`9o<@~}}x~6n$G(=Fvd%iYW)8Y0Fzvo?RqImDds1wJ_TdZ0@w{_5XRP}{ z-DghFw|%*{6}i$l!D;TkZ))rA+yZmxeM?)nKH@d6vfd>}<-Pbi(SILAZYkH0zFVYn zx%L?hwPGn(EV{4NrMl*$M@%9%crNiIe7}*iN_5_ezR~`XdEY5&Rhx>*-CD}K)KS8F zhl}rO9e&@U)~(E0g7JBN7u9vR9uq&Ot1d;K+&>2TR`T~Et zPvcNSe_ZrqKk%zhw--OyI+Z>xWh~U6AUF`-)tAQ>t!ll!IMN68NBvSi9$PdO{7!W@ zvNvD&v-|P_@d@hBi!SUs#zcLx`=freQGZ3+?#f_k9`xAP!t*L<*oIm048o`7=K;UOScy#`44KD@1@&1q+bH_K4N-~ky}@LTdZ~YCEa?6bP@}G zWJ;_q&_wQR_1~ULrI%18mpfi zVN8hUvG)5ZH=A;_+4Myzcgpr`wK6<{IuoszUx>- zS66JOY!k(1$u5a&$Xk&|43hL_&D8;D#8}CBrOeriS@odD>%7qe(5mRip3l|(8@k7L zo&Owu$!@Rts?&w(r?}rWtwk|u)oIkHIIXS(D^BYw(IfM-)(M7C*14$CtrfFXeW-vk z|DTEeAAl~8o~!+j*7FXY^xTPDb*|;# zSl3~V<8+^S;WF$0phn@}pW!t}>+12E7wcN=HAm_?A3aXjZ0rYJM=?&iPA0#ct|eY` zxURWgbC|9<_@s1Q<~2W=wTqb2;{5 zir$~W`EI(>pCnz8#q7J8T`s#39<$Ik=268wW{JmVS^P|lnv40{X#Wp* z#$Q}uzDa%lB?aaiTpxMl^h?6UFLaMO|5aD;uus<*+j1}dUFnw6T?63aHJ(T9$pe-> z`3!q3W9><3RrX}AE50jd!Cz%dR>+q8gJ69wvNuaQA2DMVUyA>1Jrx^Lym?Z*EuHl$ z!F={_Lg=}s{jUAJz8S+e8du2+OV73SV)Rn${RN3V^x{n3?;%^{i{PE3XOS&~de?31 z(D*Q{y7%xmvUeZ7FWr zdWSKSO(Z#S#1%I>2<<3#T5;Lcynm)omTg6!GE*wp^Y^uOJJs$oe2>U5@sGtL)ZHUS z9zL+zhj*?4F8MLUE6jHXrg27{ct&xr@`Y+`TfCF&O6+PP=izek3G}xYdv-nZNNN)2 z{dv=w4^tcWO)x^g9P9|`%!>MKc!mB|FGFV1&Pdt`@Ln~rjbt9VjCn-7Vety>=zNO$ z>?ohm_l4q*Qp*=sA-}9_v<_&_rUi}X85?OpbiBYxEbaVAxPZ?6z#y3Y!1UE8kug{a zPDfRop4fvPqvH>qb<<<7I-jIY8wSfxvuOsq%c7ZH@2}+jGh-*;m}rJ~&NkOA6}<3A zHu$%ADq6StYWM35Pf>^X<1T#zPG8pbkpgoM*P`Sh2zWwa^Uz6VYjf9}oNJa-zN#J3e>@GTV+1b`u}0wX;{5w-p!F<~U1y z@EO?~i4XRVDlmor<|u5Ie4|}_XQzV9s|GUKzZP1SPxdwZ{P@3Z7$dq?1je=W!-g># zeN%duU@Ri$<~#T>?vKVWUjU4vFH6r7*^n{N8UGR7x^uS=BWJ_K=5bghP`u{KV|E|H2{(FpmR{tdrVq>_$M}Mt5 zNFUBc54QX^(9Ax@MQbRQt~|DzhVrE+w?$ylxjz1;0_J+@08VRM+6?wC(xyEw+4z>E z4;M$_$^fqAqMboDT*($(@*l;*1zq5ai;N4ruphqKf7JGUgH!QQ?>XU7jYrI!T?T!e z)gO$!ew%lzeFbbIMi##f-900nh5b;-Gbetiqu@8!71x!6-PP>}c992kh;=rb0etcW zYp>528cSqr3w3@Q`By++*YLcEdHe*=q%+jg=1+O9eOrp(vHe}SE@xLVZ3HJod|gGz zeYNp1>qBazH0tkC8`3}a>q`9vJgcStll*@!311g7pypoWFzx&uF!Wvnu;(esA?2g6 z*8%j1As)&W>2i1?`ObpWjiXe}VumE4s~u8{b+&$jm?R!nOES_`n&07jw9 zF();l&uxk7a<%Ak+DlubvZWGTY7oPXX{{taMdMmy5MC zTKIkk{YVrJV{j_G{U4sGjoE6WNiquA1+Q4LtBE>~k&lf%`8{Zmd=KTUN$706Qf!$b zYfXY2AL!9nfP?C>7B4*=PyHG@(P4RMT&3v4I{Oiv>#VpyBDM_pQ;b*^{!r-*{aKUv z7sqGYwNI>;IXL(T_yx~e?-(IkW8Sjrc?28_Z_=5e8=dj3`8o^!l79LTx`6h5=-d8$ z7l0PU7s$It`R28k%WhZoq|xrJR=cjo8oNzki|5-K+R}Gcdwdt+gV^@sx<=#Q9(-QJ zKWpg@z~!f&kFeV`H}4RByXETstOZG5lf}__dcSl}$>J3c_K?M~-`KL)de@%k_03|w z(YQ*!^q7|;`svr+U&#BmEIMOX)Bf4?)4vlu;L49((|oeq=iS2nsL%U=9Gu9i@Fg>rRqwvX=uhppj=H^dC$6 z(j%Yb`yM#yX%Fm|J|2t1;p%7XSnY}U)rC*{y)$FQx59hcxxeWit6uFm^^J#pDO{(? zzK`MYGyI)SA4N;*BlHyUCAcbk^br~#CLYCRl>UCB>gAgobcH9b*VU&y^ilg4JzcU? zd|=B?y%U&w7W7XY5~3L}mt&nX-TDN+R~JWTwT- zjLBHqlRUKSUueqK>1)A|EK6vU_cMyq$N#uDG|pDshIsDmN-Vnd8Fm6Nld?9=}flexJn9m*_G{R82S@yIk$y>x~|TX6q!))UlKi~X# zj$y9geuw_gH_XjNd1m9J>7gdi^`TI)>dR|s*p}CFQ=w7#F6+Lz%-x%aH^_}QW@Vt? z9$_9I1HYm>Jv}~La4;d>IB(pitDb(3^9-u`aQ?zHojvVn%)Xhk&^ez~=SA$r4_SAu zF;Qo;{ylS@i@7hpB=T-7lRBeu^*2+);wRyTBMoOy(fY z`WS4Tue<#fqva@m>!FXWI=FpKo;m2Tyo1~38s-4ts~?*X+B7*a)Ho_Bv<19295h-q zr@lj996Vo!f89&}UF420b#Vq8ux*>0XW_1X>@>ce&bQa|ZC=avSHQ)=yq4gxZ-tJy zCN>U2clZL_2Hxx&nnS+&9&G_rcUyz3wl1L^+B@Z9?IE9bRPUpVq2LfaYD;Yf-@GAI zza=45Vhn5FLYtd*CWh4Re?lLP)1ikMd1h#yVQ!%>4YV_Wdj0eBtek?XCr$tF%`@w_ z0RPVEA%mPe9&#TCmN2%{^=%&e((`sTQ1=$|!%rz5njW2Wp1bJ#g2ez?3Y`xyU7! zB7h#@iO>7P9_*t4b&X&jdOl+uq+Db;+e^{U^5Erym8%ZElNi_UNSq_hhvexXl%;0z1yH{V9IsB)Wl`R_arORntQS@2q(~8T@qHnHv z@CPq{!5NJu8M*GeSf}{`ak#Ae%qZYDjY|*@&uJzYb_Zdg#gQYuuw*<5bLr>bn72jVC{MoAB`HU9J1GFL&2qC*A;G_Cx2~ zpPl9YIr%wHX8(=*q7@5vtjEsWm_5qfOit2`*%Pg6o1Zv)-j8<>dkY`y{&&dhX1A@Y zY^N-En=0AcHP9F4Opp6ycSEPrS3{GDi!|bje?dO}58%5N*Y%+f*&9<%ogX2GPBK;p zIa{VW_gkUzRl&+9R;@hv-Bphr977*pJza3{KRHkQcjUx8#(Ucj87-pC)6~ORk8f2Y zH=rf_5sohZw}d~=JdC8Xl(v>tigS{;VWpZ*K_<(VZ2Uu*RiX_gQ>2RiY zb+YE(&ym;Cfz2)+FYRZX`tV|-a9B#*Oum8E`Ziv`SvMKP#`0Z%_oEND4rl$^!y0@N z=NBE$c)njaqq1Lk@(VM=PyO_PU2EGOAU~aTR%F}G7iZ2SSJwx~)_-yt6Q6tFvdY0F zk02ul7bgvRa#)A6Uzg%uHq5@Pa=RnLXFq$Jv&!{6>^#5gb>!;?&iMFcs!UTjBD@lYy7Bt{2HU< z_tE>|!i{_*+VXK$>a?`@%3mPYh2t9>@iS`iP3(pi)t=S?70=r7X0AKe(bvN1e7@ZX z4c`c?vnZd;9_hZ8@{QL0Ncmfotvt0m19#-E$ZVDUxiNd3yP5ur_Vlgl`7UkRbSIh< zZHoRxd+XjMUoY?IdHPxUw(e-S@b7uvw%k~%+?}d-J?CrS|Cyb@`(B=jCsG)bjoI1m z^{j8(ZRhdK4c}|s`$ow^+USkDb>zW>h6anL)W#TWRuA%GBls8t|9g-xDyuJJc<*Q5 z(3jDN$uZ44Hf$%eN4Uq}*M606#haJXSDQE8yw_G^EEP<;S6fpxOnCVke22&b&b#9E z_0(hcP3zLveFH4N_-(i_nRnj%hIbl&6E1W{;Ya`myT013Pn;E&(Qk(f|HL}D>J%J; zS9p1!dp6Gc5Q}^^Jm2tdXAs7E%9<=R&Z$4n2cz5trH#AnLypi&=diHo)^^Svk;NVo&^%H$ZWQ(9ns#Dojr6U$ zg zJXbx~422ibFV&@bdduF%9q>Qz>UrO2Uw;v!3)pkXx|hO*Uoq|{voCZvqjw6&;`{Bu zuWwVL-+uI`ug^n`|0i7dd%hhBzB`bCsh=R1cwcAx+)N)dr-&XupM16ZHs+D5nMZyc zt+!va-qD;bW9uh2Odo9t7ygEN)xPQzZayNPYVY?NHi zj87}d1Mkn}{(`~Q{koX@@7eb|hgM+Ioq7LEJ>35x_haecJ(~`A_6*PLIp}_J$hzSf zYd)gi_tMXO(ecq(s}H~U`0IUG*AOlg4~l2cw9`4PLb+4Lzs7>$)|$X_+LFB?eNB3s zWXu|DJP*1}GUKosTzMRk7?t(Z7xpG&JG(+(y+W?oIr+p*#9=?jV?QT^KErM{ixaV- zlR}RoYa6hMg0Ay8+9j`LVrkwpfl&@%$!n>8#4z)@4##e)zt=Fo7j9kmIRE{}94!r9 zj+Vd|=>O=>#>z`7Ut<3+dx2Z3=jNM(6eE5JJ8ND(dtD9Ir7vl$8^FHNqwM8o&u9(% zO#QyZkbi!@x&4uR(?8juy+Q4PBFgL&_OBXPIY4zF5B>L22YZs2VRr|XjN4C*scEzuKr}%>;oEq(qx!V^WTB~UB!G8@_-B3ob#P6sqmuz zU_>5nLbs^GHebv&lQ>k#@=@5s0ru5C=u9M)GBJwGGwZO`J)EiI!&YC9o$fzM>>T?f zYmeo({GNJ`^Lxo@wEMgATN2`o^UBc$M5IDM2_nD*z|pnhw^Q&zB#AI`MMGN z-eKAIBhgRGq!(kOIT+hjD=u!WaycyfUUr-8`&BElxMy?~LvQlcuY$kenf^tIFsIqy=)UMsaoI=Pjg#_EXv{iYgBy$d zi4{)f)0gfuo)sP!Twq+j=T7HF=8oBp+sPMoEDxF}YZ(GP=nO^w+QFeA;T`LQBVzm8 zZ* zwV(eK_+)34K%1GoE7&HFFfPwk?(;*~&;#;K`QJZx4ITXj{rJh7LqdOY4R5Sw>@$-F zwP)eG2)${TKTd>3+0VWs*GSFq13(2pawQ)d2a|g5rY@!MB#kc#R?Xs^* z5Bg6)i};QV>hVM8{x;@Ez8{F5u;7;RANn&K=9k#E$S-{2=XW(Pm7YOv`UAiQZa#Ho zG+w@75BsBs;g--Ic*dOZ{RG?x(rE9CJo7642g>_Y1n8@^f1LR>;BuH9;3Z4CEc2^B zBj0>!mc#rt<74Gqa^({<)TiRR)LAn)-_+hF0tI;5FCKE`J7N1^$jO9*?_3cSC%?GCtd$du<+jMT}kQvwRk- zp&^agX4;~A{izNcR-Xdg6Rhf2bvTcFSmaLz?ppe1_f37OryqX$r9P@J>eJ$AfBbwG zq`vP`SCI0*LgQJ~+0ew;As^DAc7fKClZqLq6o2Yz1T?B|OouSEjy zu7RJ0cl#&a{vLY95#(#|<}top{B^lee_b;C9Dtv%K+nmBpWTmM0q;iqb@EwoJ_7f$ zEgly?XK~N{Xjbb!cyx{A3;f(+I4ytOFU8Bwv|eBPjDh|xd|13& zea!NY9q>Xw*4T82mh*NMG5+(HXSHT&{$X4dBl$G#1iPwa`BA$VV;?d~+p*QnP z(=}}LPu{#Wv;+F^L)+qo#fpz;i{x0eAE>|C)^myT0xdJpM(v`nDlyyff z^5#P0d@IgY`Px^LTTOB{(>T9fdVD9gq4pz6hqq`|dOR>@0i$G}L$D+NR-^X_e?{y+ z>Oe;BMbDD{qr406xcanzO1xV&ykA{~yg(-SkqMcP8I{A}@jUV`iobK|!=*1tuA#?^ zN9nivW%#Rp=WjO@t66cy%FIgt7Q@`bTz33BtPxb^nLCdGhu8RRs!;T5ba1ICa2^t+Az`;m+4s~@;O7k^s)w0yno zlIzvL6IkV_H2ejhcMc|pcNiZL{&7csM26^$4L|Zz{R;q3mj67)!#MR0FjV^-E%Oa> zeeN{O5#(dm*(BGd=Y4+v^Z4t?$qcMrDU{jgE4)T>HF7Sx{+Cim+;8$$bdn#`f7EE% z`vdONMhID)LEje6srp@D8*yKZ!A|6S;BCXCj#H_Vnd`~H8rYe~9x}t6cxzs0Ex0O8 zMo&QIeF_XZPh0Yry(uT5tpgr%sP5@!yrq3G%IQ%?zVR%4yjl2okGh=g?nOtZ9CmqT zp1!YoN`ZB5v7;*=dh_$HhrFUX3x)NNr)#M*j`_|3Oh^01k(;8h)(j;S7WSsj~_)Eyk0v?5j z`Mmq_Q<6(Yqm9e^`9B}rjQKw2&VY;K8)&BloE>7E*XEg5q~wKy;Li&_{;08rZ$pQW zpWtOr{Ab(c4_~~lCvGkPHw(zQYU5^43~q=SZ6Chq-6_wzE|~fJpTSKXFvmx6v!-vn z?_~=&E?)<@sakPSYc05Gi{fVQ8Qkdk!qzHq(-y_e9t$_Rzo4~BxWTSAj6v^P z)#>N_9ilVMX~VmYTqnJ5aAOGl_Txp0j~>|g5m$>AnR`9Lvlo9+JG?dr9zf@3UiaBF z?cbSqX3RwUzXnxqDcczH8q35@5b7jo@{J!9n`QZOAr|Thq zhOYHILf2ZaYX1LNdl&Gis;mG1%uFC5;Z6vF;9L?E0Z~*?kV_^3K|vzMv{h(L5L=Kb zTEw;}NQO(bHTvqPt(RCcxe?A_y!^Qaf(c;tt+5rsAHCRD0(c)$s23PT=KuMgnMnr3 zzQ5=H{PR5XoSd_7Yp=c5+H0@9_SzkEt?zNVUe<}5QpWe$%TK503wReje=;UU&y74S zdXD2_EWG_Nxago|aFL+nk>|zmoZ#_+XYjZ|oatm9&xXgd9RrJ=_+RKana5Wr@wkio zN2>kE`BA`;HGs*i8S4=;Qx~wXD`?l1t(r(SOQ+d+%P8GGk4VwGH z1x>O+Ze<>=--7<-a13u6Z*PjQzg&YH$y%OQDLHiloufZ-x87r&a*}mW7X8di>tCU@ zLMA%SH_YFgS+9J>8etRj@|TSJ*XW%ldc;BU$JS2+Ladwm{2$Ilf9N1}W@ikpkiHf~wr&Dn``KGI(bYHE2ck=5g@?;G4fwufe^mSK8|eF1 z=&5OZA^M9g@&auL7mP=75c!6n&D7Xz;Jb9t#C%%KJR6()`vj_)qvm0w67C-7J_VDt zS2Z|e-Gq)+(6n;4_v@VH#JWAqnB(VW1E;F<8R1`Jv--zod)E_N-r~1~UoH6DaCne8 z7M$0hyEQY{pQLZ!(8mqbyN&t>QC{mo&sD>$xMYRh`&TyQ*_#IPz4o}5{@Fu!vIY&( zzsoFqXNOLJ>rJm3q-9#TH@6!RN7|r@PCWOw@Vx9Sc>aR6H?6+G)EzNeOV8#WsT1JY zgikivbHMGua0uKsLr-4<>xRR#&27+LQ(j?{U#fie5h!yY&G-`2dqhvX5@D$V2W!`j)hFFmZZgQUrhE!i-MK3M#3 zJu^dB2-m=7A}8G7I6>#K=}PB&kY^3J)mr{(=p3Jhz0!R(7F*{bf0pM~*1+#KqHEVc z*KXqVMZo85!%-m|euZohJ%29#f`2yw!I_M)<>MsV{x8l-{8oD->mNc!5VwCG_7}^(f~<2>UhDW^gApmU;ZuBR42IdX zU&$|2VMH#&o-&wow$i;m2OjCq*4hJmLC|4~xR5vU+e)n6E&B=m-ag(I*_@9Z1iQf| zY$^7%!4=XAT$#Hj63e(rHigz~&5@a*8f5q~@WS2z|DzwSE;ZL)8jHc!a(QfSDf%L2 zOHq3(v3abra~=TsYGWNO8J*m|3!6$lHWk^UTuC;S8)+loF~}E&*Ce~V(D~D{sW4`i zO$9ljb*&rQp4Me*D~LThxB)utZ;TdQT}K_(y8Sc5()kkoRKL_$^-cX%|J;$NRYv`r z{J-=sE8aiZYHG=UA^D|esBa_Ua4*EZ6RPl9bKi7qATA@_HywNaCi-#`nYdx-RC6nR z(O8L(deF~=Euc|8Fvw-u0=mR)0YjiQ*$2*}UkQ6ap6rIui|hjHunXv1$WUaA{Jan1 zdyXE9UBH37{lBpbq*SOG=ze0$M%Jma{b^o*g8av^Gkk*`l=hm0ztLT= z6|n9e1pKozGMQ@zS+a0;Mo!xyaHjeB0QEY6E7-;vbh{Bgf-Hm=o3_(-P~%R$3Aywp zd95{jI3~-3X(zUPg&jikUa*q+m%N8*;{-5hzcVvUZDw}p5t_etTkT=vq`k-NS@>AT z+WZK3E@r;hUZrSeGx`1#PyFul7*EK@AlQH&MgE%Fgnemn%)a!{_uH3hpketf1V3Xv zN_zpy3unXlrnQXdeXh@)v)QV%gspCCALTsqCdNf$RKdGswS^n%2!>rI^FovH zXq5Xr=qKZ>e3JX@uUdM^LG+TW#JHoE7}`g8-ixne)@gIWozzVb5bm{&;oQ&KOZuGV z$PLIk*^xDGZKHl{)1h(DwQR)FLu@JiE45eKpS%XTipE5G$>+?S(mMtqKV%y|NcqVb zIn1M(j9r(|m&k0*r_wc#llOD#)tXjtC~r(J%(C>AYk|*!?LhPCCgg5ad_JvVeA_7( zVGhOTC-4RBN!IAhf%HDVy%^36b|U^lnUlz$S}5q5FMuwW8w zT8HfX7cfJM!4mLv1Fp=Y{|(j*z6=5o6#9gLYMfa?yZF; zH=_?oj*&OCopsbV(B28?JRv_fvIf8hnzhWqnzUUc_$VuVOM0JW*M)zjk3B#g);N)G3i-tM`ku&NP2X3?^GrCS zpYjVo8@-3Ur_+0T1inOuh@Nw)LwqTE7XC)!?~tH>_GU_e#ad5##mg!K%>7jc8j&ta znZ-YUpp&;RU=B=_k-t{r|5W~O$9GU|b`jjP_mSZJU-Wqgd9f|L@CAG=n}YWDWMB9` z+k)&0vMKzYJtx^q1+Q@Y;XGi5R^Hc>_1(KXrC%Sip3JlQ4o#^~!F!^ct#b7DpZcEE z*Y4aYpTLhBf2>6R-j)t;%|SV*%|ZKAp0U(g*|;yd*@v8sPIllMU^Bm+EWdg?`#%o$ ze^T%ZaNrk!f4!q?=$j>7@vk>RquEn!K+eqOS>G?+d=&rrpPt%q|GIhJ$Pe%p_+k0E zmFos%nEOv{zJEXT4UHb#kItjm5F2S*YdZb^BLBCLR`(+>HVY$EU+Rs_ya`(!-x_bk zCeHqwjeXYb*nLgrIT!mp?^A9e{-~4Kk3)ZZ#0D)a!VmQU{7`-Pp=!U)MCWY>-rciC zRyf&jE5|mt6Z-~dHAk1BYfeKClz;qzyN5Ot+xRs9_yc$6@h!H0?j_#=_Rl@+0~KO- zQS9SVht1k=6Kr;1<9vJZ`;3`jyA3!V1df}4?dQNE_yo@|{CZ>XTzDEhjs0T#`B%l^ ziL#%6COpwI;E4hc=SMr>i5f9@{22vJ-dV<&55SLq#fp6#bcifNf75)u75@kM?Vlh` z`|V#L3%^7!r~%))k5V{9=JlzYW<-9#n3UqPUpLJgNhOZVL3rmq^6PH(FDWnGq3K$U zSGHwS+{)M`&IL44K0=U+)CTmq#D=x2e7Yyl`-ah_6?nezi$;j;zx>%k`U|J4;|-*T*MkT zt~|HGV4Qu(bJ=Ty;Nj2sAiRx#_bza_7+Upsx>U~On>)8lWi9_-ME(!(O+JunEOz6! zRqE*K>yH0NzO8@w=hXl9HLP>(eZpb>FY0DvJ;C`VV%~p5Ec{*kEW0r8X~R#TabH+||K21F333ox8 z#Bz~8;T5FM=8o&xe4o8^sK(!_M`sydF`OCQGmX*sK3?}{WS3|)-x%aG!t%F_(d@*S z%-dVYQ?w(R@qgNxE`M8O#@?HFMzPuYv5CBM_wCI$(bhh`l_F0^UM)ZP9^o)gbGot7 z!p98u>(d>?U}P=X%~8=4-}hH}&*M1@+$8W)3(W~Po+P{k+4G9w#l2Ny#Q6Evvp&Ta zI_#&7m+=AI&MyyJzn$M)?A(=O$2*0io6pa67Nq33Ja@S*9IXToI)^ZEX<740er5d5 zIe(&a2RK{4|Gk0CCyxzEC~=2?vIN??C; z{Kd{u#K%60?8#?*+wptJr!K}#dlifQ7a10Og~0RWzFOG-9WqhZ!K#+e#IoG+8@ik=vi|HxW0;})zIS-c z2hnCTMyt&k_>d>J`2cOc3ciq;Ta`W>c`Dkw=9B0c|B5Rr>)@?=aAe@4r8!%6uW>gU zk4ctGzJD2)?+@nE9=`h7$Q3}=Eje~C}Xk>3OaQwAk(T=uY(bN3)^Z#*Ye$ftB ze$mtX_VfR@gML!G(cd>6u0#K>FB3dhd98w|IKC5qOyN>_mEIJRMnO zl^<*b?j!vK@v_y2wCs2~_AM*jZ3ONm{qKqN!SQtbhOG1<+*?BW)3ahluf$)6>OuGZV$6jS#mRbmCr1_x%uz-{aR^bjd9udp;vRRXr3h# z2XfaanIhH~kF>L1ZTed`^quVCth1RjyM&s3Y3AL`Au;{j2yKSe zw?ON`IoL?jawo{Zhi@C(YNV~{+;O^19 zPcwMbOyTDz~R#A#V7DXan1az%~b5A@AWm_ z+%#vpIhFsLeOH+;^Zp4qS!!{M6?9I~;E%jnle`+Mbc11!WZ?PuvbvK!PdEE{{J zVO*}*5Nb<%wR4dT$TNIr`r-H9ucFYZ&t}=qEdQN&UFb)gb?mIGj=Jy&vAS$l zUC2VKF8tOj6vxu#h}q$uztsD!&R}MNTYs;DCVwy4V6#GfdH;4<0eAMLz^ zcgf(#((|2VrJd{i(?ak<`;x!+ zzfSxG+GCAZd9XAy1fKaz^zl08hI_Y64d7IR zo~AW%zmRmTSG=PFRT;J>$yEEjEB8v4Yn=B2U)R=A0m<(JMvisP;XTU82NBu~HBny+ z@*Uc;boQAWq9xMROXIM#eiNG;lIMht)Ty~Z{$S!s7dC8zb21v+WZt}&zFBe^TB+oJ zeBMV_bs@GL{eGaEaotJEtDm;lqmQrVf6=?}E4+HzFAqdxHkUnyF(PmwZ7Tiu@wS(c zUwJhyAIaaleON&GR5p)1iL_%%3y$eX8=RE(!L_9MM|Y(4kGIhQ1MzC{`<2~ikKrB} z=#fld?S|G?{ev`y4gm_Kw`NahSz1|l)V26Jj(ZR7jTJ>TbCLe*$aDN*S0B<@zkTe zBLmroe)q`km!?FvK5j&|JNla~*ZU`y;vaU+a%2Uvq=%loxAJU#e@bNc$5Sj{k_W7G z{GjzjUpMaI%z0mhR`y<9)8ry%j%o-zUiWG6%j-X+|GM ziqVwMH=PZ#r5R1FD^@&O^M(-_AMdZ|Dp;On=F!Jp*d!D)LH(C+NnNi2W(zjRmU;e( zmylojMa}Azz@|sBORnw`2(IoLXxV2(Hs54C*2JERVBLKCPt2y(_-l|~ILYSuIC$4M z_UHd6!S8?~W8>3ZC!2mp7OJ3)y}g|Eb6ICISG27p{{C3nLHD9e|4{W3Bl5(*?dD1+ zci~a~my84R+2WbkfG>Eqfc@euV^UxhWeoUwBX+KxjM0r5-lkpY=zuH6Rf+~=!#xfS zxaS(1qKvur_r3;h@xAu@RUZ3br2S{c#yrMc{Bk*IbE)4YdMKQLKh)?@?R`e%@5K(& z*4>CqecU_Dp2q!ozFCrtcn(&7^!xrTBQ{Pw}(Bc7X~1kyPWvBkpp0 zr6+CIQ!XPl{J{0l0eR$ykkwlCR6af>;bQP`|Fplawhb``;(>fn(IL>gd z{oH7J4fxydPmLS|wp`$s?WE4aqN^rLJc4Q0d=h1r{=H?aWT77V37~dMm#{4w@MA-_(OSuoEnB#ui z#XN7c5h=U&4ETVpHi28#=7LRdxsj&{zBFbU8!wCFx79w*f=4)=22NdR#<#WDE>lvC zh%3WCv3+?%x;@8;WbSjA_J>l;?By}sHbMgl+;#=GMh9-YhM#4fAC2SIZs9gNoWZx& zT;VpmO+HLzGYqCA&M~kKuHRrZHEib`6!^Up*jsZ`BRhdh_W2+-vl`$RPHXP-MrOP{ zH8TCc)X0>RHTTynW8ZIszbUxg-;@hJu{XX@3Z4sX8Eu8=iM7;MNIu#0&YR^hg~QR= zDWWO|9Wh4A!29L4V`9|+tR}quy*@q*oiHT@bWc(n;NOc-aGA$sgYaybg!Jc zZ>nV%saYD_8l~L}E))IP!(n_bSFs+;zw2h}E(7WHm$t7iofersZ<-aCV+wbFDptXolXdsou`iUe#wftnfnQpai*X1pVQ;kekH22X zw`t?2MHDwezOE*`_v8F&kp}oYi#kKB*Ayen1nvgPY$vYQ&EO#jJ;+a>5L~FN%Bf6u z%GAvO2b4>c;k7F=kJF!lOrkqL`4DzE&}v`F&&Y%s>Fz=?42 z^9!+|@f^W(74uP)HEMo*-ITxyXPoil$N(qZE7VpDCn=%-`HAt^^lu6xS4Y_kV4X6A zSo3G%#3P@V+hhBg>uFQAe{;k&=JVjAfw~g-Q@I5GRMu2Ec)dAZF1bw9mJ!w&d98Ow z5uf8Z@aJ_DMkcYYsYZ_U#MhSv2?dc_+49bG#t(az<~~*y*9EpA|%| z{JbEt`pWc5)+u{eEvvTh`>ZF1Ums7|0EFMF_&F5$dWq)J!0$Y8yM`E2F6tM4KjWKX z)n9Bkpu=9_>8!`Jw(tZ0)%_+%rVW@J(fN{hjqlRo!6D!r{)G;Y1;a6%d-9Bu8(qZN z%A*`-(>JFYiMTgr2uCL9}9lqGYv8VR|=W27DqgQ3VE!D#H zc5r=FFXG0gcdvMty~r7cBJ8S?s z;lF@a(Wi&|C+4w_TE(0sT>lkZ>rNxutT+ID&y3^xIP=U9`e0n(IC@ncF%p<}Z@w8D z4{hF(>j>;v>TR@{py? zDKBVT;q*^j(XVylJ$Ixu-aLZ3?(Wj~&!16#x)A}M$UDC(Z2Z@4-o^uzzv32KUmA@+A&={rt#S4*3L0;r&$rV5Im-*d#RC(5lHEG-)Q3i+^Xc6aPkv%+jDBHn zbOm=$RG$ae?VflGIB>4pJ@K4pcTX&*|M^DiM5An4WW}$#G)_F~ZM+2>l!1fsCkh%{ z?lc-Fo-Ax^{<*F3C2-I}|8JrHicg@}1d7GZ+9aU0l^fVM|2P&ii#hse^ZWtUJv5Ux z?w+_6{ZKkk%d+l`<=_Y!dt?Inf6xEPxKy30JGoxjD?-F{s%uC!pP_!ury=4qaUMHV z*D%do3m+AO+hO2Zvh;P%^}FL^AiRf2ORP^1Dc));=fRE4zjW?VIs{o!~eU0Nxmh8{;mPR<7u_g zHg~u=j7S^l)iJ-5J?!}s%P$X~k(5AFa=G@@&T{Qtt#Ug^_oG|Yu*R{|Z=Ge5zO@z{ zceLm2)>+P*W|d<;Vy)24!n6E6r5k?&o>}7r*ax%l{5E)AiT|u%WsMT?xO1$#h90Br zX*l%DzqV)KDZbY*MJI`B8fhFCj|U_?|_wiiaKy(I4oG# zB&U}dN`Jw^U0J@BzPz*EPTaK`frUxmh2sQHZ{d3aM)~!4g54|{R(>xyw6SpDEQD-S zFL=tZOO{Qve0Odpy^Qn|*vUi>%16DieC|ugH_6I(1NjQ$`4VHw-hM~>Q%Lu-){vje zR@NIq<|(Z|4&!f-(2@R=?L`Kd=;Ur4@&1DNP`FOoj?F~>YULcd`c~M}U+ghF0oQ_p zZ#nNDs2+emeW}sZ($DzzN3_3_eERNbO$)5*!d#O4&EG9>D9yjOlyAyY#8WbcHZ8fO z`t7~(%ac54kNFC6Ud}v73{`9FIIC#1x&m2NxtA>a&*$V-ECFN4WbSt}Hr`HJ`FY&+ zHZ}I{)B9B3e-?Y6ulJwvesAo3p5E`}eQoSru$8an{gv4J9KFB7`}?tX^|AbYN96Mi z{9Kpqvg}z2-0B%!E&QGC*O6sgx%YZ(LAk-!y~p!d2NCCYrQwbIAeG#a@N3` zSces)8k=M%VoiMPa>g*&_wlE!F=d_2`eCDR3okyBzqNJZT-L^`n5!P|>M&)i$VVSi ztn#_`&6S3GV8FwVcF>LadHI#`^YaVxYh~Zi?Uo;0_#iq$Vr+BS`|B86hb>S&l(D^@ zvCT8SZJ!+a=qdnEZ=d~84D8@}CvzwtbtCmaPJ|9X#2d+sTvo z-;0;3D3_pZ>|HV1cIO2iX2C0xC+A+e6|vftz|Ug&GtRov|B`X}Gr zI*Pq|=wMKfv?5?STD#nS{qLJwC+gcDus6NkJ*{XS=LR2djeUFK<<^OVu{{~kljyUm z!QJbR4eo1CUH(l`6Tf#{O-1iCymZ^k*t&*{$DVTe*F`({MO{0Jq75y#z03Dot}r%D zTF^cr>fBQF^nII)4m`f8=+ydP(L1S=Zntb%cXrkDwo`9=it-l(C%C?HTzlY+u|=o0 zR~Nm*x9HzqDk|l>;bko@4xepW z$vt2fI_HDOkM}%PJY>QAtrr-56^^RaqSM{ntZ6jm-nQ;LziO@5R?na-y1-EXU2fXjH z=Qj^{1@pWqYi5@NZ{C7oTTcP+0pN`S?>po3oi{BQM!km5ha67eDFZ(S;i+PnQS!kk zeB;5B3p}~O&%5C1TyQi6967+z3VfxE-d%F=h4dL}i=Q!N_3U$K&kcTB%AGF8>L$ht z{7ka&Bff>dEPfRoJJ7F&VJ{NhS5Y5hgU!;|Vc?@BT&{!%EZQwI7GLdVT=6l8!hh_a zy_pUTJC>(b-WtR%2LBn$`&162T*?boPjNQ?sVPQEh4Ok0qhcQ4@@*;MJi}38xF>&I zH){Ibt?U)X>3vU|&KRboR&1H)ApVZO_;F}{Y}Y;&Ti^rE$A&&Sde1)bfbMS--6Pxf zY`ETLj{f&O`#xt4ch{d@qgFmds*np7?3OXPo=!GnqI-qDvp^NYPK2IG1ITRnUp}tPwi;1p4`Cxl#E?#(5-kbPaUm zUSU*Dru>E6^EYI{ZClrj>X8$U^PA7&w~9EwUHDzTV4W%&8G)}wf-ijd=vnO(i|iwC z=EfGFx+ixN-~E5AA76`(`iX63)lUqRMExVEe|it`pKt3t;6FS6jrcDAS@5U(I3rck zfxlky`teaw{qKV_@n0ToG=Re)3+8Pd3ht(YyDs2X{d);~uE|c#c`uH)dh!00-^~7_ zC8zSf%ZIeP;raqo>#{BLCYw3vhsp2BJZjL!VA?ln`vYLXzv|6%Xm5)6k2RPZ`9BPJ zrU4IfAanpZEcvJPF}g)b?$WZYg@d~xBkaDyxQr-7Mw9|u?o#*GD1KeZGNLMOduTx} z-OrwTGA!-H$MT}%CtwNz(?`Jc0sJSJbbnw5Fbx5w;lOk?FeP-T!{|Q;us3Fa>vH6P zAO93Lb3XhNFovXmM~1m1!_WsjMry^GFqXm>g~W$xF;aZffl=oTB@4v=k{{@s+S^3u zKcDr|(7@q5!)!u7TXBQ&*je+Hofpf;8dUl2B;WnSF&z=x-?r-dP2XbBeO{*8Ux8}13 zmVV+#1{bn!V_xOX7Q3aNFc&r@#&TVpzShL)>paFWk8wOdPFs>KLEzGu8H3Yu(CMr> zM>J(jSv5N`UT2O~)zZ9X=9GZsg#0XH^u(GBJ+Etg{+R~-C}!6IXsC1kN$r?_5-^J1 zK7`)#fKBu!JB8@%D(FmeeQTViq#GLU^#6Mpp(n-kYB9R{UONNE!`Ma=^mLegOpB&C z`xO3>wI;M^gLC#V+Q9$eJ-*w(Q5~=z2G$|KH(7iD58L78n}FNXJq6foJ`cDP{ygAs zBJ^&9-Zf{pGiMur_uSMz-t82g#6v@%rSs8!Q!~90?&4@e$2^wSzv?OR&%N05qtKP~ z;RD$5A4E2a4qe>a)1FrFbzmx@DXdI zWE=CXfp7M1=3wcbmAof(&L^0k6TJPO^v_qBM~8O*?)>@z-{)r-oAS{=pT2KvhaTyI z&Z-%M1I%wh?5?dzdSn%88NdrIg)21YKILVM*Wu&vqBXZD?+EByb+707Av&D{oz6{OZ#?e^_)+ta^0on+ z^3Fgfl%6L2%uD;p^qt0>A=xMyE!kWJ&r1Ha@Wi33Bu~7=7|6DZ4{uW;G$`C-PdklI zRK5_tl$__%T<@ke|$!H(U9cR^GWjTuxPdnKNbJTz}O^OK0H9* zB@agiF5!D(jG>n%(WmM%&hi&s-M7QOaOQmi1H=z)_{8%hhEU`(p6{~Gt$t{b`2@7v z#Q*J%v7vR73nQ8M+VAAOWVoF`LGyK= zk#D>9qWgu`ec&_~0k`7uSTPGLvE3%WKZ?DV_bT+&;NwQb&w6n#?>lKH_&Mv+lhya@ z47BQ&@9k{T@b$6kGHZ><4|)GE{=P1XU6gnBu8#$)*z5Wnp6d4#b6wOMIdXzC{M6CI zW0ZVMew}kTXxV?#LpoPW{8ZL}toaoW?PTFT_FsxW<;=rF#4oDiti#oR&|bSeG?lX# z))>gw78$2C>4htd(e22^_&xF4On^|kc+dY~AeE$W`1fOgrM}SYb zdjMF4vxC?s4+w7$3Pu}uI$UsC{5Y-YUGS^$w`fTWf4YCn0sbaguqEQf*)9A{QoOhh z{Mjoe0WbTkoEOPvPcf7Itt>14&%s&vg;=(P)KG$dV(rJ`Pe!|X z|BZf9;s>J{5~U zEN6`ktfAfA0`i-A6xm;&caFJ!bvp44{d>2p*pyz=!Wka+ARCZZb;zLWyVy+0mVEYq zyxrKpz>nuweGGHyjW$#9)mj>eJ2}r58T!MRuao@Kz1L!F!=%U9h)-y9-(!}Tyt_-zzwb>dj+rXuo7G~(5K7pVLr3j%$A3USIPOrZfUlX zZ@Z)vIlf4}cJ8UdeFpgyk89P!_6ddD9a8vKUQyx6iMQ=q7_)1+*xT?RGl-G%x#X^`-Nq_7sbw~vz}R@8lGi#&K5p;BYA#e+LudrAui#o zRf9@-5^uF>2=P~To@*(-@b7ggy z{a|p^-OabZvG0!jmacGsyzkS_+Dco~aN4czM+`!A)|V+i_Z;#npUUquBBkuvJ&>(j&et)b-xa=81UWi z&-sBY-(2*lbz4+tiCOpd56p&nH<*{ApXfY8gtIeWGcSHaeQ!YzwaimnXmfKL`O$Sc z;};Pt2fCj@I}YZJ{q{`mEg4|NiK-{>2lx|w$XSVZ@yiPykI91IDr1bBHX6rwT@*~U zH&xTmp2VNO5L(rF!T#W(-iHmJ{$ezL^Ej}44jj)dK`%<>e3)Txlh2cMqyl2;)@)b3 zd;`Y9tH#Qok2pzbp&CcJ3H?9P;^=M4_s7NBv;8N?p9CD&8)FnFp%3Gkk4#vE?V1=E zkqq8z@o(zEn&t~f#&E@^=|(-xu56#y<7XNX`F2fJGzIS zXYB9en@!)Z_eMr?ciqY^#N3@HyxF01d=5#gnPWtHDz0VD^=1zJ3=SwZ2kEK45s&n+ zbtbY)NU;;FGm_-}fIE*B+gf|tI^!xCq45_!gBkWF^uEPCg7o7X&7-UP^d$F_{-#rICFuJQ@@wat%DB31CW2DH?mJM3!T!H&iQM6{xaEfxrP|1!pj3kmhZa`pPohh z3eZ;)W3Oi`<8Sk|PiW@3YJae3HUAIc|H}Q%MLVDi_v^VukL<52GX6FGwzAhJ@Vw-< z;2T4V{Jz*c2c3lvvhL>G^&Ng}$Je0?jYP*OF#5DX%g6l8dl#T{xLJ4f{>s61o_#7( zeLp`b8T0I;-pES}%1%CdYuU+XA4gv7-_Y|Z{SQ64_HXNXul}#ZCvE@Qp1}!nJ?BwCCCd?voyeahZp^vl?x-3YB%+xa$YH*V)pnWs913ESTH; z8_ry*jk~nw7owo#r6M;yWIJt-f5?K+&E_?|L;w|#JOX}09SLy1n06P16|t} zc$&rIIKP)D{?!H0p@rw++$)4mD4b@4Z{gareEDhkJuJL})0^L|xvg;U*dqI_r|Soc zQjF2wxIX_PeANSAM;3N0aGUhtyUgzx4bpoR}Yu7UKLg#^HBjF|D(85cj=<`T? z_T;Z9UV3TiFPa~w{2uNFY9Q~c7T+Ns;3HzCRj59Lylctx8|vNTKG#`CzL%G|n=RkP z-fpMvFvEu~&>dN7(NDK-6*_zM2Y72w?j_D)%&n5M&|NIvD1LYBB?N|X*VEGu2WP|_ z6`Sl1<}63WY~GjgQ+%lq{y)v|h0c+Gg`ADW#&LAaUtZ=f`QVOY9<62$s6D{E!+u8% zenf6`LJv5o0sorYh&$0#&Ae5J{$8`1`IYohhO&hL4Aw`ANlWE`^bAoIP>QR|G} z`i4woPJd)h7BXjm`P_zVvjLfQ5q*Dd!wu&8h7wbA$GY`DAkPoU^CPpi6u(nslI9b0 zA^RQBy!`lAVrQn~Ma{FEuWO36t$E+KH8!^{`YU~l&#m2j_^LA(_Gg`Q<{bMJ z^Xg=NvtQj*H2KxMqTNYztJVjaTcPa^JiSCcz2Uz;$bko$Ck^H;;cH_Rdg9K~=Hqv} zox2>pD+*gnn-49_b*{SmVhfMDlg2}tl?#5+EL?h)x}AG`zi1w{fV;Ksj^R~nC+*MP z#M+{zi+4wKncI2FH;Fmd-7NUA3H3^4jKuSrOEo_{3C}+P-DfX5&pC=a`rf4u)@Qvo z$LCUww|quMg0m~hH;TJ`zIy#Ur+k;hAHxqsiA9M_rp}%Coq1Xv0qm@nFO%UN5R3oC zc=REC33VvnOY!FqGZ~Jy6?c+=HLJi;LOQyV6@J-KQ@w7wK zqr9H>SbCx^t&g`+&tUQ$A{ItQwoGJd<_d*BhcGFVjEqpw_5~^=T3L&~si$ ztWDX!*<-Cs@zIn%;zZZb+D>cJEbde2mtr$tiuP$-4GwD2A#X-c6%Gu4_ds=qe{Z7R zo3XvBok<@PTX=rl&iFZeOg;V4Gd>4*vLz_~r0faj@k5_q?7lX3e&q8a;{O!{Yv*vAYq!FD;y3{swsU~!( z8gwiB@t8g(*aTxw`T)!?2){O;J?E<62(*=5Z;ncKzB zIb$z%&bc-SBX$=JT<6PH!*6RR$jiA1!F&TyH>eg}FP}cRzPIeZ?5* ztnqQ^Q88^5LuS+b8_bUN+9T1?(9Xj(*n;4nhs7@m{+SIgt?Hxo@8FR5Wm}ww#6RMP zo368X=V7IL{JjE)xI4zjH@(m1nOOJ1zt%dc+{T@r%xUws{jRu-m?@LH*WB^nv}wNw zU$cAA!Z*b_m z^GSoB9C7%*oCSO}z4~mb=@rnLQ}L}_M*pyfyTlah_;cpTo^iRVxPPJxWaGnidD&(z z^7L?qzgV;pgjV`N8};|~H$^YHBTDTxv~hbCgg?(T-N2?U{(W{WKsR|$SH6MUoLLMZao*8G1zmI{h|Q6$$)0+YctI}=;r@W zx3Rpsl6cN-|KR_P=+66j{*9mP8socjZ}Rg7dqF?j_cb<;O{v)|lc2Zm>nnr6?AhHj zP{X@m7fgbGyXXk`HTHFaarfzT^I{zSAkWFvzti3;pz@-fL>{^7P&F?y+nR**kUl3TK`RX>Hz3wqJ|_JKGu-a{5`+=e%YpIYn^MLDL$+QcNQ&y|4e92e7lix$$}1rpUsTTB-#>PY3w}y*!LN6 zIIf7N?V=6U;|a#nRfqHdjmswL9!WmUe}{;9rFvDTp2K;HFYEi=fF1NkY+l|be-C4{ zr$>zE1+QRL-KtaY3Z@OznH_Ii^?1C!0yW6RbK~`9s@^!gtL_B7s}0e*?%$N1GoNuC zIUl=mobDUu4Kxd(dq-SWiq4JYHI?Go(a^7WKr~+uuZr%sffLcYY>hg1J20iTa&8=U z3$JmQHv+SC7~&T^R(+^vppd+RJHor3AM#v7xwFxCT@ro2t@24S@soJ@zw@l4{MqO` zxqKV>${pEZ-_M}$+L&w=jis=EEjX%{E^Ths&5#2W5h+f41uhZip}UnDnGAdOl8E zZ#^F+797v#$9uok`KL4QDAoRu^Pbvo{*_jTqmvq36U&F5% z2V~4H?C^ruvO)baJ}04re6l2_NBsrcugd=A4x?l{Z4hs?_)gXjhncUNuN_Ft!hy^y zU56{?iO!zK;@xJ3W@9sd6nGWqa~W&?a{D05zOC3M5yrdu+8fQkalS@;J7X=rQ%QI+gjSqya;(Ey`{E=v(=1) zbP`J*F+bM*+KAM7dk3n~SM*KxW!a!>caxWKt!B>D_quu5!^$)2*iIdT;(F3H>i84+s+V}VcOf>njUYy4uso)>WN6>v*PXJ$we*+G zs#|j6@9}oFsyuDzdorwoPw+M>eV*k10BDnSV!T|4=gzZ~6HJ1!igfX6?UKSK`Krt{ zjJ{F!3EJ7eVy|R)tIZfgY$_|plIpEpVsBc-yYByZk+LcmwP*U;8>$AWtjYvW#o`Ak zug3a!Y6BWL2pq@bW2JdUa9eXCW1z7c6vw$>yNfc_rP{ZS$?^MmSNp$GUEtd``1COo z9c9PyEu7q{eDsTbcuOCxitD2*XT^A5Hku69hrt%zb(Yn(2Dr{ecX$pR;(7E2#UWYC z`cSg_kRxTdbkdjm+sxL1F`e|?8x8ZDi*4pjakysj^Z?VD!59q{ z$IBM*EI3P9^+Wx-jCA!S0ppo{+KCL8j;%iVrt<%8>_YUTk$xm#UyF{czT83|%Hn;f zqYvBZ!^k)sE}nDG0!N|`nWU=^H>3A@+GBmdo7)HrEH=PT}b~=eW=dw?8A&n z{J%Z6w;ei5ABNBecf1c%=))ZPaB^l0j!$`3p9PLY9}bh=F%JINI_7A+>;a{nrEH=P zZ;}3=`mply&OVH|jQ?L{-do){2ExB$BB%5>%oO|+v~E#M{bz?NmM?cyK;N&$VQJ=h z@GP(-`tc&^$kwA;gJ> zGPjmqZRVhx^aIvC$Ky8d$@JwL^(#F*{5W=3bpnfwi^)`>*p8bRsCvL=~f!|`k+Tfj*#}9vaRC-hPST;%X_5PFb4^b*h%q0x6Y)-`oO#? zJm_re+seoP9r#Yh3Hg*~ukw7~n8fq^`E2m0FY)x9q|Zek7Cx*qr8<+_dSO8NvV47r z&+`3k=q@ARc!4~Lu@P=Pz{+>)oU}DI5&k3pVLBi8Y`4t32wL;5kG&s}APHTIx&G zAs7<%RFOAnEI0=~I-v8s!kIxlfnTVu7(MJcaXa+TdRai<)z4c=)A~So`PvsNBm9Ww zguA&(=_eBDoLNq!-$;6bo=|opYSSZnGA3F$zK--f`k?kj&&lbB$$vHJl4DxSlnsfF zHdxroIT?IM44fj8TD0zCT}L?5%v~E8iJ> znWztcVx+4tUl8Z!K6N`?hNt>Z_2}&>=@qSeN{fur#+rW zxI2x{<1**#88O;dI&B=4JTbUu;v2?TxcGNxy5z}G?hS^|oq=yi`-J*G{=W2h`9o)> z>)gBhoR0GU{J!*f`MqbR2M2+J!5!sa`@Zye`CX(ZjmuF_yA_Kd(jhPX0|QNG&yyIB zqXv0iAdheqry=+s`Y+24gw#HC^eO(f!jJOkyZGl*@KZy273;hsTThi-_GN56e2n#@ zXw`V<)aV~DA3e8(xh;nOJ)W{Fz%Oy8pe4#j4)rq30Ck)#kL2Q~<74CW+cWbJw^H>S zzSb~RkDv4;JnYdp$LTZCPvE{Z@GJ7E?F2t2<%_ffi|A1Key;k?&OfKsck}n>i)imG zQQr;ZOW;5lmGi#p84~Vy?$I?Wbdk(3b->~G$6uzH^vp7CJr;Knm zf%GJNSahAl``qW#HE`+K^CbFb}XVnPXgN8*%EE@_&6xhB-UB?f%2I zL2YyJ2PEdyvAF|uFN2NPbKT9Ev~Af4d|qpePBA|OpM0{o1;19m*>Fegd~A^|Gfep) zM>8fl4?4y=^RZ)jGOGrav+g`H*eH3bXG&2!^Y%=~z=}rvFg|5Y8_&LUHopPxT@#<= z>Bio40lt7?;x5Yv?}Jl?`_TIqFB*hhh38*xG)mrg^u&jvM`#%7E@BzYVDIaIy<2!j z7Pg)q?Em*SN)CbFclrI8cs6$OJ;V9hH2mMD-~&_0p4L0}HE}-tc+uY%)J-TgQp4?( z`Jel?7qwizt>Y|t-KprtHJs_$#W|A{TS^5!Ons`B4Z%OIw@+tYQotK$SHofUw|kR5 zg>%?d%SMr&;>%!9Z4I`mDq}$S6Ld=}owGL`>6Gb6XWv@&7xqrnZ};ik!xYLV=;Yl} zXhCQ7h&`}!y78D|fhpecEBMQ_*t_{&<8BZ6xis1aRs7YKgT0D7)7Uo=&aUYLUb-5K z{lpi4n!65M_|Z6fdz>}g1A7kpeA=s7L;Ol#%AgAQJ^@Ey5w-x``B2CISCam=y({D8 z483aaQc*+9>YIt%{0Vms3vbU z^lAN1`_B`wy{YU(a2HOXoG8kWbC|MoIs>=UK7cb+&%4#@lZ54abM{iOFd^#6~&3)x(>k{mIiYh;|D?|w z_j#K>psokvwBqBb`!`<0M(;xQ=|1RN;0N}o_BKLqgXw<`Jd?`%8fbqIIC&rW^>VkA z3dyWoWY+8Uj0yq>1k^8lqyn#i%QbO&{D5cFo)PwCaz_UAKIYc>F*>84b^QMX{&UxW zqg$b=Dqv5iU;ThnWAT?!MoCZF#UHs?GO^UwJ?y{2C`rBbw&r&C6;AAPCCI|!e=fMN zSu)_SHajvQ-SXk>c8M{%UTsnT1LXTKUgu2C5URdU@pU_j-*lp0FEYYm_wFdemyESu z$u66Bhw8qH^7FcnckZ?sJJd#RyB#?bYiByJUj21+jElSP%BVM1XG&-~u%?2GIZ64; z9eu)O;Pzu|?E`7Yofm6oXS|*BX=hxo@y>tHj`}d1x^F!m9TS2Uv%voV#zFPZvZYoe zU=Chtl;m(GpqzVI1am8OedNd)oFXZ9g2QRZXuc-cjqO&k-*Nc#SPLWY|Dbrf38*M(WLLhokl;qFkrM_5crty7R})s?s9Pc4xexv zZC`D*FWxmW$AJ@%VQ`)xHQWk4e+18$+&Z_}pF7bhIke9=x4De}Z^@cu(I&F3_$T)S!+4?$r=c-?E-KrcpVLxZbO=R`3Tjy@gC#Jh-n^=RxRsLywN7QbM zeXw<&^cHN`iX$NZdW~7WEhijA2hf;J;QVteZ#Um`{9O7V*T*uBI-hbsK2GW*{;^gc z!{@3GcJ_7Btuqu;s7rMFH1c5_@r;Mz?^i`%y?q7C;Ls?CcZZRi?`);6<{93|xpysZ z4!ZN5b(xbao*4?=c1II;PI*dy4N_c&&+fOKnU3mpf9z zt>_gK9Nwm?I4$Q=7xx+uzlyqcQkRFi)+E8zg03-LH27L{Op9pwwP?v;XgLR3PT)nf z>_&!KIs^4QR!&!RJ17oPpp$@ze-Rg(FV|%zX4%ZCi?7QInBjjGoZlg)CX}q5VHjVX~IBomM zr~SbpjDer=JqUcO!J}YoqTB*-xu*LhC;5?8gDsg|x7*t^<)!GD`#WJi+6l8G(6?U|Cw;eYY4ybs=$iDsb4-kY!S{`tH=yZH{t+#?Bkq?dJb8j6I^_*K{pGZn zT|x3g@e*2)8S9^mmP~<;L_dmmD4CwDJBI3_C5zeLluY-+Cz^jG&ozd#$Sc|J;+`Qt z^8RB-@6f#qZfkBmV=j{X4ndpUUT1EAPgTd;=nM(Dtymtv@ZGl6g>I^`|H#pM_<^&{ zVbHe9CuFl=5G~`2WXWS|u8-5Ocs)TY9r*H&4r~MmXP3vUn@LNQ>6FK#0u5*Tj{L4Z z^Sc2*ur{we^Sj2d_2R(q&-^YvF)j@}l=Pi@{$e^Ebo#rb@9*h5<7r?&Tg~?@#q{|xRkkZYHQ%J}vp z^3N;3v@*D!*l@%+xA!LQb-2LtA*rq%Y#t>4yVO@R89VBT!btVsurX3j`vY@N*4|%B zOy7Fe1Z%OC)@-27eeA0o#D)&^b9bseNCKjXMV$yX!RAo8S z85zm@hw=Ay<86^)yvrY1FrKHnXkT}2qR$<3(}(KAM#P<5$FK2&=Dp_m*gdPY^t*ug z=x)}#i8eEp-@=v7Fd8B1TKsI3{YviRTsxv5vTi(dL!V}H))O7<*rHsUbzXfZc81=} z2|mvB%KovKGew_qoV#5n2=?7A!G zGn?WF4Tzn^CT6$#_uyb#$q?c)>P&ts@UEr*>;V?v&iZZ=FbmEXfsgx5BM$@XQ^5H? zbF+&+l(9A+%=+a*qgz{bOF?83ZS3Ma&2KWg60*c!TuA&d_33x$QHs%CJuCTqc`QD_ z;ylh0(Jz}}ufTQ^SV8RVD%L}?bNHA`>4>C0*(+AiC+4L-g|t_1^r|Se#rp(| zT6@33JRRIVxv9lw_*N39Z!Kek-=WUqSmz3d^|zJO{JJ2b{(4Rp?knhsVGxUlC||^# z%oo7};E32PUi1-sigd=*ieVsJ)l)v5GY|RTNOjk+-Yso)aju~=oM#-fyS z&{g1jBzml9sKiRxV;r!c5C9DN$mAuqL>O-&bm0x$6YL%>YYVA1;%GE zyxB$ce%FNN7F!pK-s|~h(feKJ@~xAHS8%2XdOzkd23cpbY}lPdOFdY3h?f3>9q$*& z7CUfnW_)&X28Z$5VvxkgRBZC-J>kh2mw)=JXcnT1(5$rsu!-?&9ov@KbEGN%Hea zzKd7HBN-pW?jRG-oI|-f<^=05@%Wq|xs#x!5c`%1xhi^kI4)Q7H5bJBTe4O0OLR_i z82F9R&$!d*=S7{p1ixLN70Jt+pq27Cetq#d;HJAqa3(E=U(ErE6(YGP{w_pbwtxfS zH@FP=(7{{}bXi<>m^JULw8bm?Vc-1Oy~X}FRu|8Gzu^w=oz-_-1iU@@J%N5LI&^=c ze#dBW8vRz?s?!f$Cfay2j>r8;_!NECj<@9Qo?g%ycPRE1O{)KrZNiu6(g2@2t62;E z9(JS;UkgnKq0J!af5OHnJk~>tU73GGi+^TqtTXVtW`U~?`4O8puYew7^013FXF55< z*Ewf)vG~n-SMr?MrNSAHiMV1 zpcCmk(tUQ@(kj+s|CU@9j|wMdGEOXcdL}*`6+J9@nv1N7@u&7)B!AxFJWnV6z@Nxd z@s4;bhL7}k{Gx(LnuU)PpZmiYKK_UPDsMh#XN8YM8GRRD2_Mp7^#5O3r-(m#K?9!_ zxShcbj6ZTsdT~m&H+DbOH{3CZoRI!&rENJqEtnspVfX9ERr-&fc3rTFGhNHU3p>@UL!QihoCmB1eG|qh++ej;4SL}+X;V&Ia;~bTnG%G(b zORW6eS=aEb`l5o!YonhiF1x~C{PB<1-VuCb^Bwi8S2wkF@fXh_rf=K14R^fu;Jw9z zsWbhBhC6cMw|n?rP22U1>2u5<^#fS*bT@Vs4F6qm^}H>2l#?!gD*YHKRZ6w55|iqFM8N3-5lzMwT|*@e}?(bnS!1ZtkO9 z)zEMU@-*<0`a-*iF-eVzqOV4%z-n(AsAvfi@~~< zb?}*Rymb~h)c*t=!czi2YEw8$wE666;Of=atgiBcuYQb894FxIS>m#6sNgP?oK9Fw zYphPk!^X3;ZvuCseJ6Xx&pKui^J#GCp;Y6|K(uh*gU8X&gqw?s&HtI~b{<0isfP|X z)Azd7ea+|4Pd8NH!^nP6J@lykz<0sNrX0@e1H()7Lu<5G&_jMp{1(Ys?y;`0^gL^x zP7B$tL(kLPqaSymL|>g$6w_mE;gyV4GxK&3+`q?swv+YA|I6CDfJaqb{r_h&Tyo=P zq67kS0Tm%cw5Wh2WJ2&#BA_9yttbh^3lPx?Z3Vd`ToiR^WeP1-kjx~6WD)}SB4Q*V zL0fH$x9a=W_SKRg`f5!TeW}H%!2Cbob7sN>V%y*Q{O5VjbIzQ-&%Ug+_S$Q&wf5R} z#*~{iX4`@}P2tjPN8187A!SlKUS-`=V)QckaEX~-5=kF!@?`0$4W*lD#gR0NKfg>n zW&3U6EO$5S9*s3Sv@_gCnk4eZ+bsCZH{p|5mwO(3I6u&w zmn`@!7kq%pr}m^#Hey6d*6)PRG7CO!5%|1Jy5^~uO&HwW6gJZ@je!s8QTUi?Ry@0S z&T^hA_|Wetd`f^#k=(pC((Av)=+eoIV-7*tBR^Pgz7az*5XPwtjlN)LRR_&}K-p5zLT=U~c z+>>&n^fPJRhgn5jN7}OQ3x_A&=bTraRZZOa7JOITwCmdIjH@0-20VytvKu%ZS-P^R zh3g2hKf>vg9A!%*n8T`>!64t)@U4$;LYMB{;;}tl@B;8DA6~mC4*UEAmp-%Q zC%|?q@JwgUksc~Pevr2xV^e#V_m5?76tSp2ho@G(n-a9~{-^x+fKSCyejhvFL2yt@ zTc&bu)Gs7o(w5D=JU?rqJ$BANbh2Nlc!j02nTF1}1$}cne%!<18zsho!)4k(&HoB? z7zxBRvPW=KHvd@Gka@?l?%+O&d-xsV&TQN=BOK1YukD={;=5L5m4L4@Y|8=0*Gg#n zI6V4g{2o4LzebpI8H&NpCH$u@pL7@{x`0_Vm$S6w)R5A_???HU zQ-0s@yy2&QV>7Oa50(8)V_`Tx7?;|6d50`3X>u;RyXg+DGx#p(oPg$}iO>Y&hZy|f zC6`JU^m})F%Hb>HQVy3Uq#T}LPdRMxe=5(Dx!;UUwH7>8y*o3w103xio2xidUo>dH zIW+$s@#MVVWe>D38_p8u+ER=5e>QZ;q3kH#?}pCbNB@8DFzaUUd;psN1ijW#d>;;i z2Qwar)1v#L`5$J@hTa7~(R;Wp>%N>$nolz0IXyMnqWN9K;%R_p!b|UKay)cjQ#f7y zn}lzXV$57_%Ca{B+Xi%9qWkdDh2&d!PCjH2Xg?WVSWS6h=-%APJimPKh^}K?<2#&`-8r_`)As1t*0{FPtTDYaGNv`2t@mfgveDU(0i}mD zN4z7sm{{ejjlw-npTr@StD9`=4VDl09VmhylTBJ8~TKJD5K18*Xc?OtR#JH|@Z-v$F;r1M|gR=7#`uExtF6{k9s%>?J99k2>}-hI<9iB4o6GGtjqKKIw>60fAZpocNU+XO$1&hOamk?j?mG0lvZ81^VG<6z=Y zA)Cadn6iBUT6BS9`daFR1}cx`V#A2*@RUF!j7RB1{y>}!wK17-9GgE0`iSOlokRP{ zE4l9M{8iF4WL`X z;jd;=SET-hGp%*&Li`=IZ)v&aNY<{6+@DS9Z?2E3hv$aUupb297!W*RA2>>F-j`u( ze2z6&J!``kSd%3(PW{k#O}~_2E%a%Fjy&*|9img{*9DG5ul{$n@3E)XPaS`UPk+h! z#t#jPZndwu2lOgh92n19m-Wd}bI+*gZ;-j4xyYoyH1El{A>JZ;x=DW;M_PC8BUX!_ zw*G;81++N_9iQ|xC+#Vto=v$q7<>af^_v;2U&fk_^<^!%+X1a3%Qf!H$Zag{0bDB1 z!GYkyyG|VF{|zxX;Oy}(IN-m3%Q-l>-FnxFgHg7^4{k7?%>n<|?M=Nndt?g*6T#ku z$19%DQfw?y97JI+JP6K$zhKt|2k02p-?KPK^9ufgePBeci3j1t#6z109ND~*ccgb1 z0`KV#2WR0=ycvz79F2d$e^B@Er=BSMR|)>F{6E5fU03)At_Lo>i^4x2c==1u!v84$ zW8q(VBk60p!rw;x0KJRCzn=dWXIb$7bfN|SPbZTn7XJJH3H14|Xzym7J2-IEAkn|z&zj1le|XLIngKzZXrI2; zJOTfK=Hu{h6>V#Mr+L*Q{sW&e$AZ(sh5rEln2|AntZ4Bb_)wJhbmc#T>+szhkYmDs z5cHphKV3Kchq9ya&xQUKcUb(V{_UGN$5rzLbHrwNPmS89e&jY*Qg>qc+Jc=YtUf<} zd2o^JVBbZLIf^-~p(QueZXaFOZ^~$|^sgIim0M)Hs63_^r+vJ;@^eFt$e_n<$=-%r z;mPlE#x?)fE50?htxDjyC%(V80a*e#{QeoPA?Rfs=;)-2Jeg{{ss&%dX{;MRWX+>F z|61x*|I0X6Hh(ZSVf^}ZCh}z7D+aHJ`CfavJ)~)$$U$Pp{&6@yJ;*x9r2TT1psUA6 z>vyav;Tza%(~yzV@Ub3Tx-7b)`+)DeGO7Hj`4JvtyAwdAXre%&VGX*D_ZILS6ZU_dCQUBaMBmCjXuGEz;|) z*c#H!YG3gLXf09nL7NQdCz12Ur00~bV0%qUQ2ek4`m4fELo_E^t7NWgnq&}1D7{p% zl@g)D?KLxlRp2U$bNO!^5)AI?+MiX0^oMuR{&W=ZzskyE_JQ;+V~uzL>ci+v*_4Pq z*@pe)814AT7J7^}$R}W(?hodM9@agDGsU?pHr^`z2UcaeLsKhshvt^){swZY?yRxS zjdAkz;v39!ia*P_abftSe!lxB8L3B-u5pZ8wxDVJLkpVzv2;PxpV>Qefcp^sx3Lav z*odTX*(8GrqnE2Fm+YI!msfwKlI$9sBJ)Yfz>~J#Iy^@ZqV>; z%QjH?vzkR;vCo)w$OZeCVQazu;sT$tyLfb$4JH!vWHK>Na>s5gXbn^pxR2E=Dt_v$ zeX(3|P-50xulmD1St5pNwqwjQiK*nelSm_~HtNudyc5 zTrN5`X;tfmuc6a^&5&>x%T*(eNO=+;P=+uY6tz(cuW4|OyMTp%l;r)Q8;u3!}}zgaN^KD$po#f z-1nnHdo{dI_-#R!7Cpw%CY5J1*AuK|+3QiwdnfBE&*$iqS-WbTkyOnd2i6#e;4j0- zKS%yCz_cBB0{aby>mr}l722zIx8O+owWeM02;+`teFMxlxLtkB{cIoDBj2%KoI{^X zzb)B3{q)&o7>Cto?cuHDTeYwA+vs=Y)}H!&)kQzscUk@PzhL#V_+_h~538T+toqG1 zms@*cX}9*uZZO&h`L0zN=jRFiEm{|Ot|U*i-_dU^|Mx-W9@~+mSCz)pgKxaxD|kfq zOqz8$Ro9xBeC_7m{pfx|GtWic=fRE`%0d_lP6k6^jmXWk*4xKBfaW|n0gp<=k=AmAE>S^G5N}e zo!6ds$s_#A&sek;W}iYm{^+8|FuwlsGwyEgN_;t7c#CjbWsQMpBP?ExKBl8|cw}5M z*93N3b4-)wn0I3480Nd!Ip%%l;O(rhG=4SD1R29M%rjMtU+IaZA07tGHP38kEu(oR z$k?r6o~f$IB@gliJRrb4GYmbMVmLpE9>|ZKZNl;8@{N1@r|5rV53B6QxI~_iOyMsw zOupczzeWPFgwfetCs_ktCtp*4@8qD3HH15!HQY;-KMR}U8+_0FsP#l(vDzH(ZPi+= zcOO&7A-$CJF6O!hS*2LxX_>|q{C1Wdo42LMav5>?*jDomW7S~A6B7=1&sx(M#=qz$ z^soL|d5wW2>O$w_-$FYzH$P#7E*@Y!E57$>f8hIeF57d<3;v2e8P2-o*bK zTvyN847=7Dp-8?O-gL_K=}5HqeMoq-=iF?m5WR|K9Fo&mv>78b11{t*3Vf_oAiq z=>Hf;8GeTH3&pXt@DY5FW&0^wif!0TyR=F69?LG0>@70wBKqbM(=Tp4c46rsOVNpk zd?I8rBA-Hd=*#GXTf)2j8j$KJT+< z@oT<`#Y143$MhXbz#g+R2cEkI{>1r1*C2QPfq2h?X^=f{zfMd5B;{|-OG@zGos?wR z2<9Kn`t!V_*a(hdBe3iGtTINRY%@cD6KrzuAk z9&IFfuSVwm5}o2s@VgWK*fQC3Y8Ck2X~L(cSN8jr^X8oTEBm^i#(opE-IUF9pZYk) zez_C)UIxzQaGhB)5Bm*gUx43g*3+{8l+D8~9kJz<&AUXt$^%A%vr?`wV?O}=cjl=7 zI$wb~^~7YINpod@`L(^T)^j~eld#{&x1$DF>AWPhIe;x^2l@ArU+ePd6N5@X?^>Mb0c6_(*!JZRF=3P&D=DGk~dyu^prPyso(`M{)-Zo+l{Fe9k^M4(F z!pC{{kp7vX8+B$D@<&ybLW%KSa?Kfqd315M2M)sR^wjtiXaCMi*iH#?janc)} z*e@tIeV{3~N3>QAb1 z*nTWr7&|tP|ck5&5>KE=zKcx`9wjtybb z73V*ipMBqK_k~9?mZR_7?2U`WjoDy$E;o7PD9Vr@%wLcxzQ$ktOMCpN+Vp~82Rty2 zaUlKi4#x0qWS4;5lHCk^gwoCtbPMc%fyIpzFOBF8%rhCETmhq}{`G14*;HQ5-aa8(Qsp?t<<^$2Kc`Is%08O+hZ z$ZsUeChh$J>oq@koyz{6)mrN@Z%k(VVi*3se@reh#FFbOf!i?B1O0MCw_u0cS>@3> z>agh11E2GcvxQoz!#~y*(m0ZQ*46A5=y>W4-zl8^Ryqf;|$K{5m z8a)qJ0~eijl}KO8P5z91A3e8&{!5lN_1z$Q{xIJb3zu%&r(v{e?`dGBXS-RRY(J0ypP~V;d_(ei9)y~||XmA>c z(2fzuz5*i-pP~NVJ^j$fK|?n|7tcT!qk!!k^5)wTymM{+4_87XqAPbiXUjoXS`$?k zq4Ne#@>Q-J!+15wSHd%MLuD!Pc#$(Jp(WAFx4#b#foB}_l7aqU=)Cu{a=2E`e?P0b zC^r;-Cwsd1m~&ob)@0;}7Ub2Vtd%NDCpWSe>Z(d;O#Gm_Bsb*6zjYeV+J~0Ua~XW> z8QNP-Uo-I25MOKNte$WNYYmgPU4hKqr$aG~yzCR2&82TMa+^(+Q z5bp#&x7wEEoyIkpzFtX;lrr))gZq_B9*D_5tf>UAs7q)hlr~q zov3Fa_}|IeiWC=Pcw(`m^T^WFBxEU_8Z58M9?4JjK>y%ogcC7oz{MA-Df7 zIoX@sH`#kLv|#{u(}s*L30?AGKlpaxALxe`OqrlQ&XNh>CBpk}vA1e}l=wt`pSZ)T zxin|Zf**)CJk2$m%j6BS&=3gZ zl#4e&KlRXXHT@hQ{y^U!Kwixt-<9aPG-sg4^_GJ3mU$1Hss<$0E8KiPo3#3QZ*r%8P0haTU94i0dMKbX9S@1s1TXkKY2 zk0_d#(IlRtc~Lq6$q3TBnfv^}llVnA&SCM1SKt!`(8;>4bi%nFU2Wns_`jwrovfN> zy^GQb2USPx=KVTKrxLg8x`?cnXB6(-i%v##l8!D=b(ZEfu3|l)xkdAh#=OS6Xu=%Z z^m##YB6N+N^@=fDilGtt?~89#7BMH=Y==#Hf(HZ+#5HQIDOxjWVFI|KTxbef=y`Z3 z@?9CS-E1z6>$5z-TI01CHj@Vg4oq&$g$D#?Ap?L@@sSMpvBq!)c+hx%hI=*b&xDRO zJ~PR8E)OvG4?!>W*h&vVANpQ<_QV4+zJUjn;h%gjJYWvrEaV%>PTKEl@qjt-fYKNq z;BE>4NAUpd=d*AOd`uo-JIe!(G1rY_t}BBdA}bIFs^btbh4!pT@I6zN=<6|^ILxox zgBNqZcslWz^Q7Lh@Puv#rcr!1U^6aaT(0C2UyhE+BF1Dcdhiy- z>_SeH{zN=MV_fA=r7e|Z$SRDv^;#QK?gpO4qm#%t3_ML^99g^;xpT=C=DtA5oeP2M z57?(u3alk}3dSorbJ67CORT-sN#H{ApvI!)$TH^UmDr!HJfoYW+Y(HRjFb-dNZ?cz zfgL(||19*mQ8=+LSuhkmR_2R8abBu;$2**FKs%>$#Q`f1brhqksN;Y2*PhTc+9sb< z`Iwffe;=WLWIfyFp4sh#jD1s0ma1lLjKJ_E_=l5NhyOEen;uUUCo8w`*x-f5(l zPMZ=gycgTeF#0YzS~eHS&~EgO26{&6_&D@@lV~@Z$8DUo?U?d5`5q-t8UBySS;YB} zEr_{H`R6FUOY3N}oM_ob@j%~lm3e+1)6Qg-IncLQdA7uqW7%-d=E2UhfIOA&T5Du; z9e|FIdaQMTE8aIZlJ1H0PddcT^x_2HZISfi?$Z5q1>L$V27KH}^brN}`z^k^ASeH^S?*w%o}WkMg<4k0LX}^CI;1rW;&H zk8ah|%d97$_D1-m#)#6)IIjMlKE;TAQf+0L;ir~KF(k4af-Q*`^C#` z!Cdn1B&~t8ifKl$;x&7)g?r01=0%nB-{H=AR6Ktb>-e?U+oNp{16S$TG>%Ld(7rje zuZ}Y7)xH(9@3cL5C-*y7*n&-J-z(TD<*P6g7{nX<{4>t|`cl{ggL=P_+97S0Uc)ylK3lMeT|Ex&=Y^hG(NyU)|5 zoZ-qtpPax68Z3-g(^`oKO&alhgZ)(A0sJ|h z0#>sku(~w{R*W6#H5P24e4d39>fNJp6oJ*7igza3KXnylZH(!oHAh5YW#&84eV%9^ z%{-qd&spBEC&C+|url);?LJSJa{j11^r;h8k$#nLqAxs0VD+ZESh3`COjsS}n@Yav zOf!hdO`2f!E0wn&x>^OSN?2?6gRY8VUD}k)Qpa_w1Nd~- zp)mv;RL3OJ!g;;Vi(_`Oq-Rhu%tGkx6~|2RFKW=I?-)2RcmvP=ca27aeL34-!Uux? zHh8fg{|i5QvM=rKx{l@UErELWMU$tNb@68Ifl?z>dbj-hpaQO?+w6@)i*k!msfjgD-JoEu)mn+wN_)l%$a{F|9i6BWu4U1XjVNc zw{pKHbp6dP?}z9PS}424=w+3S-AHM%W#1IvwQO_;g(|yfo>g`SWh)j0ddEh!*Z3~} zm-K^nUZDCu#82RnnO1+!t?Pg2!>jb+HTv*yQnGiw^by2jQXjn3^D^~Rl#b@V6*tIE zJu15le@2zxLL39tSbGl_Gu?|-AJ4(!OLmFE4dS1MWtuqg}wAF zywC}Fy1>gicib*`k#>xJ6w{BpD7%C;iih=))9gpj4#B4>F(-aNnI3H7|u?bW%oC+xjPeP!=4svv_A~`It4(R8e%7@o@n7sf&VF|ARSt9x1O5|#g&d=I z=^+p6Pwcuc6Ti8HtD36siA687alu;e*g*gEn*q;lGW(L2ctPkvIqtey)6NT`J z6mMfuO7J9b3t{_vVK;FT-~(SWhBfA!N>hV_fmvQsnpbP%y#yvov1K`6QKhPUk2A}-tl(z#nAS)*Dzl=0+Vy3Mj=10;%??a4L**;hC9PrYv ziMfr)t`B66f`0QAGYOsyO*ibe@jkU9LpqvL>BY+5I?4XgXOATiN1`8lp77QFC^0Dg zhU}*P8$6+1oLx|Jj}bD^vo$QXH8zgr?5HXu^nAZTL7gq_Brf5n7aN7o?(OB1{d6y| zYNYL&6P|k~6&gsXvtm@l)$Lv83Hg`dKey2uUk0%R{frZ9A7Ew z15Gh?6FQGd-|wSb^vR9v*)shMqTlrG?wd92qXI_zz=3QH`X-uxb~pK-d#4aTw?TD{ zAKlGZq~2G)Wo!yOp=VDhXFPrn!_b{$|Hvjj z2l7;15_%bx@4DC1aP1Fr8{CG?XZ*%Lec56E^xL?$av4Lir!RA6Prr?8D_45jtm(I> z-#&eL`jF{cnQtoC(`rMHt#WgWvE2L9fgIioy-IpZthshVl=R$4yx;a?<> z2Hh*xs+pE-rIjWag+K2@TB_lDKAP6wO7kMSZ5lvYn&JCpG%eLitA|f-ypXgZhHptU zEzL?h%)01jgGh53zVAiThFEFxqwozS?P9|>KAPsT(vnEq;3n-d`WH>R*h)ipU%2iP z(nixi;uM>GxXemZ{NqPPl6D3Ci>8gX(iF4#;Y`x5qJPn}E37olv1_j+w)J@WN1EX6 zy-I1ej(YgmnyWp8DhSvCiny0d9Ac7I#E z+fl*)7kkG!i_(Z&u;60Fhx4t4-h}5|a9;Bgds!moRHuJ87^O|!RW5VtHSbW~^OU!g zvYzAlJ)XZx9PgOL{U7`vlr+KdUSgKxY0|gclkU6&AG#Ik*^blmy4JUfb+l-jnE9K; zp90v8Mb}R3?D@bmz}T*`b0#ulHLw}}L0e0p?|txS?a@8SRfRlR#TeE5syF0^$~mMw zn>P0?W?3D@(3j?5@uhp;wQTOH_itAs=Te`ZKj!(|HYDPUT62&1d>TA(YVg@(-wy8L z%oX-;`aXhIkKeL6ghAIYc-UnF+8jlC7z z6PXV`WG*?z9P~ewE#3nD3x0$TqDiG+u&$Gxs~;i z?0mHA3(bk&2Bxy5Y_IWzz5q|P*io=AHDxD*ZsaH zHc_oBev54WK6dclJ&g-qMJ6soHlKf^{YZTV; zY`2#e%za{Y!Hb{PEP8~P#Jk5Dr;};#Nn}vR3ip;7w0jshmR!1(`%|{^g2xgrI$Q|c zdaoF@Ww_jEFy%kkkN<<6TA-}(3$CjNp7@>|+HILuJcQZM28kyc(JI>blKZ*DW z@=T0O?+)T*?cjgjie+!#w&H~?N5TgmuK_O~*;5Z!rVj|d2)yn_c4~uH93i%H4YJ5O z#(Pzs5n2NsRyq@d>p0U#F$QF3xqZcox4*aIp||r^RBzFlIf_YAQ)Pti!H;Ox3T)TN z4x*@>Z>rjk@j5n@FE##`?m(gYRElhkRBmM@$cTt~Cm4XF<#Ghdx(YbfL3M(8tvI zb37rP{j_WBcY=MOj{&r4ZyE8?;6wd6qp5x-XY@?K{*7I)6@P$}#5ejFIZ&}>I_CiV z5gqtG4qf`gror=BmHXg%OOb!lyniB3*g0`}bNc4K zTe;ts{>#2$WRzyUIWqCd>CNOl!qrUL5nbtbOb@3!rWf@jW~yyqM}XKPZE^iO{9}mo z0si9S26#7rYt)vCB@Z@zg=}(iUB%%23oaYqMx1BGykJM(mfE;@@2%+b9oQ8su(2xN z8S*)L8WY;$26mM8B_FhQYoBiNBv^U!k(JCm@U!#E>0{+V2D0*8*iD`RR-PpIy;;tn zZt`4c<>^2+GV=`WCeI)%&tYUFGmpEQJVUKKl9kLnmvocIZRPPIGnsitc9Z84D-U}J ztUQ_B>oL=dO?hx ze8ZUjuQA3Z*6ejke~agx`DPs3w?3yXjd9hhajtQ#@x2@QU*p}I(2sH1r>=~#C_n9k z3+9a%oqj>TerGodM#Uv2ej>WYmg!3LJoL%HiouEVE*l>YFL&DTwWLkIqpc0JwLjN! z`d>u9iePSYE)_(_zj#5%f(7IA>3_@8QP0axud|WVfA#$) zt_J$QCn#?Z<%!?Ozi0Q}TY`!;`7FGx9yv$+t)U*C1^0)AQ#w9pu`|RmRoKo`Z0Dmg5MrISN3H%AG)Ne8aybTTnn~qH~kY{>%c=P zcwNucVB)tI{%r}~HoMg}`LujM+XT}z%Sa)QuuBd+7UkFkAGbF@LKil98(yq9fu8xG9~+!QJ!== zDmOgwY?)45qN)Fg?Z3)wWj&!XKc~#@=9v-nO|%xBV?=v`Pc5|PukeIKL$%C@qI=1x zn#*+dTP?bZ+Kr^^8GURm_%xrH`)Z$vJU_v6P2`#Rwzewr%v@PZ|IGYeo+T@=53KH$ zaN+K;p3~1jJExaT4z@!V-RYc=#eAX5jnt1x9|c_2A!BN6w-|j&Td^&kJI23Fx?~i| zCY}R|D{RRsEy#W@zWDg@$-!=aU!TsUL^if$T+T#Zak;VS^s@cI({^I)mG%hU zh74E4c*}%m?=P_j$MGLo{ehqKm(Q^WnGX4Gon&6*H0GLpv*LmmA>S#^+kdgQa_>xA z@NX-x*)kTr;3m%YIIy@Uy2ESg-bI)76>Ir&WRqpcIXedS3U2S$JLpHwDM245Kd2~e z>2B%6QcV4!e0qLOJEae+P;515jQHpS((I}1*CGxh{5*ut@H1#ZI-Q}MUlds9X}lg@ z>7S@Qn#34Hw|pa)+NCv0FP>R16dYr};`_+D+N%^>zvwcHbw~Md>ujMSp36G-P2t}{ z8`c7Q_l?&O`|uiX30H+Nuv9!rbUczh5HB04#M(?{TnsJ^AUp1znH$_UYjSXZNnY^4 z;_I+6Okq#|Z);oaMSqY?^Se0uW1V$VunFI}p0v|Hj<`L#k7Z4zJN?V2U+WX(_mbqz z=aP*40kYaL{EUynPt^~#e-dqOs|X7A$xWL4<#i-nR`$SbAGuGgS3?ZFg{*;$vKrLPM+=_}KuFXHCf zQ%(9(?5Z^6-W>M%iVtgzE8IAst;OI*XNIX>bFV8nI?B5w)d{_oCM25mD{h7G70=p7 z_)XRv3vP7fFxMb+6W_zy^QitPen1tn>j&&TV4cJM$0Tzd>;ZQMXGjT;D|mjolMZbr z9{u1^K5r$ggV%DGFOfl6A4c$~^Nvc1|2>sU=L3#{7R86UfyT56-GQR6?zyGr2W0;X=+s9B3^&kbwU zJ%-2f+nJeZY%*egTHl{u)&eiJ)roiMyt35~mA|!*e5aQkGRIWdp7i^8V?)7s)(Rg# zP`l`!H`W&n{=0p~>1DRy={)q}f2&z^VrCq)YBys*uSC8dM9hi`?o;56r&+sg@%(4j zR?mNBwWa4c^6t!QT=vBC_XVKgt=x4!ZW*yL#1q5m6C5q%3BTlaoaxsx=sQQ{A$#V;a~>sm%lM`b za%Sxa`@+CWHXn9_x9Z09ShxvV-#M=5!d*GN7WUmR%yHA5dCmEc<~2{-nb$lL|M&$H zMmu&TT<-YIg2he#$1Zc+0bKfdT#iVS&7aukBxEcUNE+4G3!iXcXh0S z)@w)PEvy?eW#P_o*HQlU3w73L^bAs9YSM?=H4Pr3HmMzIm)fFsWm3P|GoAL#pgo6( z+ulk$ZWRu*lAZp?h~plqvy8n!Hp=-B8W?6X=czsFtGoC@pZY1EE0YddQ_Ol)$D5-q z-y!BSD{uJ)-vLw@LK7`x#vrkd)?3>H8iweuLk1Qu|e_P{?du)xbkpK2O$uqA!d-f92mzQU^koN@h z)eS~mV-4vKa}}*G&#qYFX}DuUdG>PBuX7oVck=#*o8uboN?&3$I4Jk_RLV*#&z|xF zqcN}5Xquo)78%^BKt3;k7JX8@Z?qzhJ2 z*t{15n}g)N0l3Ttc00&_E^I0yu(=-CJVLr)AlQ^eV3S4q6ks!)_tyg(o6^sLO&+kx zje$)R=hgTuuDzn4iSIhTyRm;CUkP%X`lxof`}g&!uSR(v-wpmgzNdfSX}JE1zP_m* zd*fR2&t5*LLG2j&fYFdm+LSx(jU~KybA=;q$a~b@Xz>5fKQJ0jFMF{zcc;B^_Nk!_ zo;U4{;{D?958u14;PkR*O`86Y7(7!r55cyHY2YHvaribt3+)1W<`4sP-7B0%lbM$P0Dl(Cha}`pG+9z7)-jK=ej%kINwXia+D{y z99xsFbu=9?n!n62Ha$h!HPn4(&?txaadW+=`S}yy&20I8ALk3?%jW$M_VK4t?rljf zM;Wlto@d4MUO}4n&z$*sytAdn)7(}zn7h$j7H9wB5c~WZ)_o^axcD)b@TC3=cPCe0 zPX|;xqq)& zWK6FunDcJ+q80qVjVqDMJkMf-%P}%xydylu=^WWG)R{>CPJ`c(3D-KBf!D}{NsgDO zYj$R$v+3k_GmS0V3fh33F{NgaVn?}CY8UmP{sdy8B|=-*QtlRLLuYJ+f!z`8IL%u; z%}WPOava?4X>PuMu(P?|XwG3zSvcu3@?6d}i9SJV;H8aAxEl-|9E1jjLIc9z5z=3H z@S;rNsva1uT$O&z`XxzZ9DA}PYAzs)=nVVUgzh@FT%1B*y`$g-yZa%gEjpE7GuNjkY9y8 zsCYAq=@zviXnZd>nAg%1gFD(-cRy%^eu>m{d{}e6Z$#w^rrt^@pcXN zgBE1tefURhUx!VMHMyTPdOLQa%Jh_AJ!|e4-a%JU%6BKY-^2YRcl02Euelc)p-gab zg7)g0Q9L7me&JtZgvu%NQvUl{t1E3d&)AC0d@i14=hFM3JS!fEo*Qb6&>;R>=L=p~ z7eE(qA^)Ao@w?Jz2H9I)S3j;W*ymTQmx&RN9QVby>#^ApGvj@1D^6?|2Ioy2!^fux z`*aaD@k7WzPxiKat>QR`A`dzFI_%CLa881JC@S#paoT&DzC)9-ITPER|8bVD751go z@YC&-Uxj{R_L98Q71Z%Qyt#xr4lYYu7+cRE{D`)bFSeew=hV}|I-{CAs;lLky0FP? zsEYWE>1=}7vX@eJY`NPLy0*U*osC)Me5?JcM`s-g9`yf$)%Yn1UjFT-kJW~fh<_Ea zEzEk#un!1U=hky)Qup{Z0R?gF?GC$ z9#ZpqC3&6T&|uG7(Gu4w!6W!A?L>E^GNSaO_0DAQn?o70n?z~I&>E7wHrhLk_Fhbz zN{At#{gY*8d)d26+qRR(4Sp-wJ1ZM}KJQq|$PaCU`f?Q8ZV~OA3v8;e?Wvw3!)Dg= zCw$zxln*>&%Rfw6D!XjKuqN5!Z;F&H872<<%%s*s*^-@)E;yRyes9u!a~4>8&eV@N z8Vkg)5FO=4#=)^foA+YcKZkp9Yf+OCKgr>WjEM~Tdm1~v=&Bihw*o%^jSbP7|KuYD zWj#F2t$TKud{X?J^;L64KjQ(Bop>os5Hrl$&Q=o{h|)-8Go-SaAJ__N`^Wwg<(%WR|3!5+gx<<007y>ebu0rE(*-bol6x5-q<<(P?#6Pv0@__2W`Ff9b-yn)KA*l@}VD zK11eeznOj5z|yt2c9HZq>HSAJ4wmMcG%ysHs^2wLo>2X`nZeh|ules<;5_H+RR!*Z z+C_SoMZR$QwT?HKFJEW=muzr6A;<9=@dE^_!O)TR_C|S!?k()y`*&a`zHfNH8Fnr6 z|9#lCEd6HKMd4<`>!qHYU38%dFTt&bIrPI+V^hoGT(jRpfRXy%{>3i}1ef+bwTna> z*}y^ahGI#{7fx`C;>Zad_j%ILJa&QLA-Lw2Eq}WVI4ti%M_JI&`LvW1*>BvqGQw+P z=%_VHN5Eov7h1}Kj=Itl{HrTH0h8rjXets1D~7I~+uPF@3!f-#EPoUWK2HN5*|$VP zQQ8ok1fM8u217T+3s)7i*4HmOaDQ&IU?smq(T)Wx$&?dK_{GBQwV(cTxP{wt?z6_= zH^WYPo6rx=hh2L&u%o=ot+9AM{9gPg@C!@6HOJ-oFpPzt;1-2pl)k3@U*UKEzlPtm zwcW$7+wmtJ7Q?>|0k`kpbw1quF>vdacZr9=zgC|EuL|I^0-8IIe?@p$6i!hXMfsM- zrN*IM;}F^rO^LST$12*<_-a^oem_MQ62_2Jx|{$>(O<6M3c<+0iut$v?7ALY{D#*(xB9ZtLPyEOZ|I?~^j_^;4|qmtszqC1Q$PR3XK=hg8XV%^R2&keo%B^uvTiQknbw6MmJnTIdk0X zvCv%ogRbzo4Sw4RpYG@)I)BHEfg)tp0ArvrBG+&Lh&g|U@n?(jUGa(vE@;e}x1;lS z^v*cg&p2rRhZV~O+WP&U;GGYYuO4rkXI!1qR}!EoHgQ z;-?MH!k{(xOmb8%0|ul?4mhMV;8$egYJ?+D2ESl#7QA+h0FJCT#DEn;NKh*KXoSRm=`&S&X}H!tMgKe2+(G=58OF25=erBqpl!kLb8I$`5j(!5IR2V8XxjW=41IG} zsf~MEy!CD*&ks}f!Q}YqDB7zEeiqjzV)4oSR;bZ`WGROfSbb zZzbRUkg@kAGMBAyCCypwGH zHF>sj|69^kCOv7+4&37j9Y?Py{gK9I*tBtj;o+MGaq~`nlGBZk94IS zPZ;NzkTjO>#?gjsv+MwT{y6$BwP!2WvZV2jt0^mhoOL`w?HR}WalF5V=kYv`M=we` z^Wzb8M$#i{Eg?VLEbihJ#vtoVfUB^rl;2ugFtoqhl;4iL)3WkS?AqH0VpGjM|NXC+ z`=tLnI&4cpc}DG`L-;nDvJCIad6qoP8FMQ?rwr5gbw-v$zN)QXK3d@VYt16PGi4>U z1HH(rPlXFVuou#L5!-eWT~-;dUN=-9@1(EE{*_xJK$Su*eOzc1F+S zkMF%%KK(b#C%r6{_xRnLm1pH)i2eYV$g#c$%~} zYnzb+oZ`$gK3jBtpyEP`e|wC=x#(d}6Dw8g2+7P^N6h}sq3lZdR#|j@3uoU~G|yUd zX^_-lKS4Lk5f zbzeL2EyYi(!X8&zhd=(_Tg7{C2-fVsF?itZZwIFkJKxzq(;RPC@@&cA)|iyubpie~ zU$MT%C$8|9(57&d$=Mvzy%d9|=(^bP>Y;4ms*N~GI*TwCH_{OZH%1I@Y{sJ&ZYU?P zzIM^Cz()?a*%rag5$qT%BY2qxUXI{fD!l0ZLE(fs+Dn_ZffL!Gg%8bF>FBom!W*xl zEg@k0?2J^-I_}LLwKRP5lj^?0=XD?RMJhCD2foU`Zx}kghdh~2J@jMqya@5RTQjb8 zgiq!;?_+PyT@B3rMM8|(l$Z?#Q$hsvX+wrHwiH=oVr~Y@Wa|QSBe{_{I zxA#TP(?51NPi082Ji#&Pvhj}QjPZ_tyySBHiR+5t*E-hYllkAYyNFnAp2b6*t42y5zx*~Mr1wW}vwZdM#BYf)*H|tcpXwkj_l_{>KUojB zI0J?GzTdUb$R*I>M()C;i8JV3wEjK#TFXpZvuJ%Se%+$iIf^&YKG4@*Vg!qMHjF{O zrOeTincI*_58908ZE;5PO1pvV2+x6+I1S^p%81T?;zPV^)_BvrMmw72dlel|=6~sv z8B=rOmV8nK(;Ft1%^hw30eio(un%GriEoF%M`RQP#^E%f*c4W4wEm zu_nFhG5DNxs#}(_+H;R z`EEJ1bBuJIuO3aGO}grcUDqh@IPz*vh}QE3Wyk)nIOqROk-AMDG{yMp%gEU`&EQV$ zPi8LCy$Am#yR`wMbLBV5X;B@q^uy8%uP49iRbPCxshxg*mp+#PQ{mr?r3!6m9u(eI z!jrBeZ!f;PD^lMa?!<)|xQhGlxT_sAXpiVcbn+$i;`R?FUQN31)8X=cdBOA(hzHL{ zkgf3_tgF4%Xq2w{USy?Wm)qxtBx)ddGA8#?#Rxw&T1!3?9hjsKFF zo5vc>+lL#WhnPzbOw>9d%ke@Hc$r}|kM74AK*K%AQZ}D#l?O9CyvKITx0by+%h8gD zt)0AX@*X5j{X8&{e0hu??6mH*iH`Pkm*X@zG0N8#G>^sCfi;vlSH4Uu|ewmXw)D*{WA@CseQA_l&#~PWC2==bCtFKE3Q^)6dSCYCI4? z?s1$0_a@5S3fwm!11Ae-!1rih;M?x-y?NlwX8D+^9bIuXsS{UsUSJdsq0AR(n;PmKlmtz%c8sT>c|F=Y~GO)7i;vSN zublzBg#%YS{>b1?Wg6^THR7`!OUbt*1z&LJ#UQ;HS{Y1Vb&h!xINe6MqMHD?J%g`< zaFv@59YZtPDf4&W$k$t}HmkjY$3fax#5eD9HPdd*?>77g!||>!o5+P;>+NheDappKUr`a zdEMK#75FFDEUILV(m2okea)g5u_dZZ_5BVm=_1~vk6M3ky?>}vdpb_TAJqQS@XQ>_ zQCrnd@h;7y_c9i)q#p4Il_k1tj*M;bgOR{l^b_R;m+(J4$mP(O7p|Lux#p;3%J?N^ z>ihM?-xi#l)FnTXGcUOu*O4xmCYYYDK0i_c7c+l8+{wC%bV#n{%{h?m*QTv^OMQG>Oz*2yY= zxINB0r`7p9<#)UW{b9#YGYPh39)YH%>M(=9xy#Yvu5z*Dki^KmR4%#WR`L{P#fH(ALgz@e7CYZInNm zW2=*YWjWSPCvOpJKJtE=Cpzky_Xuk>i`Qj2ru-Pcc-n9icj5m~0=PCZe2c;L&T%&` z9EUEZjCL!}#qiT;9}L!Bv28XuPv9o@foOg%zmz+3xQ({gjp@Dc4!(b$?_a&l>Vw9I z`p}2>rCjpii}s~qWR9tK`ZM?Dmt2lL=w#M^$Lf#z+>#-`X_u*+y!TP|%CmOy+k5zG zNAz0QV7E1oB2QqkCp4P-+&;#p1jdGF;#1)7TK9_rW5dM``LY>L)-3u1{>L`Pr2Ek^ zj)~Bbf&X`a@!MDYcq6(j#%}=sv!UeC94Q@%c#^^Wb@Y0#!)sgdlN!yp;?4cyN8xjp zVe;oyPi`()^+2`BKQhTL8}RXj(a2pRO}{?l(aRlnzLTF}7$3cgP9NusOgl_0eb$b+ z9v|x)@UgyeA&Q?=$wlR<7F`@=-72~eOa%kMbs8{@r4OxfW8wAz=jlH0b~%z2-v>HW z`J%2-d8*DH!lh3$8mI z-W*FCxttFux)BZCTWroX&`?4iZ7yXQu+TC`z6AhJ2(17*xX<8lhycCKm!Lmux*XJ z+@yhca3X(p_H+Lp9o6sq(2u_ZyKu&3&_bre#dRDS5^Zo;?524mFLU^*&&4-3u3zv@ z^s6$;$&2H|rX>C=t(@zp{BKr$&|rDqFAIu4*|{i6cY@hy;XOPOAH`9oysx^Xb3cjx zi!Q?}JbUP~Fh|hF9M0p1EXvB|pls|M$lk_c4`$eUXqkk8T6p80EzT0n(jBogu z@Rh{-8N#m{{K5-GkNtq1#@#gRkXpCdNEgoJU!(Ek9-rfAr`>l@XEFN7%HRC7UWE4N^Hp$1|=h)^huApX z%iYX}#9lVnmguN+@aYI|e0oNB3Hp(aA8jA98>2RO{-YoHq$!(5H@xE(f38@7ovRgVc;wnP6x)jzc!lx z2(7*)i}P7$s9PuP8DMk0?xCkMmM%!5hBCixi)M+bNo-j9xScjCLx?bt4;SK~$F%JfBx z@bxI(lW5y#6C~qjIzC0N_cPzD2WOh2RcSZ?KTh7`gP5NZMmfgB;60bI|L@{`{;gf{9;LB=g@5C>|33a3*dN;+{uR^m zRnGU6jVBiWv2$k+a3tAYb}-5I!gCII7oH>X{f2a?>Wk0h>+sdrX^(KY8`^1?zkFJz z<9*s?q|r{7;dH?--r|3ly zkI2_jHZJjzR$~1|<@SHYM;7kuo{q$0KKV3USj9LN+|PyiW^m|ybDZOIH{%T3cp~~K z?O|})o?p}#*tPMUdWNiaHs}GW)B|mFyi1$0WB>!lwZ_&Tj^OMZ={GIew z{7Ae{{7Cx8Xy0^qu~)`;6k8kl+TcT)x6hS_Wz!Jf&DC18c%(0X|C!DG8J}VC%VTz5 z3oySM7^@EP!4jU&~<*%Pju;k|0anbT}mlHElclejlC&NZk0c68UV5DPzxziwlGeY)HE)!6pUz!KD792^u6ZSSpK>*GG_jjtn@2lgzbyPXX^;xJI|fjyp?xa zgT3f@xS;Qb9EaA?bMJ#cWj}7pfwuiMi=;;pJ)5!@`IZ88`yV{hN;aE+1CjUhbXuy9NY$pG;_93ws4cSg(-1rlP>(sed4KtzBgZK z;%D^_Y8M^7<(FnzfnD9;=YYfc6!kfQpVkFu*khzQORzi0n3Zl_yfTyZtmIO`TKEzl z5x$~)Mst(!WdNI->9f{F8u#-Pj7|3nr;%~Lld*dz@5&i-%3sWQpF)0(`DEcX0`Dkn zb=O|4qh{I2z07Un$?qz)_BqSWY-4^AJ*h3iv+8YNe&h@UQ|8vUTCVcU&UtMm_GjoVK-uDHS~En~3%eQXS}PdT8C@$3q7VOStq{9D_ycWpGJi?_jGfoz zqt)HK-W@Od3;Ws6pVzzcuh@CrwdCLDU$6c6oB3DAkIv^`(e=R!XjJ-@W!yDJ^t^;; z$@HJXUzG2Mk^k>R?%(0P((5DR;w8t=3&gXI-Om~po~6BoqT4w5mb>Tk=Dx+*{J)$l zmVdnk{#4EY%F+E5WQ;lNSI2&~=OlhB?&6_7quk*e3hX=I&)~hwWxgNCdwr)gjUBhg z&7Sq%3){(~GISn{GAEH3-EKE17mEV8uqd6dt+d5Gw0O0;ysNgiA}zJixCPCqy8W4 z#e4P%o8rQJ@mzjfqyKB-`#s2cRr2jA<38LL(pd|BCwIq`uZ@uAkP6z^!1;*9D?M*3zRTUr5$|Ik_Gj31md=L9 z@RhWqLwb}w3ep|F!dY35v!AEKo;oUr7=j7Jn3L~i?#-7)VhCD$p4MG%T;(B-2JtSu zJ<%Z_S?X@8U{78W^44AWE=qTNWa%Zmi|qX}?A{~9)l!U@5@N7THhK{sCdrH;7|6&C z$*!cB*&*5{dh(Y5*L&g`uaYi&1h6aR{~E5mL|@hL+>qkdJpV*)qjPyqrgOQG85X&7FBJEB4*V!EFgKJ6OjYK1@~V#KPZBdV zQeLzUtL;{~Dr=wFcExkC;=4r4l)UCo$qlKzv~J2fx16ePC})+*>G$uK6=uNR(E4!9eT8!4wHt}|YbNh2y}7i}}w z!Nw+2UtjqW{(Dumi>`p5DrUQQbqK#Q?GN^kfR_QETaAI<9bd0%JcEu(bF9Ybr*=o3 z5%2Ksg_ix$x1TX`jcEHg&%i=y{u4YiKGE@p{2$?O_>mFnr}vDF-nv7t@w!7}J#>dg zQgsK%=J!>6cZ~k(U4;=sZhF8x$GM8wLinIP1`H|NrrJCh$>J*W-Va zge3|4F5t{0fIuRWePJ<^;07papqpC~l0d>_BMG~jAhs&e)~U4AHDR$B7NvC~nwYrM z{%l+jTWxD4EY^jHh*}W}=Kno!=FPkbO!6i}|M`4g=DoX~d+xdCo_p@O=hnCL4gZU> z6Ltifzs>N_NZ#>nv`_3^>uPPlJ$!ov?b!@pUC8e@@PQp|_!GtF9s6mj&-U-&JDaAa zpZpTtwb<)y?oiPCjjXBLhztiGf2kQccv7iD?u+Rq;SZxP!Pay4#?kd(vG*55STc3W zy$)hS^9*`rx$8EBxuX_exo<5-?bumr zzdEx6-!#>E>_>fQN;c%!#nt{gZ|Wa`b20;eFyio+*iLHUt1ps58A#P+=&nSCu*;&{}Mj=ANpK; z*`H(%Jcf)%D0D zjw{C~!(?621m4z$ht(WFhPs=z(epPBtiPLe(J98E(2uOSl(J=m`{8#<^w_dDyemAs zUe2-$K6X#~xpWT8@@Ov2zdn$q&ewU;qir#{=U-xgtj|p?vuPuAg@4Tt(mAxw2 zSHFclD%r294pHhi1&853D9o|0uc=<{%YLb9#IBXS*c*zln!jbwsU?ZA66D-V`+_~! z9V>#GRuXqHb<cDha>8~9)JH8j$mY!$U)aQ z#NT}ow#m0P<~NP2n@_t;47=c(UM=$-DgRo~WV-GKY{jRVSI=13wB?&n$HvpMnnGf( zaVXihIWGO;rY1QnF^cELu@y}>@OvUG&D`*2anldzjMnh|LT*sgtv3ZtIVtBGR?eI< z_L1dHdo~6&ZQOZ#Q$uZ#n!kfH4vjTIP0bI}H_+(jyKbrh`3Oe1_6;nNyBE>ez9x)yvK<}R~Y84ZGuAK#QQ<))(BrlhgIwF%n)>*zGI+-1EL zUK|PiYyo!}_=~@>V0z;V4`eiD53)YIXJbaw$9-x?|A(~C5H2{}a#vRU?+d}Zl#`(-nTh;nDIrU8CL?1q zhY1f!#mC(HK|^bVmW7wB;kzz6gK;;~&Lt=dURq~6d78OuSNPoe-P5nG-;s7r{r36u z>Yu;y+WNtVL0BDY4TUiIo+96@IjW~SzbDK0MB-iF6ZjT?)Ya3JXH1OYJIE99 z)rAhZ{~|)tQs1ty>V3_2WQ7X&$YI;b>RBeoov#Kveu+P@b+7hy?0QN$c?bTC*3Rnf zI2{~ZUmeW(2gb-R82kSos?b-Vj;#Z^L%EOefKbZ5VEdtgLG@1i(h=Lg9EX4Gceo?| zM8`&KUzhHB3VO1Dqxg)bQC4go$KkU9dOh&T=y%uswK`Mqv`!iKa3piIjQvcQ_`MWkVU9~}M&NQLp;a(YV5lecN9{SWi)NE4P-<--kIZ^J2=57sJFNc(C z#a1K(n#}t9%QG#iJ&s8|15-!3m*2cM^W|}S%1zgq8l+u^Y1dlXC2~>FRa0u#_KSFU z%Qp5UIY*Nga(ScJ*vc82O{(68dw13KiD~<;yGGPMD{a9piT(TSEm6udb#k}xi`Z33 z_>1^D0an#U0GQb0SRnGLjFsjkhh~UgUe1uFx$ZvCqRr~M2;EXM?N;~ez?aNHY1f&W zwlL;C!A=67m5$B9KdawFJzJ3n{@sp!1a;j*ottUHmMz?yxGvQ3)B~Z8CufB@w$kQJ z^O*%MomX9d~` zK~@r)JJ2VDIkzw8U+{ecEgg+lPLBSvW24ZioqFpCE0kaAUo5}Wna{8It;tn?M{UpH z_a%D<{51ofo6)olzOfLSUYWy~zjn*~mBrj8{if_5>)7-Y#w0Y1tr~0mFo(=vTewrY z`DuK*{q<#aj+49So1d?q`D(CdPFu_VU)_75jyo71YZ)t_GT;A#aq@G<$boR><`|iSLYRLTe<;D2IzlhsnaZwvW1L#tx9 zE@M;rsTchtj+}#RkvWBYbuPYE8>BS70ZcvRGn=sYsD2>5N%+lL>^+3nNV|SV z9WvJl-w|D}@S?v0OU>bQ)qX^Do1)X~i!OI9yjR*U``gc9ABb*ZpPl(j_=zca?L%@V z=o@%U^^)a{IimOMJK6j)Wm)=)el^P6yaXE;IWK^2{2*(C=YHb6^F+#gm$o${XUQHW zebv+-9Jj!STHr&f4uKn$og_Vs5fCDJZlPUyY7T^5J#89D8mu?fU4}KG^MB%`X-xyKXE<-}OkIvg_8CS7+QjsAcBE1*Tn% zE$e1HI;eW4%sbAx&!oStgl($T+F^a_EimIW>2j755B3m2XMQM z@2X#=H`VnqHCTC<{kUceGC;7Y;a=#wYHEgR|95de_RE_}(&I&4yZM12SQ;O}=~1hUld?TzGNosHbAEG=e_YjdCUhAep(IkU?4KsxOmhK_bR zG+wtD8pdb2de>a=+J=$H5*fEzAO6|t&Fj_s=M)#_x^T3}E{s=PX~$ zRZb4&JY_}LsG7PpGOow8M`JTrS0(rFakqjpqP;bQ?-jO_H;`Uz9=VHgn5_>sSIV&V zI^^$DjKQkas~ZoDn`(Y-c$#@F?U%MlJJ!>V+ThWueI7c52C>(x2pWk`XKePwXEJT% z&Ogc;V~=KiIEuRy-)GE=z1@Y_*YyKVv9}X?6WZy(o=o}-xoPBPU`)qunz6P!LdN%j zFh@IM|MUp>POdJl+N#EFp?#u5`Ih*qSF_YRCz{8YSo6_77p}zzx9Nj*nRkHWP54u8 zdGr3vAA?6(?>`f%yt^4(PX?A((Zg5py@@srAE&%Kny>@-g>T{Bi@IO+uNNQ6<8DoQ z_{a2->PL`%5#NDA7k#h0?2PcXy1TF!KfPsrogLi-<*0qlzLWIRQRL6MEn**y?bTiQ z+@_Dj4qfcZWnHkTMmgC>!syE&`7K3%iC>VDtapCGBYi3PL}uP`0zEUhlJjou^p%8N z{2jP=^{Ln)N}s0F4{brFcJ|)rQ`7biwNGc5KOQ;V90A|YnKi3nAbW?h{yaz@HxvID zkDN7@v%Qz%2l5^KMK2-j=9eR}i!Lzt!=~A?X4;-K9-)IH(&xZoLgyv>mC}w;!Aeak z&k4buiU*TDOl-G-U(#(3=1v`O#a+=gb*12nd=;d{X)*VWkw@)2ll=%frq3pdpGS{> z=M%Y?!9y;Ghg?yAWa?G$kJ<2#ImPfB)$g;|LpDw{HT@R*wSE=gN6F&Qg@%S5xI_;ijgK2Pq5w9$__aS;R5b}|`S7F)P@ zX!~bE*NZ)4U=(9(Qw8M_ze(j?ruM53KsQ2HD*tlQ`kVWmw9cmUzR@mPUke{f!#4o( z%7Sm9^|UpW@ULmmdXzaGT5nrj*(mm6P5cVoi;UF>jSKAye`}^ce~|l5p!Y2Do}mwg z-rt1YJ60#`sp1je`+pI72OgE)?Z5@RLgzxiLh~BEAHk=sv_tNaQq$7*P2f(Y`7GK< z-Wy0S^!~n%=0&eMi~hGSp4C)bGpnf(*-q}Z+X9}1HzJemj_jnxW%K(5}$GYHz~$7|(ZeczP50_X@3xO}ORi z%g!9be&HD7{a9#~`B?fwb^m@4X<0)wRb%@!Lf#o;b-XK+E;bM0TgH~qbR%Qxg`up+ zIRkb(xYmz_ml!`1F6#>?@5jCXoP%F=Ts$FgPmVIbK-p(#mjzoIsj~%GabUyu#l)p! z^MbrhS?c))U@ay8gXEQU=5zc?drbI6SL&>e{kwkHcpEqr+7(|IvJc9drS+OVRfnQHs_?$@T)23q_}&|k-a2hPnL3l>f1A$ zb5b2aW7}Uw4iuU4C~2xVzkLvXwJ8nXlh_XkjPrnR;p&x*@36M|Dk9R%B^L{F)b|K; zDCaX1@KI@EO)C3IGA6GgJ>UE2`^@YmIq2j$--4_qde$^#sT^RAAU;UhJ!As*<#Mm9 zZ765N(C-AV%wf+b$Uc7eoexFOmW8|T7~M=e)5-Ij5d27jSJrk*k5aF+s|HxB;m2vO zj&E-TuIxG18uP7HQ}%!G)a@NSa$fM+j5|jQT!Vm1+B1OPW7BPCklUhs&7shNI&b1D zCG)t99ec!{z5H$gFQS*qkv@gT%AKE8t0Nl)@3lceYTKSAo#3+{{58@=|FTYsu=Zo! z)*oHGQhy)*;w0`jq?PfZt|=F@7Hb*8nsTt?=fq36QUn4%*Ozck3~O?ygr3;g4mm*Uo+FtGt+m2v!@kwM(C0 zNchdz3D*7b*O}??qLxRtmPfQqKqh95Rc&%WAMcu9%W7<1W3e!H)pe6?>-p3D16nI@SV%%vZ(8Qc|xC7|hhA@UE`I;A3m4U&|-$6}@*J?a{(S4%hC2(B$yu zir^{L$l~Hdvbkc`6iFj-;(K4@blEp~1Y5BE@ai^vgK1@5#hS|!${NJR9Jx+;w>Ni2 z{srG^+PW{RKQ^SSg(4Xb6P2Lt9sO)yr}JII9Cktfka=&M&Umj6v~laBug;tco~CgR z%7^&#x^2}fGwtw#jeM_+cxC25@ZYx0I&l9s>$M%p|DCs=r^E8nJn`Grj(?`PLCUkA zLYI%+_5HjI8)MJZr@iiSWkJ(j&(F(hX`6A2(lWE-Q~WBr(zhzgvoGEC!o0TR26q|Z zXF8s_i?TMeFEF`ppPEZoE^bW251)*y$=vlg8ys6qq4pZa<7C>|ri8ZJIp=vLW3r8X z-&Xd2(|)?JG5V^=8u8yJ_WgzU=9%5snNP;7mTyNozI5@`Cu!y+Q${~Y)5pGpb=jw` z^1`o#M}<1mOlJQLS&cM7>OS*qH4XK%_S44Br(;CFG1Q?b!yUWvP4_vx=1u%gvDR}e z1jlJV&uZ)g9<#VZuX-kR$~Xp3Hu_Hde*XZir>$D3ws(6RGCp-}M?Y1;IBLen!EgD^ zj!ZIF6IaG>5o@ey=o4f%T2oN_y%BdjRBH-r|3A|HIaYZljl5-% z?0a(G<$Y;=lP<-cw=D8f^Bb(MJMina_EKfRO#ES$Mb0!&PEZ#7lJfq>e(N33$xFRM z=H)^Q|LWg&-aAU4*75Ys&AVTn2_M<}`I(IOgpRWC_ZCE+HKY|9T8XbWp`HDAHO+ej zpKrZscLwd<4?PHtqyeK1oX)}rTy4SO86BTaS83xg{r@Vo@e#Dq?4k_`8}~!UGk5U& z8ni(<@20I>*eLBOgeTwQqKkIuB2uM`pmy$og%Ap!nHJFD^`U+F-cR%`<-Kz!FNDw7E_2_;xt-2q|qApybOodJ`N6z zlK$>HURkg$(%Ij8DPsxWVZD^=4+V!sy%po^_r3J{64o$bq005r_c_p!^!;A?em%1L zujM|3{>t_D(VwErx{>~s{(qCcpGe;~LI?NI??1Wqm6<{xx6tSR9uR<`xUAWKqpPeSP+_6bJsKT_TTj^ba7%{7Gt{QA}3vRKo?mq-+&&v zXn-#Es60c$f}x9b{JsKREaAyjX(P8$+8z~3Inc&z+HWxh+hzXF1(#Jy@Ae|-L3qVP zc*R%alFapd&w@T?gA+*`&9|g&!}oqT^wI&1NV-DaXF(&g!H=YChfcI~tqo=mukTR$+K00a7|9xUA^6Ut4?iW(6z0^6 z;Xh&gvgUOBG{b7Xo@Xrmyfix2{186BzK)JF$A%?x$3>z!liza{<8-R(-;Z28!TAIRR%}uP|xj5c@^NK!}VatbDIu!be{&)|*`8Ch)c$V_C zDM9Vw*hom<&4r%Z@ORnDZ!^60QuxNB{Ep%GPt50^vLF33zCVt>)cgssv{2tco@s>b zCVn&Vr}4!iXC+?c_alBE#|HmXd~^&7i!`qpGlBgjnV;p1>2&iAV`9wHqo3eyO!m*PB=RSkt9mI*_fO+45p*rg<&KXI zO|#rEJ(Y8<)7@=h-EC3`?eg8N4OkvZYNe9L?? z9$G1bHt#{Una%rFSGY>AgoQ#|k|&b53A9t*h2HXbmo)I71@e6v@kfG#qW(#KDRUpc zSr;I;Fa{;vUl_N08GE7p3eUCAg6`j^ta#oeNjuqeJj1X(fCh-%{5W>XP%0C9b}cvr_Y1@BLlyY$i-vL}8QP7dSQ`he0fnYHRrp4EgO zo28tI-jGrMmft?v~Te&yz zDE>9L161_~au4sUZ+1tpu050);ksXAr0PF63;F+LWcGEg`&F#0ZG)IMdb5W8x9i@D zX3ox~1@~6(S5c7ZI^^C8?6~Jb=gpjllCn+nwQ@%}?Oa{<3{v*2!AgRZYoc7aA0#N; zR1<-nsGPq_3l4UdYq3XQ!{A&qXHo7I;OQZFdCTcvtk0spqY>hZqj&qKf36+f!CJ^V z_=Zz+32S3t`QyLaR;Qz9c7|VZs-3gxSJ8fft$sTCME36)U;DOIDGjFE!XFkN3G0;6 ztqUpT1ASz3a`nuuiwAIj>yY~1z1cgMI;TE_@}C%U73pTz z*H6dyU=@2u?Ad06!&2smI~i|VR&NzM%;WusGC!NZ3;P!`r)T|xd(&5sZ>(kSZ#aeVu@hHAuQ(OW zeo*5#ih6$GE#A|DN4K{^GlEyqrApuL02bx8+uwVQIq)$0!jHp3YVhG%bCA8T$4+-_ zeClb=LPC>+p-I`N8L0k_+TNdE)n7FFy>s2Cd2AM^9A`Oo=WSui(xR`#Z$^lH2mG-b zdI^%boW6bwzh@#hvmdiyEn#{6l!P=BdlC4+%f8L@@Ic0HxDwuaGrr|*tL%-zA$}+hu^y>nFGA+bwfNm;{pvWDX0l`jo9v>idKX@x$D{a85j^e?83#P(-a6*t z+SN{6wsDSh6aBDD^3WHuf2YsepFC>+iQJ>+4SzUmmGq&rA0+Ru$ZM52^cxCgSL1tK zWI_%_H3@7Ac7^YxSycGuqLbC&4+GY8^n*5@L)WtAs&nqG&&LO%;GkB@1tv-JO*nfy zwsGA3fv%QsrFy($HtDqZ&m|rmr91vWgd?5!NLTp>Co1)dZHgnEGyl^Gk8p(_B0PdH ziA&U#7h%2F(V^8v+$Ejj#Lh#7gSd&rY3=w#bSU`WQR*g(ZbH@9NZcpXBk3a)Gj&-U zhk*A2eVNsh9Qe|6mPy_rx-w7c%H)1v?>18&dOsH|7DtFK{-ogKzywdcb)w@m{@s|z zRh$Z}DomtNh!dE;C0@g61TeYF1}5%+cI$*R-H`ltz7IH_@;l!NoXmWZcy~tqD1J`_ z1+@<2y;>-~W^1wsiaRy1wDotk&s^Pp+EpelQgIYHb$G!ynU_)ziu%Ag|99suH z@R0DPINB8BLN?O|+058_86aEpJ#Ccel5^I?@2Lo59nZWZ@`Cs@wgeAtw=Yre>*ZZ(Z{+pw5)>!w9yHQCz1l*rtD}C)%Q)?y*4e(_1tVb3ZL0kIt65TF$jaAdu z{}L zPS7gxltG`^i;?+c+;_mY=9Vc7diSz5yha?jIewIO%KZ~N?v*qOX_WS8@YpBR)^JFJ zVZ9TE*1K6t3k*D0f0(!Daut?d_M`t5z7k5_(DwFUC<_LeYz-mMlawz$Y^40Tt6h1) z)n(*uRzmDczVBGj$K-5x^m1iEFWSA?Rp(pKjI_IzyD8l5MlZP&ni>SI1PA?j?*$H; z;Z+*W+tA~+e9^IBD`CAum4-e1_Ig>F+`GThAbMWpj_cb@Ci}h6RNG*5kl6m#qRT&y zEPx;C<3I3wI6+BNOx2m+VN3UiQl;TE^U(wJ)s8FKBf}?YF@LqUvb(rrU3S0NQl~6Srv=dt}HBOG1W+mny@lY%c91QNqUU*RZkv!5dR~>j>Y=QAxH8kVYTs2HN9)g^*X(2dL z!>>Lym-o7joIhNwB-ULi`|Cs7!xzci!Y>_mQiDtg%DEjze3 z78>4pt(;|1wm%iUfG}G_8+oSWQl6<=_WqB*m7|X1c01*L#l7SMY2zWzMp)46?}DB> zOk>;MET*5<>}0QkywHzI%SFufE_yM4n7t>PzP%Wn2yO;LJNW1u#vC>H4%*)a?YCa$ zq`@@Wbo5Hq-k^Q%EM>tu5Pb6ciIjEn#oqZ53Z*)3sEZpL(|8i&j z(c~4{IUHd!Sl7ipNWR1KY#V;mJ4<7~UG^gu#xU@pv!g zUCw+A&iHVtT7Q;lki7=JqTxdF*4UH<*SE&jME0(35IpRne!+u1!wHAhZnbV`U*MAZ z1qTPA&9&emjea`-4a#`607J`=^i$Dx+J-DH-9w?1zD0$1$FJ&+J@(?95Z^ zJGeLfAn*%3GUhfTYf4|*TCFwPw^4?xov}|HNJJ{q5Uq4TsT{ z$^NeizMU67yk<9dOdbgz-g*zehZr|D##4V654Y2I4-`bHJiL|nYV@?i!-ap}sSK*g zP(o|c;Nv#%t?}__&Z%e4<1zWN${Z7+3;$OPfsNNZfF-lZP;$LOn7o8w&E+7?a_Gk zeVlC(o>g<5i)Y| z`;mV-1xxmPOyAZ*Q^nv%_-S;OhhOg?Y&Yx0AjTzqd%XB&CmeHc^ziFD z1s0z9Yx4G7ufjCgzDwoXec;=D+M_w^@?629J+Ha=_I=kl>#4cgSw;}`OBt7uKP@Q4 zegqxN?t+WxGv=(Ts2@CN^&h>$S${j@Q03h&Jk-L!?`1A}4*coy_7-&r-j-ndBlB!F zduWGpnP*$#9ZGd?$CLOXjD)VGt{v<}q(g@h%&ilkxkdK;J+HXtjHBqn)wvS=d`A%X zFQS8wP=>2(#KrcUJs*=!aCi;+dUZ}hudmH#8h&QeKIt=bsP_Kvbf|k|8Lqm+W8i1J zhfp_nsk~QU&)Xw-5u9IhiL-7dcU1;ZXtQliHZlc!+LM$8i|rHkEMiYG7oEUX=-{c9 ziF^ErT3I;Gu4?@~)icJrX=P>KFX}mb87D ztLhk!TUh`1BkbunE~>e|SMTt9OufU~;8QZ+w6W)N6#n`ZbJSE|UJE}xaOPL*1+T#0 zzAIMv!a$YxSl}B6hGd)yC#(a$A#=^zskBcGzxGr#@9UW(t4t%>qrs)j7sV#V8s*Ae zr6TuahbyX|&=BZS)*zQ%rpP!@&n3uwdkwhU%KTCb?vARsLk6KN^caJ!YB}&=e__JI#CT=SI5!04sic5y#Cm2!yaB-)JGkI z*RCnuV|C3po7FatZ7)K22T1 zd?R^lMK0+t^Nn-9+eJA7i|9v%-oJpae@dI7Er*Ob;qOkG8fc%woO4X(7ik-7RB0Or zZwYh4(O(UNc7ca=*t>#{W4D1%;6DHymY`7k4)~zpNX-kqJry*trU<;$(pRh#fTdr1 z4KxQ&e^-O!UT|^knj&yF(0-J$D=-Qi0-N~JbK+!#yZ=Sj;NYp+=i|rNR-0sOfv4Aa z-^BQ;4pj#CgI8$t%|YfH!Q+7;wo`V-sK7EFx-rqG&hV>G?O?pgeDe-#kk0c>t!ZF; z4m>go{X!A6By-Is=8_3lO{mf6Y13u4JtlA<^i&npOQoeRf(J!iF5`%KMa~JFKxSj? z?3FQdNR!nWJCEYm?=*I!njC+qLikHK>%ozZ-x7DudKWtYtMJ5mkALbb@>L&Y<`Z`ax$&Ik5`Q!C*j{q{PqDxC z0Ctz9PI+P|^o$-bYW)8pNAz*ZnaWDbd~8A+L=F-A{<=OxCLh>VI~p6hhO5x63Xj?b z&Ry-^`-#@>0|^fHb!0s*_}}|)UHDAG7u(10$%bEN!v_oChgQnc(z^M5U791#S%#{c z_#%yds%AgfI>dqfv%Bn1w7#_^IWE$LyVqxR$quV7+?`%Yb&S@9f1{O?9jE#xJqP~w zD!|lVm&Z+4g!j>ff2_6FI@4hyTwm75!RmT{uRgeMjBDCcPH!>4#p9 zdkH^BKYXQFdpUlt&*ScgUXCh#xJDl>!H!kF$|9~@pGPZ;@FHEf8{X_7$D&SUx$#U~ z7IEj~QP~3>KPB#*e2=*6JC*6yxgn3u@fAnDS)Mp={zcpj;@soi-LC15B*NQFeeL~A zxnG5OaRhVQ_`ldzAAuiz65KaR!uqbV%s&Y~stq2|{sX+|b$ExsuJ!vDUUWJ{rBf^A z3XS=uA!oV~u5=nL3JnR3x!Vly>F(M~GL^a zos*u(f1Egt2Hky4cst=@cc(o@^nWQX{oe)rie69C|A}5t^nWAJ;c5E6dtCazRGt1$ z&Q3?@^ndlD|D%0h$oOXOsZHh-^ncCtlj#3AL#FN}ZDJlr&vyK1g!knNgsvutb>x*U{of*fwf6rT{*Z=VkBi{(~j!F-p>AXi#Lj9q6TO$RgUZWJr1d|De^ITzci6=Z}Y5Ce)?fv<7FQ%Y#cOhy!nk_$=jFpZ{K!1I<~iwvtI*d zDgWp)XZh{u(A4z};Xfwt{njM&5%y*NEOI1eN7FB__4DW&-&*RdGa4OJ25p{2U3(+P znL{H;w?~=$r+&`$tLPhF$39KguB>GpRjgl;P1W@)G+@6P-G=Ddn$fde&02x|#idh_ zYipqe(XWY~P4sPtQ$2dNmsCC5C{>?UkDl#&&Z=$zr*&5joGd5LrdbUICIU$?2 zuZJe8_&tc8jc-+F(vCihFja<4hn}3_vrY+})uCszF4y#I!`f@WGjf$q&(;q;+k~1e z=-IXp9X9!K^lXKU+b!tXWXx4Lv_#&{4g{2!<_OGcMweFjxSD^Ly5`0%hqb%p{Wt3Y$s_u)Sn|b0#&FJJOw^munU+8NTJD3AF$RwA zpaGn ze%ut(|1wtXj3*g4KT*eMvbm75UK?hbEcfaCsjt!?cag~XII*b~*&6+yTgPXo@AW#q zP0*wTJZn0>2)^sk@vSGnbIldzrQ-{SMzdTxzP0RYWT|vK=TtQBb69iX6TEc}`aR%t z%sI1teFkSiv8{B-(xR>^xU>&vyouBCbwz>3vckA?i8t;~0H~(gx@8;j=U~gGj*_g#1rr4Iw z?kD{XXL-m znre;;r_O?j-~v4)dL6w!?LO#R=&_x3y3nKOAkwKbW?Y0>?3lNL!#{vK(Ls6ikppU8 zcj+UApJ$^l4T07yN`JeY)4P{Gl|Gn@9^gG!AJ`M<56Y3f;z&s=V*tHOI(42)Ker1V zj=;48osH<iUz=kJs-ax93}|rheDaq? z#+k21_atw#Fv=oKbbx{nO$P`KpaTrIhchn=j-(vPUjvU6Jzy?+z$)*wo`K%&q6`<6HjAMW}I|56w3#s}e_bt=mZ7jXymd9=0@{^7a84_F<4BmA5+ja}H=#C?f< zBCx4r;mCBCPBuH%fnQ&*_PAl7zgo^!7vV4H!ri#R4h-LxUS+v)L)qw)A-wg+F&L+;?W{tiGpGEk`%!yi@yKTTW!xi@iyjfqan-4;3@uZP{{*rZ< zR>qfF`NU&)2`z@X`&MKld{{gCmH2VQ3mpUNcG=ew|JGl+e!t;YE7LuWs-qku$fJkH z-A}{~bit$H$&2Qof3e#W+gyQJOQX@7OV_toA>A4LP)fh~>=##A-?-Ab;MuF`BHcJ5 z-4W89)sB{lj*kgHXFG`dNS{Z;C*dCuu5|I&F>A!TSE2v!SYdOYhqMfSWv2MTdFEQ1 zV?)pc$A4}NuKyC>;Nt&W&J>@FR!*Ljbq(|L?^oCyS=eyDu8eTVnG%_wGbk?$pWs1t z5A1uIJ66P|L+*Z-bhYdezwAo$Y;dsSGi-n*?IHP)IFdW!m0|RA=B5gp<7BiAzbl-@-8l!J ztxCg}s?S)DpAq`cLEouoqnj_d#5`7QE9YaT_qY78W-R66w_wan^Z)TQ)7C#RM#8A` zr<7k!J91oY(c17^X+uGj*}Qjx+4TEgW(r)Y&r8ni-kXn}7CtKN%R&Z~HcI=Zpt}ft zOZh4T87?AylH*nEsM1zOeh*HUW``o<(I1cT$Xb6VYvL8$r8NpT!*0Fpy$qA7X852> z%@HOX&N8K%KLW=u0>>@*Q*Gn-E6!$LhEBT~ z9})u3i_qMepJ?zn{ea3@?8kKQq?5jiIq4|2Jy!f=aM75{#R$N<{Y6dy|*J2nlZ0jyYo^WbFZ~Cn(k`gtl$gt{;rO> z-t7mV-R9&M)iZ&II19L$Gl6w-PL#ZIZhH}R2&|@CZ+{@`@7C|zcqG0V{{&UsAtz(5 zwHLZf!qk2Re-gimN79pbaNFM_zKt~It|(RYTg~~} z4IPY|w?)?~{*BP(0PDbm(EXE^(0cq&)^B-HY1mIXIZNMM>x1yUGnNOve`Y-Q zk6b|dBlL*{Ui1t4MCg6Xi?)Uu!Y4!Xj}M(w|2y9CD;YHhT)uAW?U;J?qnU4oDvr-* zk(Wo#qmSWi*euHJ%X;d$=WR`Wp>MM((wtamn=%rAJ!|j-aC3N)c>(A87Kd|oFg()S zwEP0gGy9S(pN``GM$QL*8v+*?dLx1=81WQIry!jX9qbxV`eN)*m z%lp$J%xAt$uskw-oVjUwgn0wB`7}=%I*~lqvl|#MkFFSI`O{B_Szdo=nC0U9m!sm&W_oGtGC!(gAZ|<99{wHJdCVUTl#qXJKlP#w{OSYUY8)5m% zHo_ux+`uFCJx4todG4yFSMJw@ESP=O&G(oN2&3)BOCuCU8D*yyY3{YvO$1Ki^BTJQB?rN80_-i5V9A za7qI!NCn{8!FK0-KEQ{_sN? zZ%rxV%_2{jc%FJuX$r%4Oj}Bf`Dx0&i92q-=6B8olhk?YZ=8GlEA8IbI@9vrwHC|Y zemu$&&3LzS?&=oo)K+kg|8z!#IhOawg3L890P7l_M|onty6wH@B}*G`;r;6Vrka1f zYH4g0n@e;b*B6$l=Ubj%65IHGL0MxpJgJoP{`c@$PEWFoEeo?80M{MU(#*G#X7pzX zmj51$vs_p?oVjJFB^H`^KZY7TEbPaE>^txU z(T1(F9bJOJeVVg1ZrH8EzaZ`k z;wtFblcUX#PQKXu{Wz=nUUXo`xYw`=pQ(0u1Q$a! z3C+X*mhPIWEReZE<_Xqg*EiuK%mVLxgZYH9Fi>O&nK%Byd32E@gx`;=n{)C{w+GEf zR=9Tbx53w*psmBdRjwVsbPP+YFe8L=a#l_0AF?Y9Jz2>gx=4J9b;Qc?&v%DWS@6z|5o|o`` z{JeKBd~)8`mgafyzB6Oquiu_AZ~t43^S*tjabE2HX(gFF``f0K#O#kP*}!|&{@d<$vtQRDb6V{8WJ<-dk!^JObP^UbZmz2itd`Pt64nRp4PKdb_J>`{sT@H74fmUt#O~U_nvi^E@}vrp>ew z+i}Ntv{Bk8ZOZ_Dt!ZJVQlpe3uuEA9z@GtrzM)MgIP)oO5cuDJ zJIV4>(vEsB#qtlrwYoFFX?JbAsbC6iGud0wp+?ZQG-=x?WkCUL+tM$%CI}g$8vH(3 zP(a%X8b{E!TX|C8iPENjM1eE<%1C>hePPn|g~|WEfTs#Cor@fn0lX?d9fZ6Hyh4L_ zaHrCP1=)?y@%#ihg}zeg+xLO>qzY@YIhnp41r0rTqs8(sXh?8=0{lP1Zz|7-nq>2E zaDE~?Xv$;Y{C71o%>O70nsVa(WaNn?bL!z#%YJy*e#)Hz9{v%{J9P8df2Ub$7h5b< zvc7_DxC5%m&N!LF_>eV8PX7TlZy&$yy$cy1HqL(EURct21J4*>Oyk+l+}?p)e}FYh zTgO<7f(#@61Wfoj?x1|-wAB(ZDZ*S5q--#=Zc>oTEZoH^zN^!?fBlJxmlr>uJF9;C zRJot*%Hltudz3IM>Ga_{2=72nSMQvJhvGX1e(RABFMf)>8F=l5z%2asQPK#%ttVaZ z?|->3k|%=oEwbtE2&)zTh;Ltf+?_Fb%b8#7be1E0LSU?=jAkAgLz*6eGSKh9Uk?O1 z4r4d;1!V}l68{PHY4YqLRUbFQq14TE941W_GLGDDr}6#YGmnX_gDd@BHN76pS%7G-upUE$FE}xSor21Ex;*agJA@$`y z=MFc`e^Re)+sYq9EFO0zFcHz3HxFQ zXYlf#$b5Rfsb0dKy)md>*7Q4*dvO<8?_x<4!XC``v@Q2ncVwnfb})V;OGvBUX~Q^Z z;XcfqYTNa7OP(m7Lb%+Y`W60Qzq}^Ryf zd3Qt5@R}2^#Mf;2L3#HC&(pmBWp#FA1@DQJQ-|-nXNOF7G?4cr{2kg;r8C-&%y)b&PAbZ z(Gk$!O`9n@44CRDOY%O(_kffrb2Ih5&HbMTSP#6-TKjE$CvJ47<$hbzKESs^T7`R^ zDmrI|Zw;HKj_C)3v#Qlh{kflV;y$9&M~fD1F$o=&SOC?-gakx@pAoxZ|@!Sey1z<1yCVuxQb* z8AmVFp9xkRy`k+8^j;zSUOxK%%nzwMH2=QLKgB#z{taW~jkoH{pV+iMbJB0OmH+vJ z$1)fHXj}Q~|5=y$d2~>5Xv{?O@41_+JwCWt?lSs@F>`c!NU@9=)1lvF%J?)5f1>>3 zhifuZS%ZE&W_x)PVG~|)WR4}xgr~NZk0!ih`gHTLXywes#Ql=zzdYM{9$`KD1O5E@ z^vUKHzQ2ec%{qvCurHWlj^_UBFPIG?lE)Oy6mx*kzTEx3 ze++k&<2%14`eL)(N&gSvIu>m^Qyru<&8pV0h^pIOta z_U#(-2n`&7rXmJe9jp2N{Qm!LRQNu#=4CbgZuCBbf;fj4WO-kG@2z_e)4dPSy${j7 zkI=o3*1el`?~%Iqi*)Z%y7x+9-tW-8|3de^Uibb>-TSX~@4wZ(Kcstq zO!vN7_x^j``*z*?le+gm>fWEzy}zJ)e@XZLithb&-TPm3?{Dkg_vzl>*S-H!_r72E zen|KJiSGS~?)^*M``5bn?{x2{bnidt-hk7lEu~uMa!%US5@X$I5%Bpmsl4S z7Uf$fUUJFQyz;{3`Q=k9%5$gYmR6L-Ws$1#k}FbUCSGjKDKA}Cl4mU{EXlW~#3d-R zOY-tpS|?5@%A05{U1ZHGEY2^fC@d|p#>r<+d3nw%>qIG~qB5s4zp!M>CI1qD3TL zR#{P)moKUESC-}HR_5nf%X3N==UXRH*fgHW0$F;cR#%cFRblK3L}zOxUuAxAS*5kI z)Oy+F=~rKU?X2_#ms^*WxG+Fv6DL$m)RiBf;8*z-`T4j3Rh06Q#VQ7SgunP?@K>3? zIKSLl3dR=|m9DU^D9A6d=H?XTE-P|&RAoWFHK!P?R|tE5?4OPnq4QT+*0 ze-HXSG0Ato#|xCYewQv^RGyQYMTbwc<}9S4)@5a7G_XQ>JG|(?gV7TC}XVBuhoO%GhMmnyO7&pxBMy zRR8d601iE-yM@Cie!WYnDD&oL24`o*_c+y;UtFG5uqv;-)bOnD!Cz{OT96;}zEfUE zO;87h;e3Yi#p2x z;MK-aYKp)8=|3NcjX|Jw{q;mHij7Ip<@bSS{kZU!ix({`Dl$w@)RpQFU)s;gtN=?d;{sTJfHaNA$(ny*8})`ws$FV)%nDq zl-C3Je73iT@O4>U58%_|Z*kW0QdoiSQo5LT^>7&|N8_)tF{x@!qZ5>2Iu*G>g(EAs zsB~Fgg^;UZ>7t8v>g8VHqXE~`lldYwNt-X+c#MsS`JeD*Y2Rw0i=N?82cJr5|AT%$ zKmDp72U@?{%X{2#UAz4fAbisIx!_yA2xW}1=Ih|`OX1`b9<>xNeTy+b+;WaVIYsDi z`J#%Y%ZwGTYiHvBZan0(tneEizZ6V9@qR8ku$T7)9={X{e!;W6vb;FnZ~XYRVD%fG z7{B59-^jT_&&9)PpOfBTqk&H<0XsYZpzXFGl3FH0yw8g7&%T=n#XUgHzHrPp(`zbkEk4*%zeU!S{v zpGyz}dP;qXn(Ut?Y^7*uQTfN+zPOm4;UzA{FaE#EHIRBV4&zdFa#s)L!T1>6IPO9IxLDmh z+LQco0oETM@8Lr|sXrkm!2HR9B64>}nNQny&{s8+gHNf_#2H5`80Nd};clV5b zQv;;m0Oy~C)WGOBF($D7OAK)SONV#F)UwUt&yP^p_YD z82?O+36TC`1Ejy$!1zaEY=HC^8zB7zDE}qK21q}#0n$%wfb4oVu19U7~uHT>#=&U z{z^;=5dNe9`!6Zb_6OMi$pMbPs z!1YsNYM}53HvW=4>xb^nK=o*TND5FsO$tyxN(xXuN{S7Pza+&4CSNB7C|@Oc?2ldN z*W{$0?yMJwzRL4+@>aPIf8|-1=ad)bER>UbUgz0jllGt81;?Ms+^UAaKiG1$Q^lUr@DDNf32gol1)Hf$31jg@@IA9nMT?HsF zCM5i|>_`l@^v%Rw%CDtinoXM2Yj{UWLXVON#QB=NDBd%PR7-RC6pXf06Sm7sGjd zL|$PDmJN!sNc(k~Iw)>KoAR8zoN^8*<}X!Cs#sROC?_{ROARK(olYuToKumNvrvV_ z9iCT8+Et!(b|))x#}^momX~H#X-G6JMnmkA+eR^TIRQPHxM znzsSY&8zkqC50swmF3Iu832mZKWDfnIIAS5IKQZ{!aJVMSXf#i^_FB+tjMV>sK`<~ zMp4wSEb($sREaNwPT?yG^K@yYLU(=+eU|fmR(`K=SAJKRcmC46LfUY4eto!>-x=nW zzbvObr=parFr0s9m2=K`S9!WPcYAUxK*2fS@d|h4cZGSulT%5To+H0kxGTRaO!61y zF3QQvTevzu)v4+#a=qisU}0i>oHJe}mWp!ccM)(FmQ|EG+g+4fRG<&w+baRz#hv0S zy}n(zD9>M{;*#{P=%PXy37&6g)$4niI%GZZmBnRV@q9arPyzKy=Pc^%aEc_I)*dxC z-(CRmt+hvs*V?0fYx&h$bosS!Ex-1y<=4Ko{AvSr`L%B?zxJ)=*S<^3a+WU3*CW}9 zm&$^|5_c%&u0B^n!d+>cu_}_B`CZ{sjJ{u7#kdlB<+-BARg zFBay)pE^D~^sfaguJPgd&MjJ8uBMYwqSjNO51?MJ1bi2FipRLsQ-Bvd@gBKW503;3 z9O`c_Z)8`2cGa&Bkor4)b7tO?fq3}7?mMSwp^HVUMHVeAU0KF7s)fmSWzI6~QzQ#C=>MGqV&~&tK&hJKE6}D%sl$^vWV4x%c5HUEkdsTTZC5qw+Nv{Ds*Lq zIlRkX(Teh{(%f9Pe8o5_&119_<&_ncuMm4(|MmMa?hM(L`WBK5+p=qRhw+Ji9fvXo z-&w+oI_3<+Cir#3m*kf@We?#KR$vS~4_tnkh4&CHRWLIKm>`Wm4}5-^ul5i=mBaT8 zzGT15`+EqVOBnP6LO1^WGpFt$d@2j{13F#*Ci^>Xd%%w{_nNS+(vtDC1C2{Hb*!+?HyHH&G3 zSk?MFG1)Kka^L-}KV{+v96tHJzPyS8gRS!5H!)fLoccR@dba+#d$C_VM4*;$}AR9<%KI$ti2dDU)hd|8V(HO-lU#N6$_?iyF2IJfAQ5z8gF{q38jglhlHZ9_MoNjie<1 z=-JTxj~~6#)ukl{kK{uwy76_s|KIJvuj{gm?zz@eu&FAjQ6I0BfTq&$_1&eg6||K!&| z+tnEkL;PV;5#ykuq;!RG!qfUK+0S*DJ727S)b_)v($N~i!Z=@TA3epa0?I_$n2Pyfan;t!tm32MuIF0{^~+l0XAN1bIfx=rwd zZW9f`>9b$F#!L70`YcD^zbh%{ywHCD@OaT}0Pu7!ryG9a6F+)9uR34jD1dVG?J@w5 zXIyl1A<9|fqMMDiv(p=rw>owlHuh$S=tqh~?<4 ztz4E<)M?+fkd4@a((+0!JE|0aS6uw(IQ!HbtQM{@xUD`&efT3VsY1>7-vYX@N=E2g4_M-P`6IwEN+*6jl1JV zo!VbfxSG|e??LBoe^NL8#d}n*0lahe&`5h%x=!eJY5(MevD0mGaq8(tT{{ioSC`(e zbq}=}qN9~gvq07lUD!|fY7d5G9{9TP)9dOtU3!({bUWT%`#Nz+u_~wYBfX({f2A1L zspHuH_KUXE`^QtNfKtv-cj+ix~Rq>hqJH z{abIvCB^&MAMt+nM>qak&*~3j>%Wz*6Nx<;j|uQ5Kj($z#g60i>i1cmzCAs#*NN+H!@9fnc-8N}olacRd7S508}3dWA4oRD zrwrkLbx+!#Y-pY|RDWep+TYE^U;gyJT=nDkcDZguK)G|)Ng3sF+_g>?90a`#~PAHjldDW7qo?@j z#*oh+{-x5#;_@<#DGg2|I{N6wAk0rVa&vpyFG=T*pMsCv+@AJJ^7-SZc^qcTsxaOu ztY_Wwa&k9*?EUE%6%H<6HcA}caGXDWnwMW}6dfKs7_&Pt#J{9|gJ>{Rp6tsS#Hp@5 zfzi3wI>>nahT0=%Ck?j9fE}4$!|g0tXTN3$o|V`a_>13^Ztg4aXWUfS4X+H`{hMM; zpJu52WfhAIlBE&DpS^TX3{Pn}C{G4)wW7O0BZVmwW!>@`Gnbe<~$n{Kk30fMXKB~WQY#Rib_#c_}(wD9fdJVy^f^Uq7J$O$zkMfT3g}ko*^EZ#lrO{ntQOCbh&*Q#Q_hjQo|8?B}V{{;w z!goo=9yucQJnEJ3VANd)c>4W3$}eiY{?dJ-fBeso^?;%Pg_sPutabd}AJt{=+ImLA zV}c2XZP6OlW6%dF|%bNrU{+SGipbIYZ+Odn>v2 zwu@ri<1IEZ)zCbr^>6I?v`-S>*1*{nXE4-WS2>2-iw|@oc21u58q-5~(i=N(p-XRQ zBzw|#bMLfEzSE^QG@p9XC-@0ZH}~hB1&=ZN1rI#_@x@qtBKz0B#_SzE@EFr;>(U$I zh@SM_I50U2pDBKhUt{Y74?NvC$mk4@!Tn2j`N_ugTb}gB?6h?0{iBCuWAdk`d}I4@ zp7h4#3|)G^);Y1s#_U-<<#%&0@>%`cjbo~_)B8uC$;QrQdf+!^zu`&m=X{r9%pTWW zeu|&-i$OiNr+h!>my|d|{M_d}tKWTa%PTIInpvtR&0KsU7UWd)OkWY3V$A-<(|$ks zSBf$I<+J@N_FU&#&T2nRFUnb!UmigF4eCjJ!q;X0oEP}~<3Fk0+*jS1KcvPQ(%ZWG zKh-}w=-5$J6BITx^V>AiGRk$bmOS;?DT%=72{%z@pJ$1>b|_e zc@Q;W@Mi?A;o*WSy7%lRn!TWT;cS*X{f&Z^77Jhw~NcJwy8aGM1uGJ z#d)Z=tLEzJ^AdZceW&x**Z5B7eNMWIbYAnT?{wbhfqbS*@?OVwk z!Ev7KeZIzby#~j5viEw%cX{6X-M-U#+tYWE&KSKUd&^zE%k!3>e5OnB_OI$Yo%g!U zcRGXPBPG!oe@XGyzx%G&+n-?<>5S1|H}k%G9_+Ml=d<2a@BIwl>AdwPU8FPCj#Ptu zBh`CPD%k$nB@eQB%MP9zs85?i$F~-Il%XBZf*LS_% z>j$6dI{88GBAqe(#d^!-zRUC8ulAkJTmRHWI)m^To6qB8z0WcDuGbj9ijPe&2%o|6 zfx)a1`6WKq;P{9&HqPT?z1Oim@e=24pXfWCF*zbW-e7;k8u2BTjLn1bi3a<(lYc*-^(Gk{zext^KFQm@)_1)I`y;9A^{+Pn z#&_~N=j}JAi*$z8De=kP{_T91XOIsi8{`|w-hM=U)|=w3SMiF>3Hy8iS&2konU2{GR1bA6?Y?{rU&?{waJd|&AjV!ZAB zeW&xju*!EjWBMuTHN@XYXNZmxViF9|2kLuc^~QSJ7y4{(tg-nzAFrWBKF*wdsy#1W}F3;GyE8+jK zcR$dQWOrfT8%YRB$glxLF*yV}lGa*@-I>?#{}VeiZ+2#9ccjtoFf)=sQQYe3*YCa7 z^y_}x-EaPxI3ptyK@?cPM@K96m^~2&>=2M`8OsQvSt-UMX9%*14|byCEDpzq6O(fk za4^9(sQr1!YBF8Id|W_eqFcj{oFrw>(;HRP37@zQ#b!8>sP$}srx(- zH|^P%A*`$iFH(rc&CBwEub(~`?er(@{r+Ss&qD0&?DZzW`nA;O-QG~%0b>7>#Ov>` zubcCT_U%Cso4Id2c@Ka${TsoH1H$c(qV2=q8#}i%>+4o@{e`S&@wN+f`Zm{X0?x|Y zsfUyPXxMZY5}1_$?MeUONS@R%k_Cfu`!74yXIFLPwbh# zJ=!I*->W>{ukg%jvx6udCDSLx&owAIk2H_UkOvzmUsLX+!#iBj)~5~g?EX~#(vJa| zagH7QhrcA9{?k6q`{uK9_K6VvNw<60zB;-o&C-1fdXhfxWrN~!%2wB$y=jU|@q9^t zz7D4&xrf1d;$*g*yxn2l`~`c}WH3lht^JtW6sA|ZgDNYAlXCTTQ%=3}p5|!kouVcr z#gnAZdm20ce#`2GfBDOt`*%t%$$Gl~@K2*A<>NmMaK2Yo&sE3Gjg9dACUH6Wm#Jx- za@+4ge==^%kYU=E5kgPi8*Xk>mZmJr=Tc%xI=sWUitWp@cV(MS(&cwo^l!QC$CJVW zAAdVmj!QPSHq-s*W_r1J;c;#=eOtBXd;WH>8=rIr{lm$qeYH33Nd3{Tf=|XLoBq?Z z;`)?Ro2v{=6!jrz5At65nJlNOL2-I>Yu9XS%4%P{pH!;d#L9gN6@a34m3i#MOnoY> zC#m~G=SYWrqx99$(Qv0JZSkNp?d}J!DU1i~sT@a7;7ZBbtSieYmF^(63T&EwIA;%; zdQ~O8<@Ksk!55ZiO4%vTLwTx2Tfd8>UfBqXE`t@<@08vg=~zI$O0u5REk(bQ%0XUz z&5O6NTuRG7iA~eDB;|8|j;E=1X%88RojKwq`!5+cmzQ6uOi*o$_U}JmRg`n-{*#hP z(h%q0e>pyJ@-Js_zE{@XRO8akm8D=@qNm zX3cTJ%|ZM`p|W^um5aXnPU@5YvO~RcsgRDse7e1B7OO)1b=!CDF7HFR+pJWJ*Oe)( zPuX~t=PR45@{U{cFK)N~%Y@GN{KuKXa&}usaNB&q&?}zOVK=DVL7|C z@vt-QOhyBd7qmduwY-z({l%8#?D z5{c)j!lbuv_wuGsid}R2m8jy!v8e~NNj@!Xalc!hPhHBg{Y81asS?-vCHeA?Qy5%O#6NF&LQ(p{r%`VWx0pz94tqg+~`dA+rgU#v%cXtEc3deoPJF;4wJhQf_%lk z{$<&^dTeuHI&FEZnDXsc@%~HJnH2UTGm2*a(F^&CA3ahpzT!uUREy6pdQr9Q#AgBP zVdC~LdA zn}B5h{_&W;9+<^X`sF&w{>!eXYx6(uO~?J-^6^k#VcN#ZT*2bA$<`+xs(bG5@(W6c$oZbP!*IUmZP?EDybUk;p8tZG;=D0;yc?|B+?6?)^Z>=# zukGoJ2B3=l=8hAK_N(e|3 z*Q7^(q)GQ!wFWKzbZWlH=p;0PCbjCKfvbNljnMxMO^Pweyxt&G+^T{(ft&{bpL6(={bNCHGg)z5o1$z0UsU?HAn`F(n*sJ9q_f|WO*>spjdE4FvqaAFy{Z*^v zKJD`UI(PhPQ#N~;N{;8PlIJUy?>Be+TD0F9t|s+r(WHD!&Ih7?rsZEi=ftP$k225K zpE>R%`}OwI>h`*}oN2HAiA8<9ne)U}`n?j_e5vDI4=#))uKooH`gm6}4*vUj_3;Kb zVmRsbj_cI%Ze+{NfB&sM-fX$~pL3*+cQadV{^z9W-Of&XqP@r4$(KL><>TjU4=iKduM9$q@VMj|0&8<<(b|8e2)5;?<&$?*8Z|d&-T;a<7vHoO8e7iF-T8& zz1QS3cw=o+O_KSfW&d*y=gMc5_v9`npLR~q?NgKX;D2z*T=@+5s%icUs<(EJ<_)$^ zk!I>|**uN%{7W+BjBbMZ8}D6{W1B4f`QFU__WQ%0%uXr~Sx$M|c2RVldI9BNkEBJ% z6DJ+EADtr|-hMbbq8Fv3cD;6Ur!VG(jTffo4ckuTc0B#(VdedZ*E2ezXZK&vF%_Fi z(aER(JSCc!Ue>*5r?sqmUx9qj-)@rq`s;P_J%4#6-}8=l6Bqx2IOlub`FiJj-s8OU zJ!N_L7uF^5`JadAd{3D^|9oi@pZ|s#=X=U};Ga)*;#1axlIIJTw{Pzm?PPrQx_SMt z)3s!doBrolYv*xS)-v|oV zO>cR7$vuC}q$=B8YQ}kPPUCsXvUsbFvof(M?M#PXxF1);DW7O0r#uZw&adT#2=}ji zl2m02s4#!IN5{Z1iA@h#_dF^rxp+P@oBpJI``1O*$!B!Vq%BKRU!3&l#=Y{Q32(Va z<6h-^99pZ&>oKeT>nuq=R{i-X?>9U(Y4#B7?ALpIS07i_gY^RH@{g_~4?08bn)h_M zE6=ma-lI|O>h?f!zZu>SZ*mbn^B~<~65q0Q9tFpx+|r!gtF~uw(xYq#{__`Yy;uux z#+e!NT50-bn=O5oC>C+vb*Zk`|o&9?ICGGKRy%o$yRcjBy-P*PfXqyKJOyvbJ z=CLQ8LEBujsxaV>^Rw<>AGUz>$wM`I<2lmjJ#H=_ee$HQs;P6%m)8C3!xoUf{r;Xj zl%!hmCg*eO{`bl)AbkfiWUrb$H+|lIW&!CNjBd=6KL2{QI_Vo7PW!T+tv%iEcdre5 zlSz#xoV4GvdG{*kLqY#Co4)EzI7#0kuhSQ$uX+=9(pPf6z6igdiyn;j=4dDW_vtOB z9tPz+UpmX~8(D;>Der2jOv=0L{*&tI3y#M!mmtl0(3AJG$+O6+wwNS+{&7;Ba?VR% z)fVHVZ{h7FNT1xP*f!6tk_GnmQEt`7G*0>!ems$|QF(v+hVp*- zjr(-Jw|)PsvgWs?N6WPFuTFW-?)QF{x80kvjVI-;TraSpTz{}pGQVBkzCG=1aO1Eo zeVaVIde=TLJZZvpT(hxh=o~li{K0(ntDodEQ-$i}GaFmAe9rxRnX3J@Dcwx2oq3TB z|Gd(C?z#O*ZhGpJgFkjnsiYkI^)H&I+$eeeO?i8)Q+}D&Dd{fXkEh)i%FXO&q2*#@ zuUantd9kGbSXGvvaz1}UIiJ7bpLa^qx27ET`R9q8_`K&&$@l#8I?nfOeJQ*@Ag=$) z^_Uy}7hyR2RpvvvZhXT(uaWF`Ls=gFc?c&yWj_4#21$II%JT3(kTi+U|6D5Pd$xZn zuLoPo^ArCANS*!at^;oR*RRI$Z7%8ZvFTs8>cr>0p5%N_nGgT^iX=YedBLXt`B+YT z%6znx`B08`H|+?*9Z$BrG7 zR=wXD4&~MK{o#(B{$yTE@1#?AoY*SqU+bsy>NLErcqlI#NY226_O2M`=bTU2{QKjL z#&cV9&nFf6kL9^2!3DLPjLnfRf4oV){Nu6t%PUn_bL1x~r*wRAK1$Y0&Xo_j4Ax1n zN}DeqIq@a=@Q-Kf=OeBUF5n#b$d50{hyT1`zI@C8&Y6$d_>z41&zI-Thr9vnmRle} zccz)QDC*Blx!7w>x$!3Xx?kQe;z_L?lf-*mba72NJ71GPtk7O%@qbzUby5242 zywjF{U9YNM1n>B(l<}lq`d@VFd`~xzv9;+x&c*FUIghsGzdtBRpZ|qE&iDM|qBwoZ z`L?Z+=N2UK>E?H~wp8_Sc}X`fC*Sj)?O4-qrr`>GHO} zYUz@pU1u!oE6jhV-8%2vlk}+C`SQ{t@8h+@QF+m;KGBI^$#^a}2e zC&wl6^Pm4D>Gt;<GhBEo$o1+i~ezTVShB6TGdgdH@<4e>Eh#nys6B)pQ!!Gi?)>CQ|3>3zE$#Gt+>9obn6n9 zTe|hN%Prmd1^J%RrR2OZcGf)yO!lig?#Tl)b>&v_oUSB&-u^WykCOGHaeV&s7$-j6 zaiUf7+=*nrN|%y#ok@I37u|D`{nS&b?X}? zK4pL9e{Oh^5C3zwo$o2jV_lg(|NWrJes%Nq%Pr-2zNMRAm-v+RMK=#G@hRJ{ay-~7 znZGSRKDr~=cqXj7JKEW45AFH{_cS&skCOS;^8LCatn&Sq$7jdy9s9jEm&R8(?z6Sq zAB*P1%yIIUcX_^Y%jd?pJ?eJt6zOasx$`?M|2VLkL(X0`80qxrjt?@CraE3P>(-~r zYsGZOIXMy2?YHEmZVcR9^A;kowz-j zcBYeK=eB~Y7|Q1@9gK$4{WmuYCyktZY~&9=>g{(hlE+|7`v+zbop0x<{pVJ*nf*te z>-nd#Gv8OW=d1l;t0blIe)FeeYVTL(M7=`EesfQs>h1RfqrOy({zN7aygQfjIV+_& zoXF#dnr`zn+qUF!l>41Yvv+ga8%~=K4tART;bhwD?3n&SewD40dG+=D+t})*U&^bj zX2ou+x_YImCsDRNXsUSR#>X=GDE({sr>`?^@%QsD6U}_TFrDrwWap}Ryr3tyN%^kj z53BY2b&u+b{i@O*yvN70+T2Nh{_+id`dznRzdE=4=~(@KUALTrmN)Zm`^=xFs+W%2 z_C1>3T}SnGJ%6||&wf?z>-p1G`u)1)-S3X1GgR(3cNnMNZ)#MZIw?_&JY)C#X(xR; z-24ag{9b`*zXgx|*YDS@?~45v_7m>mY@T>r2eZD-toZau#18qlJLnx!>DRx>H`@Pl z{<1dx{!`_!do+-DllU5Zvfl+Bk4J+YdnHyLF{Hf|lB6T|^k*jjitDOwNu*Nbo-nBD zVYKyCZxu?7tCsUGE6wCXwf|x7hV@kJzc4Q)Se^y$#(*iU3h{|sz|8#2R z`>J%xEe+~)=1*Vi_v_Y{$lKOme+uG!=RdAizkj!UZU_B_Z_kB(Zax(8BcPf6yQ9rOuzz_rJw=CkC7KC*AI$ ztdR)gG8?}6;bvz%IvVaYC8}OiuJ4$J80D)qdzqv>%GCBV(?Hd>pRJdw?SqUSbSBrL z``%2hX4mDEN0#+ju`m32-1s-gz0SZ)3QVOCn$uD9!NF1U>aA&SBF~MUw;WdN4Ulm; z%wCo$PrBsSK3YA%m|UAKBLAzlemLKP&ah--$oEDlf67@-yumwU^d| z+ai+v&Cd5!buw?aoU~iP{S!_)t zrHbDz2a`S38H_0fDTng;*6SsiJhyRMTduU z0VVy`%z5B_DW4=2x;)pf-^rfb0xE2e?)cgCgQk3vD0GRH@+pkJp!c%}=L$V-QeO4O zCkju0N?pvk>Z2V#q${I|FI?Z!TANwUH(!0smTxrP2$P{L;KK4Pia!_)sY^J?zm3p+ zjMIGicT4rUIdQ5q%!os*|?bo!%}MYSV0 z|NZIM%;@`45aoY$_Bu+v{JZVg^h3U#JNaLoy^c8l{-;+<_g`3#+td)@`&R4Fne9on~!8W&wS3D$5oa8?DBqZx(nUh@(+*eKK~^D zp81BH{3qLa&f|RB&8`RX<~QEoqQ-+MC;dSqPRH!)0KMriEHC$Lzv^U++YeP72NkBr zb*V5&ja_`_Q91QNpAKIwPR7Tp>kDefZvQh!xwL%q-Z>s}9cwb~9{1KIGj372bF7{a{&_moTJd>^qI#WkyUP4NHecTC z6qmE>9LD3xhQ#B&&L)>~#@@@FTiNSJzVirs<#jenQ*UF>B~N`*ZC^GYmA`-c>Fnjs zxqVto!TYf1b#7&zQ`4Hg9WtqR9w$4+Z!^0iy?E*M%vr4L<=j^0xvsP8H7cenb=fYd z7rt?*D!;ewWx}|gwaTso%x2xx)5OnSrq#^br;eQRM1Xe8KQrs-w1e5(PF0SD{hT|V zNHSq6fqHJmw$t+KYrZ{YW^E@A$7s zU}3#--7EB3k((Spi^s9^q|5E?f^_Mee8)*edg6Tf*6UP?$2Q#jen1gVVY$uvsAlrx z{LS88Ua8^4@ytFBB#9>&KiD_drIz-|0k3S_HoH-FfV5&CAQh)$_Az3rbR^qb(EM`p z3?-HCZY`b6GtyWchgteF8%Qck7kce71$A@yY=U0-G&tEFlO^Otk* z;*bTzlddnbk4N}w<;R{tE+9W)zo2+dpLqg%$plzb-?n`7r|*3F?D@;ifHZj7ZS3YO zE04!VTfTYF3h@zw`1|HHDE+cqxFf%f*~gZ|KF1YFHGRGL zS2(_K(`U~&Jd=Rxc+7QHe+AK|r$6kDdvdFE*_Fe{Yi;(isI|PJ_*Q2h<6J8~RetTm zM1$^IHOQ0lh|@XynzhBI(>;I4eQl*pyxgUiyp>*mcJJiFH!rt{`d%X+RbDt9mxpiu z=}#*k6<(wq=VSIYa9`zm6~Crd)gO?oXFa8Adyk7}`zTfJEVD5x z9`6-LmaP`cGD2QRJaS1Zb}qfYFv?MSX2o8Dknx(_72lqi15{WM7Lh)4=U{uxjGz@#vKx7LK|4^C5copM~?ee+mhyvM_z?)j-IT@@0Pq{q__deReb zzwDXs@oZnxkH~CO|8O$$E^TO;OWR30%KDMqD4p%g)-{xE?{TpGL;m)`#G2a>f{ttv zKFe|(SVTN4GP4#tmmW{@^JzO;`n~punwi9pJaV3`^SmzKPpPgu(c+2{4PrRm_OnT*b=%(4!%%mQ8`VCKgkDRm7 zC-K&6M=59N?hDiHJO5Fp+l{`?@i*HH+{yIVq4YXbe)$z1CsOB8;do;PFWr+eP!&7_9B;RRo^~Ons`Jd6uOO3ktH1$`t$87!!)1Oy%oJa>{&S8jsGPck9eL!V3MD>2S($x6cQR1#bf@ym@!&A$99UGqWy*lY|ofYXQ%#T|S74by**{FHA zNVfOP%X>WH?Pp&Ht7?|<_BE?lp`%+KQt$m|Z^^i6!?*6<<4~9mw>%Z;D2&Ig=h1ON zo)RX@SIyD=~}OMU@R-w%s5i~Rp}}$Pj@_-sVBY@ zC?}tu3!dfvGta3j*(BMo??#f6NW@s>A@j$5Pg$FyO42jm{9|Ey+*H$8 z%VKeU<{THU%z0k6vSBN1?Q!AC#)8K+ZvC>?l{B?0=^s{VUS5jIW5xHJ_B!>;?e}ea zX&=ggL|Mz+eAOHOs_MN>*RI@op-xs(|7YJrtQtO6TwfB%$nWmgTU~U&;P&G; zSLAiU)#~Bux~<5S+f`wCx%H?{dgeU;UcH~~JY1)wHBOBOYMz%BI=lUkvwljOwx~X~ zd=HkZ(~r3Iu|~QI^Xt~DMaJtoChM5AjB)?csyXjhm|xeiM!E{)bsZNOuj?3##_KwU zsI863cxKu6+{ZfoqnqCv>8g-lGk$AV%CvL-x;*DR?y~QF86LN&A6Q&*r+5FVA_nB474Kv)k?K=5F&a57uoV z>D*dQ(&;<@(5Ca+cqXB7`TEA?+W7ZoqIc47JIws?sy6=pJ$YPqXFBfRES`sUj|wJU zb02TId}{SaE#LB1MfwwG&vk1>Jca#kUcNKsT_xj5dOiKHBE3mGp8m8#Jih5XUo@AG zu1=)l4EM~uk9k7*)zQ&#XY#h@(V-kygWv3A)LYCS-#qT@$Qy5D=Bqt8nzncP<6d_< z8p|T6-py{Ww=-#mkqvsoz3G0iVYUF~%aj>rG!-iK2) zf8E`^^2|8>|CVo_KTgqX+M@E`TCo*0zx}JW_p}?$_P%wKitRUj&mmTA@44Kk*?!A& zzOUNebDUFbzvX+6i(>mV-}6yD+pGFJ#rq-)<8jCFyMxZ2^6`98y|x{f$qzU2`f?__&Vzwg;zm9Nfp+TQDUUnCZ%!*_e)!qQQE#lA2fCU~xLuJjeAq<&%?+VhzuF1lKjpPpx>|a#q9> zyZGKK?Qw~>_q|xhvwdOtx*oTCwtRgaaXNhG1)g+7+i&`wZ|vE=FduIH*f|`GZ?tdM z8P{(5ZWoz1U6aEb{hhk$x{vMYc5ioUwPw0}&x@Pa>-uhIFsPfZdgCfp{n{J%cdFK} z@_EbL8l22n1}6Y<`|+*QuH)|ZXM>IzT==?ycs#MPUT^%aa=zVb4@bkcoSFF#I?niJ z#rNKoIxcRhxaslgD33oC;)}|CbAl zxW0Mk)9a)w)84CI-zvt?@{`Q_ zdum#`A8z^H>rp3PZhdpp<1scVQsr;2LOb%^=j+K=T>op&r+BZsb*8eW-Fs1T%f6m5 z?$2Akb<%czJSR%=jPv2UUt6`k=RC`^eUK{m(X&ClE4kj6lbP((ua`9MXVb(JycclV z9Q231X3KXQmnWa`12pZEe(i2;M(59GEB&5M-~6d2edd9pN%E5V;d?(+S-i4tA(L$< zUe9q%5pO2Bn&;BFJx@-tq}Nc#?ZY=;?@4E2f8`$M%=YHGs$Dl?9*}GcpxU^u{5*Lk z->G6rXWJ4@sOBuB;`;lz9>w*s(9<)|T*uQLALpe)lUZ{d zD6cr&sy1;&erL)jy{A<16py3w z`lWP4su~sbo2AQa#?$HOdNR_veC1t_x!2))gO>y)BF4jidehmW`D}VUN$j z9=fC9ZhvngpOhT03lfwWo2)N4&i3Wynv?!$*mS|=Nl5Yt6F#E0Qt4zeEf2o`p*)DS5 zN*~rMN2SWwv@5sY`fGfYo>u00K2;M`m>##gQlv)}&(+b*!;x~Kh^+;Qdn+^Vv#@-+ z^{GbsRQZFp|2glew^L(+Y>5JpZJZGwQJed=V`ti(n;4Z8O zZhboF+#Ge~=6nr!=J>Xpd453Ed={q9trv5pFFo&DHGNUNSk9bx*N-QC|7q2D)LxUC z<(av^uxk1euk^fJ?RYZRtLn#NE7ao0CGM<-y!X4?HiP@JQE<|)W**<7$e!Ivd^!_0 z$Kv@Cw;feTUtv9S`;A4!=cX?@FKU~Yrh5-d@p(<==~j#PbMspveT9B*eTm}pWHxF~ zndPC2&!<}sgGu|aJ?>0Po|S9rUX;GpQssUvw;~t1x#dtHeTDJ4`K?e6t)K1GqU-fw;fBLHTza{ZiJ}&ssxD7q{IgT`Lvl?Sji0$L-~s;Qx~g7)gBkeo7Tzg??EVpM_GD zt1rI7a&V8gxA%Mfz5PlL7>OM#%&*LyPN}(*UEOJMoW9HjJzstHr7w=JLVxdzPgO4A zIs{#ggENmLo%(*um(Do8%>B1>J7!*=HGh2ic?Dg57wxy0{-&_rxaTo)_k6pgV~xwT z!i6ZGTVcA~enye5!gx~0jq?1d;tAI&OxpSKFfOjuK3&gihgFjq&(ma|Yg^YdE}seuI(+$7tRHiG*H55&o!GrKHD(o zK5vT4VN*Yky1@1nAMxzr$*Ci8y0&bw&7aTm_LQl&W=ZTM`?6& zO!~KbHILt|3fHH7?mj-TZGYrhieT)86l_AG@WlV=QP~6t$bo z>kR5v&*JNQZuv}h9(-^&c-gss6;g7XY^_zFu!wIv3m5VxPXP-*NT$Ckr@MG&E|_m9 zTL&4o9d!~__34@N3t>@t%YAN@5Af>53V|xUru~<^XeLQ-g$pQEakc3!dG?UoJ~uPZ zbyGB`D!e-1vWIAB^SxWXP#`L&%?b+zY7|p(zTNYV{e$pvoW2=!Q(8{{QvLj3G3DhR z4=bcw)xH)TpXs-Ef_}TK|0_(No8RcEsh(nr>Q$@40*Zy!EBCmiNN-`j-TFE1Rj;2F z*8APJ{G0Muz0KEYSDELreAW6vx1NpVsiNj-yOVB5?(7MkEmJb^i0a*Ph5K+8>Ry)q zk_M=&hjX}Oo(Hq|a&_+OUsU9oduo=~*5!EeRoKsZtN6I(_AfVYYF`T%pI5Fd-Pd8< zSH)*#X|veJ?Kkc7*gOXd=Xk!dUU?pVF~@VaJWYSuIg~dS7I!vLKhw&*_ghir?REU4 zX@6kv7qg=o?YKKiS8*p2rz`Uwkh@l#yIA zyXu@)YVHSjYfPBpWMV6Ft3KVPOkX(PSYdfp(P1t(|Aoh)oLm>zMrFOeIqh8acMoyD zxx6%g{~(Y2-=8V(&~tg!9>A;2L(UYKH~#AFs9O9B=s&&buW+AEQHArzUwK`D%12e7 zE8Kz^weJeI;ix!t={&ZiT|*P6)3)2iRclo`cWb0`!Oc&X&i1&cyx}wUtbAFl<~rS$Vu6yq>|0;`M{ z`|_*{?`qVfzN{|dxG~-v53dEIC{=yAxicDS)3;Ii`p&GQlfI}OuV!8VQ>%P(=dghJuY;U;*A_7jbmFa2Up4*jTJ`fnRXMFKFJOG+|WeQB}%iz=NTxG}z_TvcBs zKHsr4&Tr=ZSM%0SRrZ@0P2t(^DOvm#g1b zqKxJYrtC zW!~4YsPwK@cph7o`mlPRj=QV(ss653c+N{DhvmxadR6UWHS>Ohh1G}qbRM%>;rVb? zeAgFnya@J}zVe_Nhfd^Dq;HTcb3)PaeSLHO>mzyTjN;!|z_>9lewD+{GwSCeY*e@} zy{I14PUp=@tE|9c&jl=xt)0$^EaLQ?+&J}WV*&GnwbOaS_ePjtLNxMRTb+MhMWuAQ z>wV-h=D6pd(2Uc$KL5D3QaatUuNwn@BAs$yTflipUOG*wz1$Yvol~!npI>MHzp?!) z`T6SL{~ND+S)=ha^8a1=&;R&)=l?JB@q12Rdg}aBPrR*p=EBqOI(zx_mF7ixC|3Wl zKkZD-)1>7&b4TNGZ`kcMclw>Z;b=1LcPGu^Xxi*t@ALe!Ahm+lI z6w8giyhGi@GZ@|IO{T%y*gNA}aeT)L_G=5Od8^kMJ9{+mXXx#?`?K-4nv+rU(v>Su zzq@&(F9{GCsYChs3F1AFs~!6_Blg9+)45eMR)2c;M@RR^p+7WLEGg3p!cjZ8G44wg z(jbDi6xZW3QWs2>c*Bkq{CIS$9XvI~Hn_b@TK_gc7I(H?Ykt}hN+rzm8)msIr~tf@h7K(_`XJdMB&@z|L;h6rG!S~ z?tf{+%Nt+w8vA>r5&R545C3lZO!Lpg;r>g0za#M^A^LvwGw6GxK3HP7_=P7@p>g|c z!wqkmo^LqewSVRtzVTJBe$Cgv;%i^|b&aoi*~_E-hW&V)t_Q-zMSuUs%C|3!a~ z(ii>yE#cqaA0{~ZJo@=)X8YyL?{5r$H^&b*yx4v9+uZP(OGj&NI5+vDRX21W@2tAv zPyXf4KjMZc!%@1TpF83Hn{SQ(HP6X$$aHGbjW^uS%~##u<=qe6(T;Se=JQ7$F+Un_ zYd&@Jtxw%*KH7ZhF#LTm8ou?ZL1$_|8}*0NN%JA;zMHML1m7?E`*QgAYt7>)n(zET zu#x@HzuijScJ{+?I~(7%AU^l=f^@Ft#b-aviO>1`!0u-d>?isB#&{&{-yFY2Lx~{# zcV=`n*crZgDu0k;f1~lZd9Q{kf#z^`Ye`-%AZNqlp7Xi=_e#O zy*H4!pE^3Y+8dkWmi=VXob(30?zATd=}B`>j@DE8>vX>}H2Vq;19q7J{ z6r4%C9m=J*PxcdT=Cmg}Y-zryV~2HeyogdD-Lnil%mA@>Q`ViP%jsD2a!-azqh{;a zlIg-r9HTh1-%HYEw3BaTzb7}APNWh_r+MbwBdufW@>3o~FJnTf%jWGXjmBWqwLk4) zMxN4Y>Y({2wJ-X4S&mB4c)B4sUT>Ij=hfkkjlhhk%!}coepy~U*pl5eqJH`ErS@az zpSs-mS{s`j7EWI}efjAN?WZn1e(r*N7QgEE>|^hJJoswEjM*9Y-!o~H)a&D)zAQGYGJ?>zS2UL)$? z&F}Jd_D0md%kT15^que=qR|-l_N20(KRX;B3~uk7KPxqQuRlH75l#Eg4%FIbo;>|j zTe5dW9EW@DVdo(F`%X_9Yfs)8)0x-?btL0x115*~;ZA3~6Ma|On~gU5{%|y&?#uVA zOK^K?XVBj19m*2ZtNmfSD}~n^Pa3Tt8I8{LKwfsX-;-O3>=0YNJl*eiuMK6O+uk`c zFA8qkxWez7@@q$h=h;thXRl|{+v$(n(Wu!?z{O4wq5F69iLDRL4&1-n?Zb#WgCO5- zoM!t2^B?&a{oU3lH$Hc}D3S7g+gnOo+mYL-t+Rbc&(VSDB%{wvyjMp@w&r%GSJzgS z+lRfeJ?u5koW5}W;^n8Cr>F9&pd;yJcbZr1Dab|nM$bfXG>}pJW1a3bxqC>yG;Tg5 z5eyH^!AAZaJR;-w@gpsH+w9SSyfr9}rhQd5xgjM!F}EF=4P`jl-aQ(2O(T>8MO%m@ zzcxKmuZz-Au;=ceD`#hilab`xq$Aq?%wTl1(>y0Pz}wT z`kmaYh1*5>%iS(7i{W-rK6AIr%WAk?l;7O#^0J)CUr>-y{!GQ$l^1pHJaSRqq!pCm z1v6I3Kquws-`-?6fBPuE{_SnX^CGahF!d?QzdxQLh`4@F<=`Rz+}}-&c7Hd*?(b%g z=9StP`qINs#?n0`?eTKl_M4Z?%u@5rxzln&)Yz9H!f0>YIcSe|ZCBxR67odr{-`~= z-W#`r2T-={q`fTK-Ie}crli_EIXN|Le zUccS$$aIpt`$G=>qjsk^9!=zBqoc8N#EsJ9bl+w=A*cfnUB2{|=3_FDKNB9+<@l5w zU`({O3K$6)M?HS_iN`PN;(IJS%9;8rkC1)ls26sEvCq@?)36brF?B5P4!#{^K;}B) z&!t`M_lHp|Nxi-zpSrP_Z@F7{2e(rRh|+&shASpr&C}rlJ=lFC`aEt|!PoNB9Ub0e z+f=&C4`WGtF$tFKqjWj>abj;YoO~%_clwPm`%(N+{?e^cW=28}|IycpS2En~Pj5x> zhQG$qhQF6Z7uOFvSauwqcI(F#8AJl>C$9UGf$AJr!^EpqC%-fxK}( z7*3}8(f#6hXAX`@#K}hOeHrG?L@ec&d?lM+_uv^unS5E!5am)!Ho|V2HJ$%pP?72% zo%n)0t9nT}Z%ZG)_rk+adVfv*(cDSLeL1A3$9H?fADMAaI6u>V;*yOn?e1*m9kj@%(fA~aDCOdhCmF0rJkp-+TdPlBktXbEz`?7| zXPd6HTW9;?h8k=?+eEvAeP{dP1{rKW+Z3f8I@`}SykNW8Cf5zJ-3anM+rWbD^i9ic zS1W64VZ4fVBwsd@8o~bVOB1pc&1pv_d13mB8&Hs*#Wfw7Z*lhPZ!jT=O?T8@Y&pp% zL3#Nrcrv4x;(g=H+<4>ymsdhxv}2A4>YBqmE3m z?Z~wVI}s!uz1b}Jdl=snGIwwP63)*y)3L4CK~NXJdeHC#@CZ+6}g5l=S5M1 z?RVO88GmYCU~cNq*)UGCK_=cXlXe?>s-3Di{>YVQ+%}oXekc6{nIV+4HIvwz@<4aV zWGXRX1`emTEl)aA^BAI~ARhV6EGcl7pV*Ouy+RRut&!fYrQ1#>i__c5d9o>ovi&V* zw_DL|x02m%Rkxkgk90cMblXY)k=|}yx1C(5NN=~H+fFVpq_^ADZMT`-ZcDe_mN_m4 z<#pH(Cf<|slZQ{p9QRbNH`rP0Xy!S*S}Dh){-oPIJb(GjnTz3+w%xXw8oo8mdBpUp z{i?0l!S`jg!6TDvx09K|2ZJ?+(V{ zE`s>Yx`wfG4?#S|`$^_vY^-fbw`_7K-CmOacSO`JO|e>gz3v&G&AU|O zic$N9S;=8vi(s~q>&+(qggA&lNna{**}wE_PCW_gq-jG@mo~U@IP>=~weK-|ZeEn* zhQxDiuX*r@9Os?u$T`V0>p)~ECg1Pp#A{NSid4Sm#3!rqCNh<5V@MeK!SzaM7pA#} zp4B^+aC@UFdyUE^6;A-J>*l2W$#J$_I(ZTAFWP^YoxFU=pOib7^lSGY?a%79!`9c1 z+j{%@q8eK0O-PrG&@P1!cKd}Z8izHgG?{eJVIp{x|TX4V)C4|k-0*lE1c z9I>Ao4Ihz)9-Sx1^&}gOnNl9w^<$=)O$Il*a#?B^oKTqUcgDAa?az+;w{P2Jtwr1I z*l$Sro9)K31kCQYV4nsev)^E+=JW3EXlJJt?AI>ZX+9*6s(jR(`R&RNxh*ajSBC2- z?AOgHpJd=bhM&Rq%c<>Un`HaV!tD=w((y*?NrHG*((!C2@vKDS+u3x;3GH4lDyQ!V zDx6tM)Vw}vn)OD(aHwfUQ{VkaN7j59k8U_#Zf-&LI9@4Gd&V8Kum126yQ6sR zPcT@M{RhjR+U9-)lbnWgxuj{*XwNCnUc7MWJ#u>d_}TFMUFwltCY5YwGn%u3T});7 zW0p}R-#Ylb&~Z|QjMf5+p*tmop`S-0$e^} zj!6$US55@gR=#g?aijfSXZ_`*b09g9TL^}7!6cqOc(|F(;qmB-h1qSq-b`{O2YF3= zm(4|)ILGPO8jbh%cDGhl@dOhp(sIn~j-B{$;|lV3rB42wsw49|HeZ@}GWkly66H%1 zPfos^xWwn(JMCpfzH;Kp7NwNm-i@y9GoqH&lwXeqN0a8!p;^Qg*K7L-T2;Bo@laL> z$ca?cB-~<=>jM29UA;5kY~IL^rO^n|qw$%G6@gz z9i?09a6g#XJ$TRYuBX{)Fw)^epY(pi7etar!A3}i6@o8 zC|%LKk_g1hE}V!rcovyuFZeixrz^ZON9TV~o*w;Rka$~|D_V;L75 zw9UZQ{4{^xkrQe2f&D2T82_#rAet}BKl}ScZdD9^HNOugd*j2%+5VpX{$S#Ke^2^b zlc2pD!Tk`y!Z(?pvvWgjnP0QXZJ2w>%q|8pP&c=GNf#^kfSL0SxhGCOKafROUFjq2 zPdO=&pMy#8yM3pn{oP52{oP52{64xZV~Ek%tj;^!4>aVwd-rHy@*=N4uqiRO37T{~ z6D*f+jBV|d<77|Hc%=KT&-!<0N^n z?BC74qJM50qR&iP&A(_r(a(PueEcWT&wm^K9{r5I7o{uuY3>DZ|NST7FRu!JM&FCJ zkG>myp8cM=*TDRH{L-bTFUeiQa_g$hzRNAH$t@%g1#`0T1);aRP41(a9Gc_h`KKO~ z3el96wDty(t3A1QNcy6YEDr5SWtb=4XRiCAt)E^w{q-cbM!aGmXO!Kx+-T{Exw@~! zYx<@od9Z*d!L{PGE3ew}WSHWJtH&GG2iuVpM_fDJpu;JQxOTj@11yZzTOaIPeYRQX zimiIQQFF8X?gG;r#w+)wgzxStj=QWq=X!+kmoz)C$Kx`Ew|_?FFq?K^Tr-FKs;ron z#{&%HMirU<@?^nRPn7$Sk$CBD=FN|3`I_u3U_Ywt%(b5?RcxN}nc0sWUU@1*$?>VI zK7{-8_ISShJTW%Q+7*>LS!`FBnR)kPYJp-m-g;1$pQuuQ751aePW}AMRJOvRG2P|@ z_v5eBwd;YVGMD7zj7&_*-8+g39WI*okooeV+K;IL<-75gi+VqDK32A`h2%%h_wMU{ zq6T`u-DE$?;+d~}!u?3`6xOu4$|a0nise4UU#)|wpO2aScsrQ6_fs+uoI8H=Xe4>W zMA6yf-0^#l_Wpi8T8o-9ehq8VWpf?Aur8GyM>O&K>T2Ei!y06!t_sucbq}vChRaKH zcy704<+jW;2G^zwcT#qIinfuRT<|x*TJcKjo@XAXFuk40t%HI>t(8t$*CZ=B3t}uU zzx;H@)x%5}7sl;Nuf1TAo^?#7D}0rpq`u|Ed(<|M$t#`~^VZ*-_^vNFzLMEifBVWw zU&+y|a(soewiU~_aFkFQ&rG)-*1zB~mXxl!x>8)irSYfhq1+)+99LO?ms1|{*qw#O zS2DXw#ERHXIwJMlCH>-DrZxTHa)m*!gb%UqlYKg%uYIKAm2SWvXJ`88(pw&uN2r7+E37)eY+}c zKk4|)WnXX7tHme%zdv!xa!QWxi;gcCFZdHFc~+*=p7Z!3Q^sSC>%M5T>FJJ^7ZcC^ z>O$ffE{_%xPq!o*t&bePyv*8o(xVA~l(q$x)dRU~7>qqj;!?yDj5+6z$Bb=CVkvJY zk}or+SwuW$%&>@fl4Hq3t+$lLsPJ~;TV8N{D~pTI9E%s3UmM>7^K0WB?Ng_eZEm zUpS|#N}eWtramOscx`)C0VvB~9ibw=&@;H^ zQ&!+r;xpHH77$%n_@kSTamxt^#1KRG){}p))N^sMZnE(i% zF)tG<=ItoatY}+QrHK3Aa7f~bx2i0tg_000IagfB*srAbJe6i7Jo|fOY<);bq znfcq{iywdPxs$uQKXobyyW6|FCcOT%35~|5!w|-M@e5BhUQ_;T{v~`-nVWy z8eiJ}_;VkWc>mmEjp3OmKK|UdocuNU+plH+CN{}Ff;0u`k+f`o>$xZ$NxGx-27mwI z&;Q?#X2T0#_@xuC{qDbY;=)h;jT3vn_urrR%y0bXCqDBFKXLLM_kR53KYYcHp8U|C z8J&FWjh{Yo@Y^pt^%t-Fo0GrsjxV2l>;L`}Cx7^#fBD3(zkU7Gi^GRc{k`vc;MA}F z$`?*vSpVY_r+>e9>J>lyo>TwmhmN26><|9-$^YOz-*EEQ*WNz$rcd`zHGkpJQ$POh z-#fYc;_FUk(_wx;e8VrE_{=~4u@je1jZQrHs`s4u`qSTV;>+D1IeF&F2Ty+NTXs)Q z9#}nj{+m8@;?6hz!O4F$`rl6e;2VDFKl}H8T0Z}2 z`Tu`o!)t!?jgQLr*Pp-qtLvZof>XXS6>CmI*eJkj{xZ+fD!|2g^lYlFWxR;5k;xP&iDcN(AKRX|A zOPQK7Hf3$f-qZn8C*Cx*e>Zi_grxl*o%rF;AD#HMd-rTGeU}MRreS#D^lN_e6W=M} z(SP|}nX=~lfS<~%C^x+;tS$Qwl`&O{{9Ks=O-SOZDb!N1p6{^1mT|iyl3_& z^~lyG+2Hw?1yeo$q|SVM60}5VoI}&n4XbUxHxTiU}`$M-ZCtIM*=Y z{T~Rzmp*h(%Hmw(eJ|SMjl^?C;*nyAHLXV{EmcwBH@b?J}u#ABz#Q5hb5RX!$k>85+0E7(p_6h~V~STxS{~Tm+kO4E z8B46Jyiq=Ti+r{upRLPhkIH9f1P)|bx?<+JPZ+4sutAC#XT zlFvRYfB&!L^BpWE5}sn6ZJ_mR)-@9utXX=Oz|Ykcn6=broJyZ7#WR>FxFq>amGr#7XX z%XegK^%42`Q{r;>)br2%(^C?c{Qk=A)s=7FHg)~py@$7-e{O4gfA^exc3D1qzkD{3 z&u+=@-zWL|0r~9NZAts~|8(zp`Ro(&*J}IC5f_(N%^8f$-)S;Ch`|uZ%@$%0} zeKz4|!tme9PZORGgK0x1JR1hnj!gJa7`|72ns69~9rV*GqVfgn#>Dqw(7k?n(HRgy$uENWynZcu0ad4|!I? zT~oiMo<1vS|B8f%PRn;Bd`QCc5l1jk~vGyc296 z#gW7l#r1;3`BE56oKd_{+)@0|KBE0Z`-=7#?lau)PagieUw-np{$r_^uavm&NVqHE zRTBS`5UViYJOIitmdio-mkrqqw8^qkWhinf;hx_7&~VH8T7C z5!u&UC78bEWfHzDaehj|MaA0(Z09k zcN5+phCA}pglEI>g8Ve$lVP|kKTY^j7+#W}CVV9fjmIQ@39kyn1M<^^KO2Uo{50XA zFf7SW6E?%JEk8{#`7q&P7`|J6n(+QG?8{FR4kgqdm&uq=()|jF!_=MEN%&R?Z<6q^ z1XGtDm2g(V1qoLqn7XwiVIaZ&+fM3aL*i;m*p~2q33ntI#}_0Rzq=BQ+e;FRS3}}> zm4pW*7@wwuha^NEk%KXa@*d^c)Vr6$@Fn?a!rd@@Qhu5c)yHS$|4q0PhWE=)6Sl+9 zl%FOv!f^Ml#3kWQ7#i}^2KizCZOeZp+zG>7`DsGqbP$^I(}e9XykCBra3>7L#Do_l z{LYK_e?0yb*~d!~z9iwUgilI%K|*Bme)<1x2~7zN2~pnTJWJk8UZXrVPX~F6@)YIe z&}?t#d7i&~e&g@_@kclQwanAVw*NouccWv)_nrF9Pki#!rBDB}Q@?fl72B`-xi`xg zyTAPh5B(JhpW6P(!+$L26t5M})zfmGa9YOXr?bbJ*Zk)9oif416U7z97sVOHo5UT& zAMGRBPqeRSf6+dp{hDLVr@!rMPaU54_^H?Z+&_^0{{E@kuY3LWZ+_y*?SFpzLz3p7 zl=S`&+u#0||FxVWG$p-fPOq*^PXF3#|M<+yOySGFZ9002P#uZ@u4z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95{fT`g^Uij^hCSHK^2nQiKFigXXVh;%U>Utexj|-9B-k<|D=M4fObQM7bO(HKM2rsIOAaCsRZ0EuACltIM zc=P@~KhO93I`AbxfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs 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

F`vOdUiAN`W;ML-om!;+ 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

cD#09y6bHm)OhXF!AzlvS+K; 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 zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu 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 literal 0 HcmV?d00001 diff --git a/driver/src/cosp2_io.f90 b/driver/src/cosp2_io.f90 index 2948dc2629..996a2c58cb 100644 --- a/driver/src/cosp2_io.f90 +++ b/driver/src/cosp2_io.f90 @@ -10,6 +10,8 @@ module mod_cosp_io calipso_binCenters, grLidar532_binCenters, atlid_binCenters, & CFODD_NDBZE, CFODD_HISTDBZE, CFODD_HISTDBZEcenters, & CFODD_NICOD, CFODD_HISTICOD, CFODD_HISTICODcenters + USE MOD_COSP_CONFIG, ONLY: Nlvtemp, NlvdBZe, Nlvdplr, Nlvspwd, & ! added by DPLRW + lvtemp_grid, lvdBZe_grid, lvdplr_grid, lvspwd_grid implicit none contains @@ -42,7 +44,7 @@ subroutine write_cosp2_output(Npoints, Ncolumns, Nlevels, Ninst_rttov, lev, lon, ! --------------------------------------------------------------------------------------- ! Create output file. ! --------------------------------------------------------------------------------------- - status = nf90_create(path=trim(outFileName),cmode = nf90_clobber,ncid=fileID) + status = nf90_create(path=trim(outFileName),cmode=IOR(NF90_NETCDF4,NF90_CLOBBER),ncid=fileID) if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) ! --------------------------------------------------------------------------------------- @@ -84,12 +86,25 @@ subroutine write_cosp2_output(Npoints, Ncolumns, Nlevels, Ninst_rttov, lev, lon, if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) status = nf90_def_dim(fileID,"CFODD_NICOD",CFODD_NICOD,dimID(18)) if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! added by DPLRW + status = nf90_def_dim(fileID,"Nlvtemp",Nlvtemp,dimID(19)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"NlvdBZe",NlvdBZe,dimID(20)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"Nlvdplr",Nlvdplr,dimID(21)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"Nlvspwd",Nlvspwd,dimID(22)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"regimeID",3,dimID(23)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"nrmlzdID",3,dimID(24)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) ! Define instrument channel indices for multiple RTTOV instruments if (allocated(cospOUT%rttov_outputs)) then do i=1,Ninst_rttov write (i_str,fmt) i ! converting integer to string i_str using a 'internal file' - status = nf90_def_dim(fileID,"RTTOV_CHAN_INST"//trim(i_str),cospOUT % rttov_outputs(i) % nchan_out,dimID(20+i)) ! Start at 100 for RTTOV output channel dimensions + status = nf90_def_dim(fileID,"RTTOV_CHAN_INST"//trim(i_str),cospOUT % rttov_outputs(i) % nchan_out,dimID(24+i)) ! Start at 25 for RTTOV output channel dimensions if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) end do end if @@ -873,7 +888,7 @@ subroutine write_cosp2_output(Npoints, Ncolumns, Nlevels, Ninst_rttov, lev, lon, status = nf90_put_att(fileID,varID(87),"standard_name", "solar_zenith_angle") if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) endif - + ! Cloudsat simulator output if (associated(cospOUT%cloudsat_Ze_tot)) then status = nf90_def_var(fileID,"dbze94",nf90_float, (/dimID(1),dimID(2),dimID(3)/),varID(22)) @@ -1065,7 +1080,7 @@ subroutine write_cosp2_output(Npoints, Ncolumns, Nlevels, Ninst_rttov, lev, lon, status = nf90_put_att(fileID,varID(32),"standard_name", "cloud_area_fraction_in_atmosphere_layer") if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) endif - + ! MISR simulator output if (associated(cospOUT%misr_fq)) then status = nf90_def_var(fileID,"clMISR",nf90_float, (/dimID(1),dimID(5),dimID(8)/),varID(33)) @@ -1439,7 +1454,259 @@ subroutine write_cosp2_output(Npoints, Ncolumns, Nlevels, Ninst_rttov, lev, lon, if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) status = nf90_put_att(fileID,varID(147),"standard_name", "modis_in-cloud_optical_depth") if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif + endif + + ! added by DPLRW + if (associated(cospOUT%dplrw_Z)) then + ! axes + status = nf90_def_var(fileID,"lvtemp_grid",nf90_float,(/dimID(19)/),varID(150)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(150),"long_name","Temperature axis for DPLRW CFED") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(150),"units", "degree C") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"lvdBZe_grid",nf90_float,(/dimID(20)/),varID(151)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(151),"long_name","dBZe axis for DPLRW CFED") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(151),"units", "dBZe") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"lvdplr_grid",nf90_float,(/dimID(21)/),varID(152)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(152),"long_name","Doppler velocity axis for DPLRW CFED") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(152),"units", "m/s") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"lvspwd_grid",nf90_float,(/dimID(22)/),varID(153)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(153),"long_name","spectrum width axis for DPLRW CFED") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(153),"units", "m/s") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"regimeID",nf90_INT,(/dimID(23)/),varID(154)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(154),"long_name","regime ID: 0=ALL, 1=LS, 2=CU") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(154),"units", "None") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"nrmlzdID",nf90_INT,(/dimID(24)/),varID(155)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(155),"long_name","normalized ID: 1=Ze, 2=mass, 3=number") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(155),"units", "None") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + ! variables + status = nf90_def_var(fileID,"dplrw_Z",nf90_float,(/dimID(1),dimID(21),dimID(4),dimID(23)/),varID(156)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(156),"long_name","Number of samples onto histogram, Doppler velocity/Altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(156),"units", "#") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"spwid_Z",nf90_float,(/dimID(1),dimID(22),dimID(4),dimID(23)/),varID(157)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(157),"long_name","Number of samples onto histogram, Spectrum width/Altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(157),"units", "#") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"Zef94_Z",nf90_float,(/dimID(1),dimID(20),dimID(4),dimID(23)/),varID(158)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(158),"long_name","Number of samples onto histogram, Radar reflectivity/Altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(158),"units", "#") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + status = nf90_def_var(fileID,"dplrw_T",nf90_float,(/dimID(1),dimID(21),dimID(19),dimID(23)/),varID(159)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(159),"long_name","Number of samples onto histogram, Doppler velocity/Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(159),"units", "#") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"spwid_T",nf90_float,(/dimID(1),dimID(22),dimID(19),dimID(23)/),varID(160)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(160),"long_name","Number of samples onto histogram, Spectrum width/Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(160),"units", "#") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"Zef94_T",nf90_float,(/dimID(1),dimID(20),dimID(19),dimID(23)/),varID(161)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(161),"long_name","Number of samples onto histogram, Radar reflectivity/Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(161),"units", "#") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + status = nf90_def_var(fileID,"ZefVd_2",nf90_float,(/dimID(1),dimID(21),dimID(20),dimID(23)/),varID(162)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(162),"long_name","Number of samples onto histogram, Radar reflectivity/Doppler velocity") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(162),"units", "#") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + status = nf90_def_var(fileID,"gwcum",nf90_float,(/dimID(1),dimID(3)/),varID(163)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(163),"long_name","in-cloud cumulus upward velocity") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(163),"units", "m/s") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + !~~~ + status = nf90_def_var(fileID,"vfall_Z",nf90_float,(/dimID(1),dimID(21),dimID(4),dimID(23),dimID(24)/),varID(164)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(164),"long_name","Number of samples onto histogram, terminal velocity/Altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(164),"units", "#") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"gridw_Z",nf90_float,(/dimID(1),dimID(21),dimID(4),dimID(23)/),varID(165)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(165),"long_name","Number of samples onto histogram, grid w velocity/Altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(165),"units", "#") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + status = nf90_def_var(fileID,"vfall_T",nf90_float,(/dimID(1),dimID(21),dimID(19),dimID(23),dimID(24)/),varID(166)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(166),"long_name","Number of samples onto histogram, terminal velocity/Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(166),"units", "#") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"gridw_T",nf90_float,(/dimID(1),dimID(21),dimID(19),dimID(23)/),varID(167)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(167),"long_name","Number of samples onto histogram, grid w velocity/Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(167),"units", "#") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + status = nf90_def_var(fileID,"ZefVf_2",nf90_float,(/dimID(1),dimID(21),dimID(20),dimID(23),dimID(24)/),varID(168)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(168),"long_name","Number of samples onto histogram, Radar reflectivity/terminal velocity") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(168),"units", "#") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + end if + + + ! --------------------------------------------------------------------------------------- + ! RTTOV - JKS + ! --------------------------------------------------------------------------------------- + + ! Define instrument channel indices for multiple RTTOV instruments + ii = 169 ! RTTOV variable indices start at 170 + if (allocated(cospOUT%rttov_outputs)) then + do i=1,Ninst_rttov + write (i_str,fmt) i ! converting integer to string i_str using a 'internal file' + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) then + ii = ii + 1 + status = nf90_def_var(fileID,"RTTOV_CHAN_INST"//trim(i_str),nf90_float, (/dimID(24+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Channel Indices") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_ichan") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%bt_total)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_bt_total_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV All-sky Brightness Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "Degrees Kelvin") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_allsky_bt") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_bt_clear_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Clear-sky Brightness Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "Degrees Kelvin") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_clearsky_bt") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%rad_total)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_rad_total_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV All-sky Radiance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_allsky_rad") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_rad_clear_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Clear-sky Radiance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_clearsky_rad") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_rad_cloudy_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Cloudy-sky Radiance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_cloudysky_rad") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%refl_total)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_refl_total_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV All-sky Reflectance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "unitless") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "bleh") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_refl_clear_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Clear-sky Reflectance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "unitless") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_allsky_refl") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_bt_clear_pc_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","PC-RTTOV Clear-sky Brightness Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "Degrees Kelvin") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "pcrttov_clearsky_bt") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_rad_clear_pc_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","PC-RTTOV Clear-sky Radiance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "pcrttov_clearsky_rad") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + end do + end if ! --------------------------------------------------------------------------------------- @@ -1601,6 +1868,19 @@ subroutine write_cosp2_output(Npoints, Ncolumns, Nlevels, Ninst_rttov, lev, lon, if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) status = nf90_put_var(fileID,varID(83),loc) if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! added by DPLRW + status = nf90_put_var(fileID,varID(150),lvtemp_grid) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(151),lvdBZe_grid) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(152),lvdplr_grid) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(153),lvspwd_grid) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(154),(/0,1,2/) ) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(155),(/1,2,3/) ) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) ! CALIPSO simulator output if (associated(cospOUT%calipso_betaperp_tot)) then @@ -2044,9 +2324,45 @@ subroutine write_cosp2_output(Npoints, Ncolumns, Nlevels, Ninst_rttov, lev, lon, status = nf90_put_var(fileID,varID(147),CFODD_HISTICODcenters) if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) endif - + + ! added by DPLRW + if (associated(cospOUT%dplrw_Z))then + status = nf90_put_var(fileID,varID(156),cospOUT%dplrw_Z) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(157),cospOUT%spwid_Z) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(158),cospOUT%Zef94_Z) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + status = nf90_put_var(fileID,varID(159),cospOUT%dplrw_T) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(160),cospOUT%spwid_T) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(161),cospOUT%Zef94_T) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + status = nf90_put_var(fileID,varID(162),cospOUT%ZefVd_2) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + status = nf90_put_var(fileID,varID(163),cospOUT%gcumw) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + status = nf90_put_var(fileID,varID(164),cospOUT%vfall_Z) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(165),cospOUT%gridw_Z) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + status = nf90_put_var(fileID,varID(166),cospOUT%vfall_T) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(167),cospOUT%gridw_T) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + status = nf90_put_var(fileID,varID(168),cospOUT%ZefVf_2) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + end if + ! Define instrument channel indices for multiple RTTOV instruments - ii = 165 ! RTTOV variable indices start at 166 + ii = 169 ! RTTOV variable indices start at 170 if (allocated(cospOUT%rttov_outputs)) then do i=1,Ninst_rttov write (i_str,fmt) i ! converting integer to string i_str using a 'internal file' @@ -2100,15 +2416,15 @@ subroutine write_cosp2_output(Npoints, Ncolumns, Nlevels, Ninst_rttov, lev, lon, status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%rad_total_pc) if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) endif - end do - end if + end do + end if - ! Close file - status = nf90_close(fileID) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - end subroutine write_cosp2_output - + ! Close file + status = nf90_close(fileID) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + end subroutine write_cosp2_output + @@ -2151,8 +2467,10 @@ SUBROUTINE NC_READ_INPUT_FILE(fname,Npnts,Nl,Nhydro,lon,lat,p,ph,z,zh,T,qv,rh,tc mr_lsliq,mr_lsice,mr_ccliq,mr_ccice,fl_lsrain,fl_lssnow, & fl_lsgrpl,fl_ccrain,fl_ccsnow,Reff,dtau_s,dtau_c,dem_s, & dem_c,skt,psfc,landmask,mr_ozone,u_wind,v_wind,sunlit, & - emsfc_lw,mode,Nlon,Nlat,surfelev,year,month,day, & - hour,minute,seconds) + gwvel, gcumf, & ! added by DPLRW + mr_lsrain, mr_lssnow, & ! adjust to prognostic precipitation + emsfc_lw,mode,Nlon,Nlat,surfelev, & + year,month,day,hour,minute,seconds) ! Arguments character(len=512),intent(in) :: fname ! File name @@ -2164,6 +2482,8 @@ SUBROUTINE NC_READ_INPUT_FILE(fname,Npnts,Nl,Nhydro,lon,lat,p,ph,z,zh,T,qv,rh,tc real(wp),dimension(Npnts,Nl,Nhydro),intent(out) :: Reff real(wp),dimension(Npnts),intent(out) :: skt,psfc,landmask,u_wind,v_wind,sunlit,surfelev, & year,month,day,hour,minute,seconds + real(wp),dimension(Npnts,Nl),intent(out) :: gwvel,gcumf ! added by DPLRW + real(wp),dimension(Npnts,Nl),intent(out) :: mr_lsrain,mr_lssnow ! adjust to prognostic precipitation real(wp),intent(out) :: emsfc_lw integer,intent(out) :: mode,Nlon,Nlat @@ -2420,6 +2740,18 @@ SUBROUTINE NC_READ_INPUT_FILE(fname,Npnts,Nl,Nhydro,lon,lat,p,ph,z,zh,T,qv,rh,tc else call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=fl_lssnow) endif + case ('mr_lsrain') + if (Lpoint) then + mr_lsrain(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_lsrain) + endif + case ('mr_lssnow') + if (Lpoint) then + mr_lssnow(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_lssnow) + endif case ('fl_lsgrpl') if (Lpoint) then fl_lsgrpl(1:Npoints,:) = x2(1:Npoints,1:Nlevels) @@ -2483,7 +2815,7 @@ SUBROUTINE NC_READ_INPUT_FILE(fname,Npnts,Nl,Nhydro,lon,lat,p,ph,z,zh,T,qv,rh,tc case ('orography') if (Lpoint) then surfelev(1:Npoints) = x1(1:Npoints) - else + else call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=surfelev) endif case ('landmask') @@ -2516,6 +2848,20 @@ SUBROUTINE NC_READ_INPUT_FILE(fname,Npnts,Nl,Nhydro,lon,lat,p,ph,z,zh,T,qv,rh,tc else call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=sunlit) endif + + case ('gwvel') ! added by DPLRW + if (Lpoint) then + gwvel(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=gwvel) + endif + case ('gcumf') + if (Lpoint) then + gcumf(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=gcumf) + endif + case ('year') if (Lpoint) then year(1:Npoints) = x1(1:Npoints) @@ -2552,6 +2898,7 @@ SUBROUTINE NC_READ_INPUT_FILE(fname,Npnts,Nl,Nhydro,lon,lat,p,ph,z,zh,T,qv,rh,tc else call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=seconds) endif + end select ! Free memory if (vrank == 1) deallocate(x1) diff --git a/driver/src/cosp2_io.f90.bak b/driver/src/cosp2_io.f90.bak new file mode 100644 index 0000000000..2948dc2629 --- /dev/null +++ b/driver/src/cosp2_io.f90.bak @@ -0,0 +1,2762 @@ +module mod_cosp_io + use cosp_kinds, only: wp + use mod_cosp, only: cosp_outputs + use netcdf + USE MOD_COSP_CONFIG, ONLY: Nlvgrid, LIDAR_NCAT, SR_BINS, PARASOL_NREFL, cloudsat_DBZE_BINS, & + numMODISReffIceBins, numMODISReffLiqBins, ntau, tau_binBounds, tau_binCenters, & + tau_binEdges,npres, pres_binBounds, pres_binCenters, pres_binEdges, nhgt, & + hgt_binBounds, hgt_binCenters, hgt_binEdges, vgrid_z, & + reffICE_binCenters, reffLIQ_binCenters, cloudsat_binCenters, PARASOL_SZA, & + calipso_binCenters, grLidar532_binCenters, atlid_binCenters, & + CFODD_NDBZE, CFODD_HISTDBZE, CFODD_HISTDBZEcenters, & + CFODD_NICOD, CFODD_HISTICOD, CFODD_HISTICODcenters + implicit none + +contains + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE write_cosp2_output + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + subroutine write_cosp2_output(Npoints, Ncolumns, Nlevels, Ninst_rttov, lev, lon, lat, cospOUT, outFileName) + integer,intent(in) :: Npoints, Ncolumns, Nlevels, Ninst_rttov + real(wp),dimension(Npoints),intent(in) :: lon,lat + real(wp),dimension(Nlevels),intent(in) :: lev + type(cosp_outputs),intent(in) :: cospOUT + character(len=256),intent(in) :: outFileName + + integer :: fileID,status,ij,i,ii + integer,dimension(50) :: dimID + integer,dimension(250) :: varID + integer,dimension(Npoints) :: loc + integer,dimension(Ncolumns) :: cosp_scol + integer,dimension(2) :: bnds + character(len=8) :: & + fmt, & ! format descriptor for flexible RTTOV output + i_str + + loc=(/(ij,ij=1,Npoints)/) + cosp_scol=(/(ij,ij=1,Ncolumns)/) + bnds=(/(ij,ij=1,2)/) + fmt = '(I3.3)' ! an integer of width 3 with zeros at the left + + ! --------------------------------------------------------------------------------------- + ! Create output file. + ! --------------------------------------------------------------------------------------- + status = nf90_create(path=trim(outFileName),cmode = nf90_clobber,ncid=fileID) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + ! --------------------------------------------------------------------------------------- + ! Define GLOBAL attributes. + ! --------------------------------------------------------------------------------------- + status = nf90_put_att(fileID,NF90_GLOBAL,"Conventions","CF-1.6") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + ! --------------------------------------------------------------------------------------- + ! Define dimensions. + ! --------------------------------------------------------------------------------------- + status = nf90_def_dim(fileID,"loc",Npoints,dimID(1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"cosp_scol",Ncolumns,dimID(2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"lev",Nlevels,dimID(3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"levStat",Nlvgrid,dimID(4)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"tau7",ntau,dimID(5)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"bnds",2,dimID(6)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"pres7",npres,dimID(7)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"hgt16",nhgt,dimID(8)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"SR_BINS",SR_BINS,dimID(12)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"PARASOL_NREFL",PARASOL_NREFL,dimID(13)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"cloudsat_DBZE_BINS",cloudsat_DBZE_BINS,dimID(14)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"RELIQ_MODIS",numMODISReffLiqBins,dimID(15)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"REICE_MODIS",numMODISReffIceBins,dimID(16)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"CFODD_NDBZE",CFODD_NDBZE,dimID(17)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_dim(fileID,"CFODD_NICOD",CFODD_NICOD,dimID(18)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + ! Define instrument channel indices for multiple RTTOV instruments + if (allocated(cospOUT%rttov_outputs)) then + do i=1,Ninst_rttov + write (i_str,fmt) i ! converting integer to string i_str using a 'internal file' + status = nf90_def_dim(fileID,"RTTOV_CHAN_INST"//trim(i_str),cospOUT % rttov_outputs(i) % nchan_out,dimID(20+i)) ! Start at 100 for RTTOV output channel dimensions + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + end do + end if + + ! --------------------------------------------------------------------------------------- + ! Define variables + ! --------------------------------------------------------------------------------------- + ! Longitude + status = nf90_def_var(fileID,"longitude", nf90_float, (/dimID(1)/),varID(1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(1),"long_name","longitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(1),"units", "degrees_east") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(1),"standard_name", "longitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Latitude + status = nf90_def_var(fileID,"latitude", nf90_float, (/dimID(1)/),varID(2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(2),"long_name","latitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(2),"units", "degrees_north") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(2),"standard_name", "latitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Joint-histogram axis + ! Tau + status = nf90_def_var(fileID,"tau7", nf90_float, (/dimID(5)/),varID(3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(3),"long_name","cloud_optical_depth_bin_centers") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(3),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(3),"standard_name", "atmosphere_optical_thickness_due_to_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Tau edges + status = nf90_def_var(fileID,"tau7_bnds", nf90_float, (/dimID(6),dimID(5)/),varID(4)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(4),"long_name","cloud_optical_depth_bin_edges") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(4),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(4),"standard_name", "atmosphere_optical_thickness_due_to_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Pressure + status = nf90_def_var(fileID,"pres7", nf90_float, (/dimID(7)/),varID(5)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(5),"long_name","air_pressure_bin_centers") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(5),"units", "Pa") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(5),"standard_name", "air_pressure") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Pressure Edges + status = nf90_def_var(fileID,"pres7_bnds", nf90_float, (/dimID(6),dimID(7)/),varID(6)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(6),"long_name","air_pressure_bin_edges") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(6),"units", "Pa") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(6),"standard_name", "air_pressure") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Height + status = nf90_def_var(fileID,"hgt16", nf90_float, (/dimID(8)/),varID(7)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(7),"long_name","altitude_bin_centers") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(7),"units", "m") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(7),"standard_name", "altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Height Edges + status = nf90_def_var(fileID,"hgt16_bnds", nf90_float, (/dimID(6),dimID(8)/),varID(8)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(8),"long_name","altitude_bin_edges") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(8),"units", "m") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(8),"standard_name", "altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Levels + status = nf90_def_var(fileID,"lev", nf90_float, (/dimID(3)/),varID(84)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(84),"long_name","level indices") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(84),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Levels for statistical diagnostics (lidar and radar) + status = nf90_def_var(fileID,"levStat", nf90_float, (/dimID(4)/),varID(85)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(85),"long_name","level indices") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(85),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + ! Subcolumms + status = nf90_def_var(fileID,"cosp_scol", nf90_float, (/dimID(2)/),varID(86)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(86),"long_name","subcolumn indices") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(86),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Bnds + status = nf90_def_var(fileID,"bnds", nf90_float, (/dimID(6)/),varID(82)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(82),"long_name","bounds") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(82),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! loc + status = nf90_def_var(fileID,"loc", nf90_float, (/dimID(1)/),varID(83)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(83),"long_name","loc") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(83),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + ! CALIPSO simulator output + if (associated(cospOUT%calipso_betaperp_tot)) then + status = nf90_def_var(fileID,"atb532_perp",nf90_float, (/dimID(1),dimID(2),dimID(3)/),varID(9)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(9),"long_name","CALIPSO Attenuated Total Perpendicular Backscatter (532nm)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(9),"units", "m-1 sr-1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(9),"standard_name", "volume_attenuated_backwards_scattering_function_in_air") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_beta_tot)) then + status = nf90_def_var(fileID,"atb532",nf90_float, (/dimID(1),dimID(2),dimID(3)/),varID(10)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(10),"long_name","CALIPSO Attenuated Total Backscatter (532nm)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(10),"units", "m-1 sr-1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(10),"standard_name", "volume_attenuated_backwards_scattering_function_in_air") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_lidarcldphase)) then + ! Ice + status = nf90_def_var(fileID,"clcalipsoice",nf90_float, (/dimID(1),dimID(4)/),varID(58)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(58),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(58),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(58),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Liquid + status = nf90_def_var(fileID,"clcalipsoliq",nf90_float, (/dimID(1),dimID(4)/),varID(59)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(59),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(59),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(59),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Undefined + status = nf90_def_var(fileID,"clcalipsoun",nf90_float, (/dimID(1),dimID(4)/),varID(60)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(60),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(60),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(60),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cldlayerphase)) then + ! Ice + status = nf90_def_var(fileID,"cllcalipsoice",nf90_float, (/dimID(1)/),varID(61)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(61),"long_name","CALIPSO Ice Low Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(61),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(61),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"clmcalipsoice",nf90_float, (/dimID(1)/),varID(62)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(62),"long_name","CALIPSO Ice Mid Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(62),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(62),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"clhcalipsoice",nf90_float, (/dimID(1)/),varID(63)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(63),"long_name","CALIPSO Ice High Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(63),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(63),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"cltcalipsoice",nf90_float, (/dimID(1)/),varID(64)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(64),"long_name","CALIPSO Ice Total Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(64),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(64),"standard_name", "cloud_area_fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Liquid + status = nf90_def_var(fileID,"cllcalipsoliq",nf90_float, (/dimID(1)/),varID(65)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(65),"long_name","CALIPSO Liquid Low Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(65),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(65),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"clmcalipsoliq",nf90_float, (/dimID(1)/),varID(66)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(66),"long_name","CALIPSO Liquid Mid Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(66),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(66),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"clhcalipsoliq",nf90_float, (/dimID(1)/),varID(67)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(67),"long_name","CALIPSO Liquid High Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(67),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(67),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"cltcalipsoliq",nf90_float, (/dimID(1)/),varID(68)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(68),"long_name","CALIPSO Liquid Total Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(68),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(68),"standard_name", "cloud_area_fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Undetermined + status = nf90_def_var(fileID,"cllcalipsoun",nf90_float, (/dimID(1)/),varID(69)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(69),"long_name","CALIPSO Undefined-Phase Low Level Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(69),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(69),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"clmcalipsoun",nf90_float, (/dimID(1)/),varID(70)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(70),"long_name","CALIPSO Undefined-Phase Mid Level Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(70),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(70),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"clhcalipsoun",nf90_float, (/dimID(1)/),varID(71)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(71),"long_name","CALIPSO Undefined-Phase High Level Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(71),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(71),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"cltcalipsoun",nf90_float, (/dimID(1)/),varID(72)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(72),"long_name","CALIPSO Undefined-Phase Total Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(72),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(72),"standard_name", "cloud_area_fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_lidarcldtmp)) then + status = nf90_def_var(fileID,"clcalipsotmp",nf90_float, (/dimID(1),dimID(4)/),varID(77)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(77),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(77),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(77),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"clcalipsotmpice",nf90_float, (/dimID(1),dimID(4)/),varID(78)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(78),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(78),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(78),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"clcalipsotmpliq",nf90_float, (/dimID(1),dimID(4)/),varID(79)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(79),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(79),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(79),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"clcalipsotmpun",nf90_float, (/dimID(1),dimID(4)/),varID(80)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(80),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(80),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(80),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cfad_sr)) then + status = nf90_def_var(fileID,"cfadLidarsr532",nf90_float, (/dimID(1),dimID(12),dimID(4)/),varID(15)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(15),"long_name","CALIPSO Scattering Ratio CFAD") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(15),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(15),"standard_name", "histogram_of_backscattering_ratio_over_height_above_reference_ellipsoid") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_lidarcld)) then + status = nf90_def_var(fileID,"clcalipso",nf90_float, (/dimID(1),dimID(4)/),varID(16)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(16),"long_name","CALIPSO Cloud Area Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(16),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(16),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cldlayer)) then + ! Low-level + status = nf90_def_var(fileID,"cllcalipso",nf90_float, (/dimID(1)/),varID(73)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(73),"long_name","CALIPSO Low Level Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(73),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(73),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Mid-level + status = nf90_def_var(fileID,"clmcalipso",nf90_float, (/dimID(1)/),varID(74)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(74),"long_name","CALIPSO Mid Level Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(74),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(74),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! High-level + status = nf90_def_var(fileID,"clhcalipso",nf90_float, (/dimID(1)/),varID(75)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(75),"long_name","CALIPSO High Level Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(75),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(75),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Total + status = nf90_def_var(fileID,"cltcalipso",nf90_float, (/dimID(1)/),varID(76)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(76),"long_name","CALIPSO Total Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(76),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(76),"standard_name", "cloud_area_fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_beta_mol)) then + status = nf90_def_var(fileID,"lidarBetaMol532",nf90_float, (/dimID(1),dimID(3)/),varID(18)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(18),"long_name","CALIPSO Molecular Backscatter Coefficient (532nm)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(18),"units", "m-1 sr-1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(18),"standard_name", "volume_attenuated_backwards_scattering_function_in_air_assuming_no_aerosol_or_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_srbval) .or. associated(cospOUT%calipso_cfad_sr)) then + status = nf90_def_var(fileID,"SR_BINS",nf90_float, (/dimID(12)/),varID(81)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(81),"long_name","CALIPSO Backscattering Ratio (SR) Bin Centers") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(81),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(81),"standard_name", "backscattering_ratio") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"SR_EDGES",nf90_float, (/dimID(6),dimID(12)/),varID(19)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(19),"long_name","CALIPSO Backscattering Ratio (SR) Bin Bounds") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(19),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(19),"standard_name", "backscattering_ratio") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + !OPAQ diagnostics + if (associated(cospOUT%calipso_cldtype)) then + ! Opaque cloud cover + status = nf90_def_var(fileID,"clopaquecalipso",nf90_float, (/dimID(1)/),varID(91)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(91),"long_name","CALIPSO Opaque Cloud Cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(91),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(91),"standard_name", "opaque_cloud_cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Thin cloud cover + status = nf90_def_var(fileID,"clthincalipso",nf90_float, (/dimID(1)/),varID(92)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(92),"long_name","CALIPSO Thin Cloud Cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(92),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(92),"standard_name", "thin_cloud_cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! z_opaque altitude + status = nf90_def_var(fileID,"clzopaquecalipso",nf90_float, (/dimID(1)/),varID(93)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(93),"long_name","CALIPSO z_opaque Altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(93),"units", "m") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(93),"standard_name", "z_opaque") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + !3D cloud fractions + if (associated(cospOUT%calipso_lidarcldtype)) then + ! Opaque profiles cloud fraction + status = nf90_def_var(fileID,"clcalipsoopaque",nf90_float, (/dimID(1),dimID(4)/),varID(94)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(94),"long_name","CALIPSO Opaque Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(94),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(94),"standard_name", "opaque_cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Non-Opaque profiles cloud fraction + status = nf90_def_var(fileID,"clcalipsothin",nf90_float, (/dimID(1),dimID(4)/),varID(95)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(95),"long_name","CALIPSO Thin Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(95),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(95),"standard_name", "thin_cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! z_opaque fraction + status = nf90_def_var(fileID,"clcalipsozopaque",nf90_float, (/dimID(1),dimID(4)/),varID(96)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(96),"long_name","CALIPSO z_opaque Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(96),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(96),"standard_name", "z_opaque_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Lidar opacity fraction + status = nf90_def_var(fileID,"clcalipsoopacity",nf90_float, (/dimID(1),dimID(4)/),varID(97)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(97),"long_name","CALIPSO opacity Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(97),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(97),"standard_name", "opacity_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cldtypetemp)) then + ! Opaque cloud temperature + status = nf90_def_var(fileID,"clopaquetemp",nf90_float, (/dimID(1)/),varID(98)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(98),"long_name","CALIPSO Opaque Cloud Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(98),"units", "K") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(98),"standard_name", "opaque_cloud_temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Thin cloud temperature + status = nf90_def_var(fileID,"clthintemp",nf90_float, (/dimID(1)/),varID(99)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(99),"long_name","CALIPSO Thin Cloud Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(99),"units", "K") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(99),"standard_name", "thin_cloud_temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! z_opaque temperature + status = nf90_def_var(fileID,"clzopaquetemp",nf90_float, (/dimID(1)/),varID(100)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(100),"long_name","CALIPSO z_opaque Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(100),"units", "K") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(100),"standard_name", "z_opaque_temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cldtypemeanz)) then + ! Opaque cloud altitude + status = nf90_def_var(fileID,"clopaquemeanz",nf90_float, (/dimID(1)/),varID(101)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(101),"long_name","CALIPSO Opaque Cloud Altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(101),"units", "m") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(101),"standard_name", "opaque_cloud_altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Thin cloud altitude + status = nf90_def_var(fileID,"clthinmeanz",nf90_float, (/dimID(1)/),varID(102)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(102),"long_name","CALIPSO Thin Cloud Altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(102),"units", "m") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(102),"standard_name", "thin_cloud_altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cldthinemis)) then + ! Thin cloud emissivity + status = nf90_def_var(fileID,"clthinemis",nf90_float, (/dimID(1)/),varID(103)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(103),"long_name","CALIPSO Thin Cloud Emissivity") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(103),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(103),"standard_name", "thin_cloud_emissivity") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cldtypemeanzse)) then + ! Opaque cloud altitude with respect to Surface Elevation + status = nf90_def_var(fileID,"clopaquemeanzse",nf90_float, (/dimID(1)/),varID(104)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(104),"long_name","CALIPSO Opaque Cloud Altitude with respect to SE") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(104),"units", "m") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(104),"standard_name", "opaque_cloud_altitude_se") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Thin cloud altitude with respect to Surface Elevation + status = nf90_def_var(fileID,"clthinmeanzse",nf90_float, (/dimID(1)/),varID(105)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(105),"long_name","CALIPSO Thin Cloud Altitude with respect to SE") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(105),"units", "m") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(105),"standard_name", "thin_cloud_altitude_se") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! z_opaque altitude with respect to Surface Elevation + status = nf90_def_var(fileID,"clzopaquecalipsose",nf90_float, (/dimID(1)/),varID(106)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(106),"long_name","CALIPSO z_opaque Altitude with respect to SE") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(106),"units", "m") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(106),"standard_name", "z_opaque_se") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + !GROUND LIDAR simulator output + if (associated(cospOUT%grLidar532_cldlayer)) then + ! Low-level cloud cover + status = nf90_def_var(fileID,"cllgrLidar532",nf90_float, (/dimID(1)/),varID(107)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(107),"long_name","GROUND LIDAR Low Level Cloud Cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(107),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(107),"standard_name", "grLidar532_low_cloud_cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Mid-level cloud cover + status = nf90_def_var(fileID,"clmgrLidar532",nf90_float, (/dimID(1)/),varID(108)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(108),"long_name","GROUND LIDAR Mid Level Cloud Cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(108),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(108),"standard_name", "grLidar532_mid_cloud_cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! High-level cloud cover + status = nf90_def_var(fileID,"clhgrLidar532",nf90_float, (/dimID(1)/),varID(109)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(109),"long_name","GROUND LIDAR High Level Cloud Cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(109),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(109),"standard_name", "grLidar532_high_cloud_cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Total cloud cover + status = nf90_def_var(fileID,"cltgrLidar532",nf90_float, (/dimID(1)/),varID(110)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(110),"long_name","GROUND LIDAR Total Cloud Cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(110),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(110),"standard_name", "grLidar532_total_cloud_cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + !3D cloud fraction + if (associated(cospOUT%grLidar532_lidarcld)) then + status = nf90_def_var(fileID,"clgrLidar532",nf90_float, (/dimID(1),dimID(4)/),varID(111)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(111),"long_name","GROUND LIDAR Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(111),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(111),"standard_name", "grLidar532_cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + !Molecular backscatter + if (associated(cospOUT%grLidar532_beta_mol)) then + status = nf90_def_var(fileID,"lidarBetaMol532gr",nf90_float, (/dimID(1),dimID(3)/),varID(112)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(112),"long_name","GROUND LIDAR Molecular Backscatter Coefficient (532nm)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(112),"units", "m-1 sr-1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(112),"standard_name", "grLidar532_volume_attenuated_backwards_scattering_function_in_air_assuming_no_aerosol_or_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + !Height-Intensity histogram (SR) + if (associated(cospOUT%grLidar532_cfad_sr)) then + status = nf90_def_var(fileID,"cfadLidarsr532gr",nf90_float, (/dimID(1),dimID(12),dimID(4)/),varID(113)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(113),"long_name","GROUND LIDAR Scattering Ratio CFAD") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(113),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(113),"standard_name", "grLidar532_histogram_of_backscattering_ratio_over_height_above_reference_ellipsoid") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%grLidar532_beta_tot)) then + status = nf90_def_var(fileID,"atb532gr",nf90_float, (/dimID(1),dimID(2),dimID(3)/),varID(114)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(114),"long_name","GROUND LIDAR Attenuated Total Backscatter (532nm)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(114),"units", "m-1 sr-1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(114),"standard_name", "volume_attenuated_backwards_scattering_function_in_air") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + if (associated(cospOUT%grLidar532_srbval) .or. associated(cospOUT%grLidar532_cfad_sr)) then + status = nf90_def_var(fileID,"SR_BINS_GR",nf90_float, (/dimID(12)/),varID(115)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(115),"long_name","GROUND LIDAR Backscattering Ratio (SR) Bin Centers") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(115),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(115),"standard_name", "backscattering_ratio") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"SR_EDGES_GR",nf90_float, (/dimID(6),dimID(12)/),varID(116)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(116),"long_name","GROUND LIDAR Backscattering Ratio (SR) Bin Bounds") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(116),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(116),"standard_name", "backscattering_ratio") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + !ATLID simulator output + if (associated(cospOUT%atlid_cldlayer)) then + ! Low-level cloud cover + status = nf90_def_var(fileID,"cllatlid",nf90_float, (/dimID(1)/),varID(117)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(117),"long_name","ATLID Low Level Cloud Cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(117),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(117),"standard_name", "atlid_low_cloud_cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Mid-level cloud cover + status = nf90_def_var(fileID,"clmatlid",nf90_float, (/dimID(1)/),varID(118)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(118),"long_name","ATLID Mid Level Cloud Cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(118),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(118),"standard_name", "atlid_mid_cloud_cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! High-level cloud cover + status = nf90_def_var(fileID,"clhatlid",nf90_float, (/dimID(1)/),varID(119)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(119),"long_name","ATLID High Level Cloud Cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(119),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(119),"standard_name", "atlid_high_cloud_cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Total cloud cover + status = nf90_def_var(fileID,"cltatlid",nf90_float, (/dimID(1)/),varID(120)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(120),"long_name","ATLID Total Cloud Cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(120),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(120),"standard_name", "atlid_total_cloud_cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + !3D cloud fraction + if (associated(cospOUT%atlid_lidarcld)) then + status = nf90_def_var(fileID,"clatlid",nf90_float, (/dimID(1),dimID(4)/),varID(121)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(121),"long_name","ATLID Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(121),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(121),"standard_name", "atlid_cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + !Molecular backscatter + if (associated(cospOUT%atlid_beta_mol)) then + status = nf90_def_var(fileID,"lidarBetaMol355",nf90_float, (/dimID(1),dimID(3)/),varID(122)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(122),"long_name","ATLID Molecular Backscatter Coefficient (355nm)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(122),"units", "m-1 sr-1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(122),"standard_name", "atlid_volume_attenuated_backwards_scattering_function_in_air_assuming_no_aerosol_or_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + !Height-Intensity histogram (SR) + if (associated(cospOUT%atlid_cfad_sr)) then + status = nf90_def_var(fileID,"cfadLidarsr355",nf90_float, (/dimID(1),dimID(12),dimID(4)/),varID(123)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(123),"long_name","ATLID Scattering Ratio CFAD") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(123),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(123),"standard_name", "atlid_histogram_of_backscattering_ratio_over_height_above_reference_ellipsoid") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%atlid_beta_tot)) then + status = nf90_def_var(fileID,"atb355",nf90_float, (/dimID(1),dimID(2),dimID(3)/),varID(124)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(124),"long_name","ATLID Attenuated Total Backscatter (355nm)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(124),"units", "m-1 sr-1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(124),"standard_name", "volume_attenuated_backwards_scattering_function_in_air") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + if (associated(cospOUT%atlid_srbval) .or. associated(cospOUT%atlid_cfad_sr)) then + status = nf90_def_var(fileID,"SR_BINS_ATLID",nf90_float, (/dimID(12)/),varID(125)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(125),"long_name","ATLID Backscattering Ratio (SR) Bin Centers") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(125),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(125),"standard_name", "backscattering_ratio") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"SR_EDGES_ATLID",nf90_float, (/dimID(6),dimID(12)/),varID(126)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(126),"long_name","ATLID Backscattering Ratio (SR) Bin Bounds") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(126),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(126),"standard_name", "backscattering_ratio") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! PARASOL simulator output + if (associated(cospOUT%parasolPix_refl)) then + status = nf90_def_var(fileID,"parasolPix_refl",nf90_float, (/dimID(1),dimID(2),dimID(13)/),varID(20)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(20),"long_name","PARASOL Subcolumn Reflectance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(20),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(20),"standard_name", "toa_bidirectional_reflectance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%parasolGrid_refl)) then + status = nf90_def_var(fileID,"parasolGrid_refl",nf90_float, (/dimID(1),dimID(13)/),varID(21)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(21),"long_name","PARASOL Reflectance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(21),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(21),"standard_name", "toa_bidirectional_reflectance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%parasolPix_refl) .or.associated(cospOUT%parasolGrid_refl)) then + status = nf90_def_var(fileID,"PARASOL_NREFL",nf90_float, (/dimID(13)/),varID(87)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(87),"long_name","PARASOL Solar Zenith Angle") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(87),"units", "degree") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(87),"standard_name", "solar_zenith_angle") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! Cloudsat simulator output + if (associated(cospOUT%cloudsat_Ze_tot)) then + status = nf90_def_var(fileID,"dbze94",nf90_float, (/dimID(1),dimID(2),dimID(3)/),varID(22)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(22),"long_name","CloudSat Radar Reflectivity") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(22),"units", "dBZ") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(22),"standard_name", "equivalent_reflectivity_factor") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%cloudsat_cfad_ze)) then + status = nf90_def_var(fileID,"cfadDbze94",nf90_float, (/dimID(1),dimID(14),dimID(4)/),varID(23)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(23),"long_name","CloudSat Radar reflectivity CFAD") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(23),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(23),"standard_name", "histogram_of_equivalent_reflectivity_factor_over_height_above_reference_ellipsoid") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"cloudsat_DBZE_BINS",nf90_float, (/dimID(14)/),varID(88)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(88),"long_name","CloudSat simulator equivalent radar reflectivity factor") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(88),"units", "dBZ") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(88),"standard_name", "equivalent_reflectivity_factor") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%cloudsat_precip_cover)) then + status = nf90_def_var(fileID,"ptcloudsatflag0",nf90_float, (/dimID(1)/),varID(127)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(127),"long_name","Cloudsat precipitation cover for flag0") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(127),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"ptcloudsatflag1",nf90_float, (/dimID(1)/),varID(128)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(128),"long_name","Cloudsat precipitation cover for flag1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(128),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"ptcloudsatflag2",nf90_float, (/dimID(1)/),varID(129)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(129),"long_name","Cloudsat precipitation cover for flag2") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(129),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"ptcloudsatflag3",nf90_float, (/dimID(1)/),varID(130)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(130),"long_name","Cloudsat precipitation cover for flag3") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(130),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"ptcloudsatflag4",nf90_float, (/dimID(1)/),varID(131)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(131),"long_name","Cloudsat precipitation cover for flag4") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(131),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"ptcloudsatflag5",nf90_float, (/dimID(1)/),varID(132)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(132),"long_name","Cloudsat precipitation cover for flag5") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(132),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"ptcloudsatflag6",nf90_float, (/dimID(1)/),varID(133)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(133),"long_name","Cloudsat precipitation cover for flag6") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(133),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"ptcloudsatflag7",nf90_float, (/dimID(1)/),varID(134)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(134),"long_name","Cloudsat precipitation cover for flag7") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(134),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"ptcloudsatflag8",nf90_float, (/dimID(1)/),varID(135)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(135),"long_name","Cloudsat precipitation cover for flag8") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(135),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"ptcloudsatflag9",nf90_float, (/dimID(1)/),varID(136)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(136),"long_name","Cloudsat precipitation cover for flag9") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(136),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%cloudsat_pia)) then + status = nf90_def_var(fileID,"cloudsatpia",nf90_float, (/dimID(1)/),varID(137)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(137),"long_name","Cloudsat path integrated attenuation") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(137),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! ISCCP simulator outputs + if (associated(cospOUT%isccp_totalcldarea)) then + status = nf90_def_var(fileID,"cltisccp",nf90_float, (/dimID(1)/),varID(24)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(24),"long_name","ISCCP Total Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(24),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(24),"standard_name", "cloud_area_fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_meantb)) then + status = nf90_def_var(fileID,"meantbisccp",nf90_float, (/dimID(1)/),varID(25)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(25),"long_name","ISCCP all-sky 10.5 micron brightness temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(25),"units", "K") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(25),"standard_name", "toa_brightness_temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_meantbclr)) then + status = nf90_def_var(fileID,"meantbclrisccp",nf90_float, (/dimID(1)/),varID(26)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(26),"long_name","ISCCP clear-sky 10.5 micron brightness temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(26),"units", "K") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(26),"standard_name", "toa_brightness_temperature_assuming_clear_sky") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_meanptop)) then + status = nf90_def_var(fileID,"pctisccp",nf90_float, (/dimID(1)/),varID(27)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(27),"long_name","ISCCP Mean Cloud Top Pressure") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(27),"units", "hPa") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(27),"standard_name", "air_pressure_at_cloud_top") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_meantaucld)) then + status = nf90_def_var(fileID,"tauisccp",nf90_float, (/dimID(1)/),varID(28)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(28),"long_name","ISCCP Mean Optical Depth") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(28),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(28),"standard_name", "atmosphere_optical_thickness_due_to_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_meanalbedocld)) then + status = nf90_def_var(fileID,"albisccp",nf90_float, (/dimID(1)/),varID(29)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(29),"long_name","ISCCP Mean Cloud Albedo") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(29),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(29),"standard_name", "cloud_albedo") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_boxtau)) then + status = nf90_def_var(fileID,"boxtauisccp",nf90_float, (/dimID(1),dimID(2)/),varID(30)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(30),"long_name","ISCCP Subcolumn Optical Depth") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(30),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(30),"standard_name", "atmosphere_optical_thickness_due_to_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_boxptop)) then + status = nf90_def_var(fileID,"boxptopisccp",nf90_float, (/dimID(1),dimID(2)/),varID(31)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(31),"long_name","ISCCP Subcolumn Cloud Top Pressure") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(31),"units", "Pa") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(31),"standard_name", "air_pressure_at_cloud_top") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_fq)) then + status = nf90_def_var(fileID,"clisccp",nf90_float, (/dimID(1),dimID(5),dimID(7)/),varID(32)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(32),"long_name","ISCCP joint-PDF of cloud top pressure and optical depth") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(32),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(32),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! MISR simulator output + if (associated(cospOUT%misr_fq)) then + status = nf90_def_var(fileID,"clMISR",nf90_float, (/dimID(1),dimID(5),dimID(8)/),varID(33)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(33),"long_name","MISR joint-PDF of cloud top pressure and optical depth") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(33),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(33),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%misr_meanztop)) then + status = nf90_def_var(fileID,"misr_meanztop",nf90_float, (/dimID(1)/),varID(34)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(34),"long_name","MISR Mean Cloud Top Height") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(34),"units", "m") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(34),"standard_name", "cloud_top_altitude") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%misr_cldarea)) then + status = nf90_def_var(fileID,"misr_cldarea",nf90_float, (/dimID(1)/),varID(35)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(35),"long_name","MISR cloud cover") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(35),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(35),"standard_name", "cloud_area_fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! MODIS simulator output + if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) then + status = nf90_def_var(fileID,"cltmodis",nf90_float, (/dimID(1)/),varID(36)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(36),"long_name","MODIS Total Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(36),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(36),"standard_name", "cloud_area_fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) then + status = nf90_def_var(fileID,"clwmodis",nf90_float, (/dimID(1)/),varID(37)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(37),"long_name","MODIS Liquid Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(37),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(37),"standard_name", "cloud_area_fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) then + status = nf90_def_var(fileID,"climodis",nf90_float, (/dimID(1)/),varID(38)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(38),"long_name","MODIS Ice Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(38),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(38),"standard_name", "cloud_area_fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) then + status = nf90_def_var(fileID,"clhmodis",nf90_float, (/dimID(1)/),varID(39)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(39),"long_name","MODIS High Level Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(39),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(39),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) then + status = nf90_def_var(fileID,"clmmodis",nf90_float, (/dimID(1)/),varID(40)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(40),"long_name","MODIS Mid Level Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(40),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(40),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) then + status = nf90_def_var(fileID,"cllmodis",nf90_float, (/dimID(1)/),varID(41)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(41),"long_name","MODIS Low Level Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(41),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(41),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) then + status = nf90_def_var(fileID,"tautmodis",nf90_float, (/dimID(1)/),varID(42)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(42),"long_name","MODIS Total Cloud Optical Thickness") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(42),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(42),"standard_name", "atmosphere_optical_thickness_due_to_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) then + status = nf90_def_var(fileID,"tauwmodis",nf90_float, (/dimID(1)/),varID(43)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(43),"long_name","MODIS Liquid Cloud Optical Thickness") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(43),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(43),"standard_name", "atmosphere_optical_thickness_due_to_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) then + status = nf90_def_var(fileID,"tauimodis",nf90_float, (/dimID(1)/),varID(44)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(44),"long_name","MODIS Ice Cloud Optical Thickness") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(44),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(44),"standard_name", "atmosphere_optical_thickness_due_to_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_Total_logMean)) then + status = nf90_def_var(fileID,"tautlogmodis",nf90_float, (/dimID(1)/),varID(45)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(45),"long_name","MODIS Total Cloud Optical Thickness (Log10 Mean)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(45),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(45),"standard_name", "atmosphere_optical_thickness_due_to_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_Water_logMean)) then + status = nf90_def_var(fileID,"tauwlogmodis",nf90_float, (/dimID(1)/),varID(46)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(46),"long_name","MODIS Liquid Cloud Optical Thickness (Log10 Mean)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(46),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(46),"standard_name", "atmosphere_optical_thickness_due_to_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_Ice_logMean)) then + status = nf90_def_var(fileID,"tauilogmodis",nf90_float, (/dimID(1)/),varID(47)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(47),"long_name","MODIS Ice Cloud Optical Thickness (Log10 Mean)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(47),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(47),"standard_name", "atmosphere_optical_thickness_due_to_cloud") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) then + status = nf90_def_var(fileID,"reffclwmodis",nf90_float, (/dimID(1)/),varID(48)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(48),"long_name","MODIS Liquid Cloud Particle Size") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(48),"units", "m") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(48),"standard_name", "effective_radius_of_cloud_liquid_water_particle") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) then + status = nf90_def_var(fileID,"reffclimodis",nf90_float, (/dimID(1)/),varID(49)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(49),"long_name","MODIS Ice Cloud Particle Size") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(49),"units", "m") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(49),"standard_name", "effective_radius_of_cloud_liquid_water_particle") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) then + status = nf90_def_var(fileID,"pctmodis",nf90_float, (/dimID(1)/),varID(50)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(50),"long_name","MODIS Cloud Top Pressure") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(50),"units", "hPa") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(50),"standard_name", "air_pressure_at_cloud_top") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) then + status = nf90_def_var(fileID,"lwpmodis",nf90_float, (/dimID(1)/),varID(51)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(51),"long_name","MODIS Cloud Liquid Water Path") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(51),"units", "kg m-2") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(51),"standard_name", "atmosphere_cloud_liquid_water_content") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Ice_Water_Path_Mean)) then + status = nf90_def_var(fileID,"iwpmodis",nf90_float, (/dimID(1)/),varID(52)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(52),"long_name","MODIS Cloud Ice Water Path") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(52),"units", "kg m-2") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(52),"standard_name", "atmosphere_mass_content_of_cloud_ice") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) then + status = nf90_def_var(fileID,"clmodis",nf90_float, (/dimID(1),dimID(5),dimID(7)/),varID(53)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(53),"long_name","MODIS joint-PDF of cloud top pressure and optical depth") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(53),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(53),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) then + status = nf90_def_var(fileID,"clmodis_liq",nf90_float, (/dimID(1),dimID(5),dimID(7)/),varID(148)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(148),"long_name","MODIS joint-PDF of liquid cloud top pressure and optical depth") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(148),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(148),"standard_name", "cloud_area_fraction_in_atmosphere_layer_liq") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) then + status = nf90_def_var(fileID,"clmodis_ice",nf90_float, (/dimID(1),dimID(5),dimID(7)/),varID(149)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(149),"long_name","MODIS joint-PDF of ice cloud top pressure and optical depth") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(149),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(149),"standard_name", "cloud_area_fraction_in_atmosphere_layer_ice") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) then + status = nf90_def_var(fileID,"modis_Optical_Thickness_vs_ReffICE",nf90_float, (/dimID(1),dimID(5),dimID(16)/),varID(54)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(54),"long_name","MODIS Joint-PDF of optical-depth and ice particle size") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(54),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"REICE_MODIS",nf90_float, (/dimID(16)/),varID(89)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(89),"long_name","MODIS Joint-PDF ice particle size bin centers") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(89),"units", "meters") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) then + status = nf90_def_var(fileID,"modis_Optical_Thickness_vs_ReffLIQ",nf90_float, (/dimID(1),dimID(5),dimID(15)/),varID(55)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(55),"long_name","MODIS Joint-PDF of optical-depth and liquid particle size") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(55),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"RELIQ_MODIS",nf90_float, (/dimID(15)/),varID(90)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(90),"long_name","MODIS Joint-PDF liquid particle size bin centers") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(90),"units", "meters") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! Joint simulator products. + if (associated(cospOUT%lidar_only_freq_cloud)) then + status = nf90_def_var(fileID,"clcalipso2",nf90_float, (/dimID(1),dimID(4)/),varID(56)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(56),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(56),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(56),"standard_name", "cloud_area_fraction_in_atmosphere_layer") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%radar_lidar_tcc)) then + status = nf90_def_var(fileID,"cltlidarradar",nf90_float, (/dimID(1)/),varID(57)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(57),"long_name","CALIPSO and CloudSat Total Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(57),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(57),"standard_name", "cloud_area_fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%cloudsat_tcc)) then + status = nf90_def_var(fileID,"cloudsat_tcc",nf90_float, (/dimID(1)/),varID(138)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(138),"long_name","CloudSat Total Cloud Fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(138),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(138),"standard_name", "cloud_area_fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%cloudsat_tcc2)) then + status = nf90_def_var(fileID,"cloudsat_tcc2",nf90_float, (/dimID(1)/),varID(139)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(139),"long_name","CloudSat Total Cloud Fraction (no 1km)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(139),"units", "%") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(139),"standard_name", "cloud_area_fraction") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + ! warm-rain occurrence frequency diagnostics + if (associated(cospOUT%wr_occfreq_ntotal)) then + status = nf90_def_var(fileID,"npdfcld",nf90_float, (/dimID(1)/),varID(140)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(140),"long_name","# of Non-Precipitating Clouds") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(140),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(140),"standard_name", "number_of_slwc_nonprecip") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"npdfdrz",nf90_float, (/dimID(1)/),varID(141)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(141),"long_name","# of Drizzling Clouds") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(141),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(141),"standard_name", "number_of_slwc_drizzle") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"npdfrain",nf90_float, (/dimID(1)/),varID(142)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(142),"long_name","# of Precipitating Clouds") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(142),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(142),"standard_name", "number_of_slwc_precip") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + ! Contoured Frequency by Optical Depth Diagram (CFODD) + if (associated(cospOUT%cfodd_ntotal)) then + status = nf90_def_var(fileID,"ncfodd1",nf90_float, (/dimID(1),dimID(17),dimID(18)/),varID(143)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(143),"long_name","# of CFODD (05 < Reff < 12 micron)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(143),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(143),"standard_name", "cfodd_reff_small") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"ncfodd2",nf90_float, (/dimID(1),dimID(17),dimID(18)/),varID(144)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(144),"long_name","# of CFODD (12 < Reff < 18 micron)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(144),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(144),"standard_name", "cfodd_reff_medium") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"ncfodd3",nf90_float, (/dimID(1),dimID(17),dimID(18)/),varID(145)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(145),"long_name","# of CFODD (18 < Reff < 35 micron)") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(145),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(145),"standard_name", "cfodd_reff_large") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + !! axes for CFODD + status = nf90_def_var(fileID,"CFODD_NDBZE",nf90_float,(/dimID(17)/),varID(146)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(146),"long_name","CloudSat+MODIS dBZe vs ICOD joint PDF X-axis") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(146),"units", "dBZ") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(146),"standard_name", "cloudsat_quivalent_reflectivity_factor") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_def_var(fileID,"CFODD_NICOD",nf90_float,(/dimID(18)/),varID(147)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(147),"long_name","CloudSat+MODIS dBZe vs ICOD joint PDF Y-axis") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(147),"units", "none") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(147),"standard_name", "modis_in-cloud_optical_depth") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + + ! --------------------------------------------------------------------------------------- + ! RTTOV - JKS + ! --------------------------------------------------------------------------------------- + + ! Define instrument channel indices for multiple RTTOV instruments + ii = 165 ! RTTOV variable indices start at 165 + if (allocated(cospOUT%rttov_outputs)) then + do i=1,Ninst_rttov + write (i_str,fmt) i ! converting integer to string i_str using a 'internal file' + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) then + ii = ii + 1 + status = nf90_def_var(fileID,"RTTOV_CHAN_INST"//trim(i_str),nf90_float, (/dimID(20+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Channel Indices") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "1") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_ichan") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%bt_total)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_bt_total_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV All-sky Brightness Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "Degrees Kelvin") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_allsky_bt") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_bt_clear_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Clear-sky Brightness Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "Degrees Kelvin") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_clearsky_bt") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%rad_total)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_rad_total_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV All-sky Radiance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_allsky_rad") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_rad_clear_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Clear-sky Radiance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_clearsky_rad") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_rad_cloudy_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Cloudy-sky Radiance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_cloudysky_rad") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%refl_total)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_refl_total_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV All-sky Reflectance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "unitless") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "bleh") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_refl_clear_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Clear-sky Reflectance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "unitless") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_allsky_refl") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_bt_clear_pc_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","PC-RTTOV Clear-sky Brightness Temperature") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "Degrees Kelvin") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "pcrttov_clearsky_bt") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) then + ii = ii + 1 + status = nf90_def_var(fileID,"rttov_rad_clear_pc_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"long_name","PC-RTTOV Clear-sky Radiance") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_att(fileID,varID(ii),"standard_name", "pcrttov_clearsky_rad") + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + end do + end if + + ! --------------------------------------------------------------------------------------- + ! Exit define mode + ! --------------------------------------------------------------------------------------- + status = nf90_enddef(fileID) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + ! --------------------------------------------------------------------------------------- + ! Populate outputs + ! --------------------------------------------------------------------------------------- + ! Geo + status = nf90_put_var(fileID,varID(1),lon) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(2),lat) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Joint-histogram axis variables + status = nf90_put_var(fileID,varID(3),tau_binCenters) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(4),tau_binEdges) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(5),pres_binCenters) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(6),pres_binEdges) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(7),hgt_binCenters) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(8),hgt_binEdges) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(84),lev) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(85),vgrid_z) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(86),cosp_scol) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(82),bnds) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(83),loc) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + ! CALIPSO simulator output + if (associated(cospOUT%calipso_betaperp_tot)) then + status = nf90_put_var(fileID,varID(9),cospOUT%calipso_betaperp_tot) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_beta_tot)) then + status = nf90_put_var(fileID,varID(10),cospOUT%calipso_beta_tot) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_lidarcldphase)) then + status = nf90_put_var(fileID,varID(58),cospOUT%calipso_lidarcldphase(:,:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(59),cospOUT%calipso_lidarcldphase(:,:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(60),cospOUT%calipso_lidarcldphase(:,:,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cldlayerphase)) then + ! Ice + status = nf90_put_var(fileID,varID(61),cospOUT%calipso_cldlayerphase(:,1,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(62),cospOUT%calipso_cldlayerphase(:,2,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(63),cospOUT%calipso_cldlayerphase(:,3,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(64),cospOUT%calipso_cldlayerphase(:,4,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Liquid + status = nf90_put_var(fileID,varID(65),cospOUT%calipso_cldlayerphase(:,1,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(66),cospOUT%calipso_cldlayerphase(:,2,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(67),cospOUT%calipso_cldlayerphase(:,3,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(68),cospOUT%calipso_cldlayerphase(:,4,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + ! Undetermined + status = nf90_put_var(fileID,varID(69),cospOUT%calipso_cldlayerphase(:,1,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(70),cospOUT%calipso_cldlayerphase(:,2,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(71),cospOUT%calipso_cldlayerphase(:,3,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(72),cospOUT%calipso_cldlayerphase(:,4,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_lidarcldtmp)) then + status = nf90_put_var(fileID,varID(77),cospOUT%calipso_lidarcldtmp(:,:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(78),cospOUT%calipso_lidarcldtmp(:,:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(79),cospOUT%calipso_lidarcldtmp(:,:,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(80),cospOUT%calipso_lidarcldtmp(:,:,4)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cfad_sr)) then + status = nf90_put_var(fileID,varID(15),cospOUT%calipso_cfad_sr) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_lidarcld)) then + status = nf90_put_var(fileID,varID(16),cospOUT%calipso_lidarcld) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cldlayer)) then + status = nf90_put_var(fileID,varID(73),cospOUT%calipso_cldlayer(:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(74),cospOUT%calipso_cldlayer(:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(75),cospOUT%calipso_cldlayer(:,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(76),cospOUT%calipso_cldlayer(:,4)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_beta_mol)) then + status = nf90_put_var(fileID,varID(18),cospOUT%calipso_beta_mol) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_srbval)) then + status = nf90_put_var(fileID,varID(19),reshape([cospOUT%calipso_srbval(1:SR_BINS),cospOUT%calipso_srbval(2:SR_BINS+1)],(/2,SR_BINS/))) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_srbval) .or. associated(cospOUT%calipso_cfad_sr)) then + status = nf90_put_var(fileID,varID(81),calipso_binCenters) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + !OPAQ diagnostics + if (associated(cospOUT%calipso_cldtype)) then + status = nf90_put_var(fileID,varID(91),cospOUT%calipso_cldtype(:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(92),cospOUT%calipso_cldtype(:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(93),cospOUT%calipso_cldtype(:,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_lidarcldtype)) then + status = nf90_put_var(fileID,varID(94),cospOUT%calipso_lidarcldtype(:,:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(95),cospOUT%calipso_lidarcldtype(:,:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(96),cospOUT%calipso_lidarcldtype(:,:,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(97),cospOUT%calipso_lidarcldtype(:,:,4)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cldtypetemp)) then + status = nf90_put_var(fileID,varID(98),cospOUT%calipso_cldtypetemp(:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(99),cospOUT%calipso_cldtypetemp(:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(100),cospOUT%calipso_cldtypetemp(:,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cldtypemeanz)) then + status = nf90_put_var(fileID,varID(101),cospOUT%calipso_cldtypemeanz(:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(102),cospOUT%calipso_cldtypemeanz(:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cldthinemis)) then + status = nf90_put_var(fileID,varID(103),cospOUT%calipso_cldthinemis) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%calipso_cldtypemeanzse)) then + status = nf90_put_var(fileID,varID(104),cospOUT%calipso_cldtypemeanzse(:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(105),cospOUT%calipso_cldtypemeanzse(:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(106),cospOUT%calipso_cldtypemeanzse(:,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! GROUND LIDAR simulator output + if (associated(cospOUT%grLidar532_cldlayer)) then + status = nf90_put_var(fileID,varID(107),cospOUT%grLidar532_cldlayer(:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(108),cospOUT%grLidar532_cldlayer(:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(109),cospOUT%grLidar532_cldlayer(:,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(110),cospOUT%grLidar532_cldlayer(:,4)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%grLidar532_lidarcld)) then + status = nf90_put_var(fileID,varID(111),cospOUT%grLidar532_lidarcld) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%grLidar532_beta_mol)) then + status = nf90_put_var(fileID,varID(112),cospOUT%grLidar532_beta_mol) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%grLidar532_cfad_sr)) then + status = nf90_put_var(fileID,varID(113),cospOUT%grLidar532_cfad_sr) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%grLidar532_beta_tot)) then + status = nf90_put_var(fileID,varID(114),cospOUT%grLidar532_beta_tot) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + if (associated(cospOUT%grLidar532_srbval)) then + status = nf90_put_var(fileID,varID(116),reshape([cospOUT%grLidar532_srbval(1:SR_BINS),cospOUT%grLidar532_srbval(2:SR_BINS+1)],(/2,SR_BINS/))) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%grLidar532_srbval) .or. associated(cospOUT%grLidar532_cfad_sr)) then + status = nf90_put_var(fileID,varID(115),grLidar532_binCenters) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! ATLID simulator output + if (associated(cospOUT%atlid_cldlayer)) then + status = nf90_put_var(fileID,varID(117),cospOUT%atlid_cldlayer(:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(118),cospOUT%atlid_cldlayer(:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(119),cospOUT%atlid_cldlayer(:,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(120),cospOUT%atlid_cldlayer(:,4)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%atlid_lidarcld)) then + status = nf90_put_var(fileID,varID(121),cospOUT%atlid_lidarcld) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%atlid_beta_mol)) then + status = nf90_put_var(fileID,varID(122),cospOUT%atlid_beta_mol) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%atlid_cfad_sr)) then + status = nf90_put_var(fileID,varID(123),cospOUT%atlid_cfad_sr) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%atlid_beta_tot)) then + status = nf90_put_var(fileID,varID(124),cospOUT%atlid_beta_tot) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + if (associated(cospOUT%atlid_srbval)) then + status = nf90_put_var(fileID,varID(126),reshape([cospOUT%atlid_srbval(1:SR_BINS),cospOUT%atlid_srbval(2:SR_BINS+1)],(/2,SR_BINS/))) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%atlid_srbval) .or. associated(cospOUT%atlid_cfad_sr)) then + status = nf90_put_var(fileID,varID(125),atlid_binCenters) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! PARASOL simulator output + if (associated(cospOUT%parasolPix_refl)) then + status = nf90_put_var(fileID,varID(20),cospOUT%parasolPix_refl) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%parasolGrid_refl)) then + status = nf90_put_var(fileID,varID(21),cospOUT%parasolGrid_refl) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%parasolPix_refl) .or.associated(cospOUT%parasolGrid_refl)) then + status = nf90_put_var(fileID,varID(87),PARASOL_SZA) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! Cloudsat simulator output + if (associated(cospOUT%cloudsat_Ze_tot)) then + status = nf90_put_var(fileID,varID(22),cospOUT%cloudsat_Ze_tot) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%cloudsat_cfad_ze)) then + status = nf90_put_var(fileID,varID(23),cospOUT%cloudsat_cfad_ze) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(88),cloudsat_binCenters) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%cloudsat_precip_cover)) then + status = nf90_put_var(fileID,varID(127),cospOUT%cloudsat_precip_cover(:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(128),cospOUT%cloudsat_precip_cover(:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(129),cospOUT%cloudsat_precip_cover(:,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(130),cospOUT%cloudsat_precip_cover(:,4)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(131),cospOUT%cloudsat_precip_cover(:,5)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(132),cospOUT%cloudsat_precip_cover(:,6)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(133),cospOUT%cloudsat_precip_cover(:,7)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(134),cospOUT%cloudsat_precip_cover(:,8)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(135),cospOUT%cloudsat_precip_cover(:,9)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(136),cospOUT%cloudsat_precip_cover(:,10)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%cloudsat_pia)) then + status = nf90_put_var(fileID,varID(137),cospOUT%cloudsat_pia) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + if (associated(cospOUT%isccp_totalcldarea)) then + status = nf90_put_var(fileID,varID(24),cospOUT%isccp_totalcldarea) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_meantb)) then + status = nf90_put_var(fileID,varID(25),cospOUT%isccp_meantb) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_meantbclr)) then + status = nf90_put_var(fileID,varID(26),cospOUT%isccp_meantbclr) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_meanptop)) then + status = nf90_put_var(fileID,varID(27),cospOUT%isccp_meanptop) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_meantaucld)) then + status = nf90_put_var(fileID,varID(28),cospOUT%isccp_meantaucld) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_meanalbedocld)) then + status = nf90_put_var(fileID,varID(29),cospOUT%isccp_meanalbedocld) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_boxtau)) then + status = nf90_put_var(fileID,varID(30),cospOUT%isccp_boxtau) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_boxptop)) then + status = nf90_put_var(fileID,varID(31),cospOUT%isccp_boxptop) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%isccp_fq)) then + status = nf90_put_var(fileID,varID(32),cospOUT%isccp_fq) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + ! MISR simulator output + if (associated(cospOUT%misr_fq)) then + status = nf90_put_var(fileID,varID(33),cospOUT%misr_fq) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%misr_meanztop)) then + status = nf90_put_var(fileID,varID(34),cospOUT%misr_meanztop) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%misr_cldarea)) then + status = nf90_put_var(fileID,varID(35),cospOUT%misr_cldarea) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + ! MODIS simulator output + if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) then + status = nf90_put_var(fileID,varID(36),cospOUT%modis_Cloud_Fraction_Total_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) then + status = nf90_put_var(fileID,varID(37),cospOUT%modis_Cloud_Fraction_Water_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) then + status = nf90_put_var(fileID,varID(38),cospOUT%modis_Cloud_Fraction_Ice_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) then + status = nf90_put_var(fileID,varID(39),cospOUT%modis_Cloud_Fraction_High_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) then + status = nf90_put_var(fileID,varID(40),cospOUT%modis_Cloud_Fraction_Mid_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) then + status = nf90_put_var(fileID,varID(41),cospOUT%modis_Cloud_Fraction_Low_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) then + status = nf90_put_var(fileID,varID(42),cospOUT%modis_Optical_Thickness_Total_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) then + status = nf90_put_var(fileID,varID(43),cospOUT%modis_Optical_Thickness_Water_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) then + status = nf90_put_var(fileID,varID(44),cospOUT%modis_Optical_Thickness_Ice_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) then + status = nf90_put_var(fileID,varID(45),cospOUT%modis_Optical_Thickness_Total_LogMean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) then + status = nf90_put_var(fileID,varID(46),cospOUT%modis_Optical_Thickness_Water_LogMean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) then + status = nf90_put_var(fileID,varID(47),cospOUT%modis_Optical_Thickness_Ice_LogMean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) then + status = nf90_put_var(fileID,varID(48),cospOUT%modis_Cloud_Particle_Size_Water_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) then + status = nf90_put_var(fileID,varID(49),cospOUT%modis_Cloud_Particle_Size_Ice_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) then + status = nf90_put_var(fileID,varID(50),cospOUT%modis_Cloud_Top_Pressure_Total_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) then + status = nf90_put_var(fileID,varID(51),cospOUT%modis_Liquid_Water_Path_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Ice_Water_Path_Mean)) then + status = nf90_put_var(fileID,varID(52),cospOUT%modis_Ice_Water_Path_Mean) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) then + status = nf90_put_var(fileID,varID(53),cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) then + status = nf90_put_var(fileID,varID(148),cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) then + status = nf90_put_var(fileID,varID(149),cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) then + status = nf90_put_var(fileID,varID(54),cospOUT%modis_Optical_Thickness_vs_ReffICE) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(89),reffICE_binCenters) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) then + status = nf90_put_var(fileID,varID(55),cospOUT%modis_Optical_Thickness_vs_ReffLIQ) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(90),reffLIQ_binCenters) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + if (associated(cospOUT%lidar_only_freq_cloud)) then + status = nf90_put_var(fileID,varID(56),cospOUT%lidar_only_freq_cloud) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%radar_lidar_tcc)) then + status = nf90_put_var(fileID,varID(57),cospOUT%radar_lidar_tcc) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%cloudsat_tcc)) then + status = nf90_put_var(fileID,varID(138),cospOUT%cloudsat_tcc) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%cloudsat_tcc2)) then + status = nf90_put_var(fileID,varID(139),cospOUT%cloudsat_tcc2) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! Cloudsat+MODIS Joint simulators output + !! warm-rain occurrence frequency diagnostics + if (associated(cospOUT%wr_occfreq_ntotal)) then + status = nf90_put_var(fileID,varID(140),cospOUT%wr_occfreq_ntotal(:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(141),cospOUT%wr_occfreq_ntotal(:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(142),cospOUT%wr_occfreq_ntotal(:,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + !! Contoured Frequency by Optical Depth Diagram (CFODD) + if (associated(cospOUT%cfodd_ntotal)) then + status = nf90_put_var(fileID,varID(143),cospOUT%cfodd_ntotal(:,:,:,1)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(144),cospOUT%cfodd_ntotal(:,:,:,2)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(145),cospOUT%cfodd_ntotal(:,:,:,3)) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(146),CFODD_HISTDBZEcenters) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + status = nf90_put_var(fileID,varID(147),CFODD_HISTICODcenters) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + + ! Define instrument channel indices for multiple RTTOV instruments + ii = 165 ! RTTOV variable indices start at 166 + if (allocated(cospOUT%rttov_outputs)) then + do i=1,Ninst_rttov + write (i_str,fmt) i ! converting integer to string i_str using a 'internal file' + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) then + ii = ii + 1 + status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%channel_indices) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%bt_total)) then + ii = ii + 1 + status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%bt_total) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) then + ii = ii + 1 + status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%bt_clear) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%rad_total)) then + ii = ii + 1 + status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%rad_total) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) then + ii = ii + 1 + status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%rad_clear) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) then + ii = ii + 1 + status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%rad_cloudy) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%refl_total)) then + ii = ii + 1 + status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%refl_total) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) then + ii = ii + 1 + status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%refl_clear) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) then + ii = ii + 1 + status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%bt_total_pc) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) then + ii = ii + 1 + status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%rad_total_pc) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + endif + end do + end if + + ! Close file + status = nf90_close(fileID) + if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) + + end subroutine write_cosp2_output + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE nc_read_input_file + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + SUBROUTINE NC_READ_INPUT_FILE(fname,Npnts,Nl,Nhydro,lon,lat,p,ph,z,zh,T,qv,rh,tca,cca, & + mr_lsliq,mr_lsice,mr_ccliq,mr_ccice,fl_lsrain,fl_lssnow, & + fl_lsgrpl,fl_ccrain,fl_ccsnow,Reff,dtau_s,dtau_c,dem_s, & + dem_c,skt,psfc,landmask,mr_ozone,u_wind,v_wind,sunlit, & + emsfc_lw,mode,Nlon,Nlat,surfelev,year,month,day, & + hour,minute,seconds) + + ! Arguments + character(len=512),intent(in) :: fname ! File name + integer,intent(in) :: Npnts,Nl,Nhydro + real(wp),dimension(Npnts),intent(out) :: lon,lat + real(wp),dimension(Npnts,Nl),target,intent(out) :: p,ph,z,zh,T,qv,rh,tca,cca, & + mr_lsliq,mr_lsice,mr_ccliq,mr_ccice,fl_lsrain,fl_lssnow,fl_lsgrpl, & + fl_ccrain,fl_ccsnow,dtau_s,dtau_c,dem_s,dem_c,mr_ozone + real(wp),dimension(Npnts,Nl,Nhydro),intent(out) :: Reff + real(wp),dimension(Npnts),intent(out) :: skt,psfc,landmask,u_wind,v_wind,sunlit,surfelev, & + year,month,day,hour,minute,seconds + real(wp),intent(out) :: emsfc_lw + integer,intent(out) :: mode,Nlon,Nlat + + ! Local variables + integer,parameter :: NMAX_DIM=5 + integer :: Npoints,Nlevels,i,j,k,vrank,vdimid(NMAX_DIM),ncid,vid,ndims,nvars,ngatts, & + recdim,dimsize(NMAX_DIM),errst,Na,Nb,Nc,Nd,Ne + integer,dimension(:),allocatable :: plon,plat + logical :: Llat,Llon,Lpoint + real(wp),dimension(Npnts) :: ll + real(wp),allocatable :: x1(:),x2(:,:),x3(:,:,:),x4(:,:,:,:),x5(:,:,:,:,:) ! Temporary arrays + character(len=128) :: vname + character(len=256) :: dimname(NMAX_DIM) ! 256 hardcoded, instead of MAXNCNAM. This works for NetCDF 3 and 4. + character(len=64) :: routine_name='NC_READ_INPUT_FILE' + character(len=128) :: errmsg,straux + + mode = 0 + Nlon = 0 + Nlat = 0 + + Npoints = Npnts + Nlevels = Nl + + ! Open file + errst = nf90_open(fname, nf90_nowrite, ncid) + if (errst /= 0) then + errmsg="Couldn't open "//trim(fname) + call cosp_error(routine_name,errmsg) + endif + + ! Get information about dimensions. Curtain mode or lat/lon mode? + Llat =.false. + Llon =.false. + Lpoint=.false. + errst = nf90_inquire(ncid, ndims, nvars, ngatts, recdim) + if (errst /= 0) then + errmsg="Error in nf90_inquire" + call cosp_error(routine_name,errmsg,errcode=errst) + endif + do i = 1,ndims + errst = nf90_Inquire_Dimension(ncid,i,name=dimname(i),len=dimsize(i)) + if (errst /= 0) then + write(straux, *) i + errmsg="Error in nf90_Inquire_Dimension, i: "//trim(straux) + call cosp_error(routine_name,errmsg) + endif + if ((trim(dimname(i)).eq.'level').and.(Nlevels > dimsize(i))) then + errmsg='Number of levels selected is greater than in input file '//trim(fname) + call cosp_error(routine_name,errmsg) + endif + if (trim(dimname(i)).eq.'point') then + Lpoint = .true. + if (Npnts > dimsize(i)) then + errmsg='Number of points selected is greater than in input file '//trim(fname) + call cosp_error(routine_name,errmsg) + endif + endif + if (trim(dimname(i)).eq.'lon') then + Llon = .true. + Nlon = dimsize(i) + endif + if (trim(dimname(i)).eq.'lat') then + Llat = .true. + Nlat = dimsize(i) + endif + enddo + + ! Get lon and lat + if (Llon.and.Llat) then ! 2D mode + if ((Npnts) > Nlon*Nlat) Npoints=Nlon*Nlat + lon = -1.0E30 + lat = -1.0E30 + mode = 2 ! Don't know yet if (lon,lat) or (lat,lon) at this point + else if (Lpoint) then ! 1D mode + Nlon = Npoints + Nlat = Npoints + mode = 1 + else + errmsg= trim(fname)//' file contains wrong dimensions' + call cosp_error(routine_name,errmsg) + endif + errst = nf90_inq_varid(ncid, 'lon', vid) + if (errst /= 0) then + errmsg="Error in nf90_inq_varid, var: lon" + call cosp_error(routine_name,errmsg,errcode=errst) + endif + errst = nf90_get_var(ncid, vid, lon, start = (/1/), count = (/Nlon/)) + if (errst /= 0) then + errmsg="Error in nf90_get_var, var: lon" + call cosp_error(routine_name,errmsg,errcode=errst) + endif + errst = nf90_inq_varid(ncid, 'lat', vid) + if (errst /= 0) then + errmsg="Error in nf90_inq_varid, var: lat" + call cosp_error(routine_name,errmsg,errcode=errst) + endif + errst = nf90_get_var(ncid, vid, lat, start = (/1/), count = (/Nlat/)) + if (errst /= 0) then + errmsg="Error in nf90_get_var, var: lat" + call cosp_error(routine_name,errmsg,errcode=errst) + endif + + ! Get all variables + do vid = 1,nvars + vdimid=0 + errst = nf90_Inquire_Variable(ncid, vid, name=vname, ndims=vrank, dimids=vdimid) + if (errst /= 0) then + write(straux, *) vid + errmsg='Error in nf90_Inquire_Variable, vid '//trim(straux) + call cosp_error(routine_name,errmsg,errcode=errst) + endif + ! Read in into temporary array of correct shape + if (vrank == 1) then + Na = dimsize(vdimid(1)) + allocate(x1(Na)) + errst = nf90_get_var(ncid, vid, x1, start=(/1/), count=(/Na/)) + endif + if (vrank == 2) then + Na = dimsize(vdimid(1)) + Nb = dimsize(vdimid(2)) + allocate(x2(Na,Nb)) + errst = nf90_get_var(ncid, vid, x2, start=(/1,1/), count=(/Na,Nb/)) + endif + if (vrank == 3) then + Na = dimsize(vdimid(1)) + Nb = dimsize(vdimid(2)) + Nc = dimsize(vdimid(3)) + allocate(x3(Na,Nb,Nc)) + errst = nf90_get_var(ncid, vid, x3, start=(/1,1,1/), count=(/Na,Nb,Nc/)) + if ((mode == 2).or.(mode == 3)) then + if ((Na == Nlon).and.(Nb == Nlat)) then + mode = 2 + else if ((Na == Nlat).and.(Nb == Nlon)) then + mode = 3 + else + errmsg='Wrong mode for variable '//trim(vname) + call cosp_error(routine_name,errmsg) + endif + endif + endif + if (vrank == 4) then + Na = dimsize(vdimid(1)) + Nb = dimsize(vdimid(2)) + Nc = dimsize(vdimid(3)) + Nd = dimsize(vdimid(4)) + allocate(x4(Na,Nb,Nc,Nd)) + errst = nf90_get_var(ncid, vid, x4, start=(/1,1,1,1/), count=(/Na,Nb,Nc,Nd/)) + endif + if (vrank == 5) then + Na = dimsize(vdimid(1)) + Nb = dimsize(vdimid(2)) + Nc = dimsize(vdimid(3)) + Nd = dimsize(vdimid(4)) + Ne = dimsize(vdimid(5)) + allocate(x5(Na,Nb,Nc,Nd,Ne)) + errst = nf90_get_var(ncid, vid, x5, start=(/1,1,1,1,1/), count=(/Na,Nb,Nc,Nd,Ne/)) + endif + if (errst /= 0) then + write(straux, *) vid + errmsg='Error in nf90_get_var, vid '//trim(straux) + call cosp_error(routine_name,errmsg,errcode=errst) + endif + ! Map to the right input argument + select case (trim(vname)) + case ('pfull') + if (Lpoint) then + p(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=p) + endif + case ('phalf') + if (Lpoint) then + ph(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=ph) + endif + case ('height') + if (Lpoint) then + z(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=z) + endif + case ('height_half') + if (Lpoint) then + zh(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=zh) + endif + case ('T_abs') + if (Lpoint) then + T(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=T) + endif + case ('qv') + if (Lpoint) then + qv(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=qv) + endif + case ('rh') + if (Lpoint) then + rh(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=rh) + endif + case ('tca') + if (Lpoint) then + tca(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=tca) + endif + tca = tca + case ('cca') + if (Lpoint) then + cca(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=cca) + endif + cca = cca + case ('mr_lsliq') + if (Lpoint) then + mr_lsliq(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_lsliq) + endif + case ('mr_lsice') + if (Lpoint) then + mr_lsice(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_lsice) + endif + case ('mr_ccliq') + if (Lpoint) then + mr_ccliq(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_ccliq) + endif + case ('mr_ccice') + if (Lpoint) then + mr_ccice(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_ccice) + endif + case ('fl_lsrain') + if (Lpoint) then + fl_lsrain(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=fl_lsrain) + endif + case ('fl_lssnow') + if (Lpoint) then + fl_lssnow(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=fl_lssnow) + endif + case ('fl_lsgrpl') + if (Lpoint) then + fl_lsgrpl(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=fl_lsgrpl) + endif + case ('fl_ccrain') + if (Lpoint) then + fl_ccrain(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=fl_ccrain) + endif + case ('fl_ccsnow') + if (Lpoint) then + fl_ccsnow(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=fl_ccsnow) + endif + case ('dtau_s') + if (Lpoint) then + dtau_s(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=dtau_s) + endif + case ('dtau_c') + if (Lpoint) then + dtau_c(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=dtau_c) + endif + case ('dem_s') + if (Lpoint) then + dem_s(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=dem_s) + endif + case ('dem_c') + if (Lpoint) then + dem_c(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=dem_c) + endif + case ('Reff') + if (Lpoint) then + Reff(1:Npoints,:,:) = x3(1:Npoints,1:Nlevels,:) + else + call map_ll_to_point(Na,Nb,Npoints,x4=x4,y3=Reff) + endif + case ('skt') + if (Lpoint) then + skt(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=skt) + endif + case ('psfc') + if (Lpoint) then + psfc(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=psfc) + endif + case ('orography') + if (Lpoint) then + surfelev(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=surfelev) + endif + case ('landmask') + if (Lpoint) then + landmask(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=landmask) + endif + case ('mr_ozone') + if (Lpoint) then + mr_ozone(1:Npoints,:) = x2(1:Npoints,1:Nlevels) + else + call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_ozone) + endif + case ('u_wind') + if (Lpoint) then + u_wind(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=u_wind) + endif + case ('v_wind') + if (Lpoint) then + v_wind(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=v_wind) + endif + case ('sunlit') + if (Lpoint) then + sunlit(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=sunlit) + endif + case ('year') + if (Lpoint) then + year(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=year) + endif + case ('month') + if (Lpoint) then + month(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=month) + endif + case ('day') + if (Lpoint) then + day(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=day) + endif + case ('hour') + if (Lpoint) then + hour(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=hour) + endif + case ('minute') + if (Lpoint) then + minute(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=minute) + endif + case ('second') + if (Lpoint) then + seconds(1:Npoints) = x1(1:Npoints) + else + call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=seconds) + endif + end select + ! Free memory + if (vrank == 1) deallocate(x1) + if (vrank == 2) deallocate(x2) + if (vrank == 3) deallocate(x3) + if (vrank == 4) deallocate(x4) + if (vrank == 5) deallocate(x5) + enddo + + ! SFC emissivity + errst = nf90_inq_varid(ncid, 'emsfc_lw', vid) + if (errst /= 0) then + if (errst == nf90_enotvar) then ! Does not exist, use 1.0 + emsfc_lw = 1.0 + print *, ' ********* COSP Warning: emsfc_lw does not exist in input file. Set to 1.0.' + else ! Other error, stop + errmsg='Error in nf90_inq_varid, var: emsfc_lw' + call cosp_error(routine_name,errmsg,errcode=errst) + endif + else + errst = nf90_get_var(ncid, vid, emsfc_lw) + if (errst /= 0) then + errmsg='Error in nf90_get_var, var: emsfc_lw' + call cosp_error(routine_name,errmsg,errcode=errst) + endif + endif + + + ! Fill in the lat/lon vectors with the right values for 2D modes + ! This might be helpful if the inputs are 2D (gridded) and + ! you want outputs in 1D mode + allocate(plon(Npoints),plat(Npoints)) + if (mode == 2) then !(lon,lat) + ll = lat + do j=1,Nb + do i=1,Na + k = (j-1)*Na + i + plon(k) = i + plat(k) = j + enddo + enddo + lon(1:Npoints) = lon(plon(1:Npoints)) + lat(1:Npoints) = ll(plat(1:Npoints)) + else if (mode == 3) then !(lat,lon) + ll = lon + do j=1,Nb + do i=1,Na + k = (j-1)*Na + i + lon(k) = ll(j) + lat(k) = lat(i) + enddo + enddo + lon(1:Npoints) = ll(plon(1:Npoints)) + lat(1:Npoints) = lat(plat(1:Npoints)) + endif + deallocate(plon,plat) + + ! Close file + errst = nf90_close(ncid) + if (errst /= 0) then + errmsg='Error in nf90_close' + call cosp_error(routine_name,errmsg,errcode=errst) + endif + END SUBROUTINE NC_READ_INPUT_FILE + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE map_ll_to_point + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + SUBROUTINE MAP_LL_TO_POINT(Nx,Ny,Np,x2,x3,x4,x5,y1,y2,y3,y4) + ! Input arguments + integer,intent(in) :: Nx,Ny,Np + real(wp),intent(in),optional :: x2(:,:),x3(:,:,:), & + x4(:,:,:,:),x5(:,:,:,:,:) + real(wp),intent(out),optional :: y1(:),y2(:,:),y3(:,:,:), & + y4(:,:,:,:) + ! Local variables + integer :: px(Nx*Ny),py(Nx*Ny) + integer :: i,j,k,l,m + integer :: Ni,Nj,Nk,Nl,Nm + integer :: Mi,Mj,Mk,Ml + character(len=128) :: proname='MAP_LL_TO_POINT' + + px=0 + py=0 + if (Nx*Ny < Np) then + print *, ' -- '//trim(proname)//': Nx*Ny < Np' + stop + endif + do j=1,Ny + do i=1,Nx + k = (j-1)*Nx+i + px(k) = i + py(k) = j + enddo + enddo + + if (present(x2).and.present(y1)) then + Ni = size(x2,1) + Nj = size(x2,2) + Mi = size(y1,1) + if (Ni*Nj < Mi) then + print *, ' -- '//trim(proname)//': Nlon*Nlat < Npoints (opt 1)' + stop + endif + do j=1,Np + y1(j) = x2(px(j),py(j)) + enddo + else if (present(x3).and.present(y2)) then + Ni = size(x3,1) + Nj = size(x3,2) + Nk = size(x3,3) + Mi = size(y2,1) + Mj = size(y2,2) + if (Ni*Nj < Mi) then + print *, ' -- '//trim(proname)//': Nlon*Nlat < Npoints (opt 2)' + stop + endif + if (Nk /= Mj) then + print *, ' -- '//trim(proname)//': Nk /= Mj (opt 2)' + stop + endif + do k=1,Nk + do j=1,Np + y2(j,k) = x3(px(j),py(j),k) + enddo + enddo + else if (present(x4).and.present(y3)) then + Ni = size(x4,1) + Nj = size(x4,2) + Nk = size(x4,3) + Nl = size(x4,4) + Mi = size(y3,1) + Mj = size(y3,2) + Mk = size(y3,3) + if (Ni*Nj < Mi) then + print *, ' -- '//trim(proname)//': Nlon*Nlat < Npoints (opt 3)' + stop + endif + if (Nk /= Mj) then + print *, ' -- '//trim(proname)//': Nk /= Mj (opt 3)' + stop + endif + if (Nl /= Mk) then + print *, ' -- '//trim(proname)//': Nl /= Mk (opt 3)' + stop + endif + do l=1,Nl + do k=1,Nk + do j=1,Np + y3(j,k,l) = x4(px(j),py(j),k,l) + enddo + enddo + enddo + else if (present(x5).and.present(y4)) then + Ni = size(x5,1) + Nj = size(x5,2) + Nk = size(x5,3) + Nl = size(x5,4) + Nm = size(x5,5) + Mi = size(y4,1) + Mj = size(y4,2) + Mk = size(y4,3) + Ml = size(y4,4) + if (Ni*Nj < Mi) then + print *, ' -- '//trim(proname)//': Nlon*Nlat < Npoints (opt 4)' + stop + endif + if (Nk /= Mj) then + print *, ' -- '//trim(proname)//': Nk /= Mj (opt 4)' + stop + endif + if (Nl /= Mk) then + print *, ' -- '//trim(proname)//': Nl /= Mk (opt 4)' + stop + endif + if (Nm /= Ml) then + print *, ' -- '//trim(proname)//': Nm /= Ml (opt 4)' + stop + endif + do m=1,Nm + do l=1,Nl + do k=1,Nk + do j=1,Np + y4(j,k,l,m) = x5(px(j),py(j),k,l,m) + enddo + enddo + enddo + enddo + else + print *, ' -- '//trim(proname)//': wrong option' + stop + endif + END SUBROUTINE MAP_LL_TO_POINT + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Subrotuine cosp_error + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + SUBROUTINE COSP_ERROR(routine_name,message,errcode) + character(len = *), intent(in) :: routine_name + character(len = *), intent(in) :: message + integer,optional :: errcode + + write(6, *) " ********** Failure in ", trim(routine_name) + write(6, *) " ********** ", trim(message) + if (present(errcode)) write(6, *) " ********** errcode: ", errcode + flush(6) + stop + END SUBROUTINE COSP_ERROR + end module mod_cosp_io diff --git a/driver/src/cosp2_test.F90 b/driver/src/cosp2_test.F90 index 47ead0012f..7b6d14df27 100755 --- a/driver/src/cosp2_test.F90 +++ b/driver/src/cosp2_test.F90 @@ -1,4 +1,4 @@ -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! Copyright (c) 2016, Regents of the University of Colorado ! All rights reserved. ! @@ -64,11 +64,12 @@ program cosp2_test USE mod_scops, ONLY: scops USE mod_prec_scops, ONLY: prec_scops USE MOD_COSP_UTILS, ONLY: cosp_precip_mxratio + use MOD_COSP_RTTOV_UTIL, only: rttov_cfg, rttov_output use cosp_optics, ONLY: cosp_simulator_optics,lidar_optics,modis_optics, & modis_optics_partition use mod_cosp_stats, ONLY: COSP_CHANGE_VERTICAL_GRID,cosp_optical_inputs, & cosp_column_inputs,radar_cfg,cosp_cleanUp - use MOD_COSP_RTTOV_UTIL, only: rttov_cfg + use mod_cosp_config, ONLY: Nlvdplr, Nlvspwd, NlvdBZe, Nlvtemp ! added by DPLRW implicit none @@ -126,6 +127,16 @@ program cosp2_test frac_out, & ! Subcolumn cloud cover (0/1) Reff ! Subcolumn effective radius + ! additional inputs for DPLRW + real(wp),dimension(:,:),allocatable,target :: & + gwvel, & ! Model grid vertical velocity (m/s) + gcumf ! Model cumulus mass flux (kg/m^2/s) + + ! adjust to prognostic precipitation + real(wp),dimension(:,:),allocatable,target :: & + mr_lsrain, & ! Mass mixing ratio for stratiform cloud rain (kg/kg) + mr_lssnow ! Mass mixing ratio for stratiform cloud snow (kg/kg) + ! Input namelist fields integer :: & ! Npoints, & ! Number of gridpoints @@ -149,8 +160,8 @@ program cosp2_test logical :: & ! use_vgrid, & ! Use fixed vertical grid for outputs? csat_vgrid, & ! CloudSat vertical grid? - use_precipitation_fluxes ! True if precipitation fluxes are input to the - ! algorithm + use_precipitation_fluxes ! True if precipitation fluxes are input to the flux + character(len=64) :: & cloudsat_micro_scheme ! Microphysical scheme used in cloudsat radar simulator character(len=64) :: & @@ -224,7 +235,9 @@ program cosp2_test Lclmodis,Lptradarflag0,Lptradarflag1,Lptradarflag2,Lptradarflag3, & Lptradarflag4,Lptradarflag5,Lptradarflag6,Lptradarflag7,Lptradarflag8, & Lptradarflag9,Lradarpia, & - Lwr_occfreq,Lcfodd + Lwr_occfreq, Lcfodd, & + Ldplrw ! for DPLRW + namelist/COSP_OUTPUT/Lcfaddbze94,Ldbze94,Latb532,LcfadLidarsr532,Lclcalipso, & Lclhcalipso,Lcllcalipso,Lclmcalipso,Lcltcalipso,LparasolRefl, & Lclcalipsoliq,Lclcalipsoice,Lclcalipsoun,Lclcalipsotmp, & @@ -250,7 +263,9 @@ program cosp2_test Lptradarflag0,Lptradarflag1,Lptradarflag2,Lptradarflag3, & Lptradarflag4,Lptradarflag5,Lptradarflag6,Lptradarflag7, & Lptradarflag8,Lptradarflag9,Lradarpia, & - Lwr_occfreq, Lcfodd + Lwr_occfreq, Lcfodd, & + Ldplrw + ! Local variables logical :: & lsingle = .true., & ! True if using MMF_v3_single_moment CLOUDSAT microphysical scheme (default) @@ -320,6 +335,7 @@ program cosp2_test !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% call cpu_time(driver_time(1)) + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! Read in namelists !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -374,6 +390,8 @@ program cosp2_test dtau_s(Npoints,Nlevels),dtau_c(Npoints,Nlevels),dem_s(Npoints,Nlevels), & dem_c(Npoints,Nlevels),skt(Npoints),psfc(Npoints),landmask(Npoints), & mr_ozone(Npoints,Nlevels),u_wind(Npoints),v_wind(Npoints),sunlit(Npoints), & + gwvel(Npoints,Nlevels),gcumf(Npoints,Nlevels), & ! added by DPLRW + mr_lsrain(Npoints,Nlevels),mr_lssnow(Npoints,Nlevels), & frac_out(Npoints,Ncolumns,Nlevels),surfelev(Npoints),year(Npoints), & month(Npoints),day(Npoints),hour(Npoints),minute(Npoints),seconds(Npoints)) @@ -389,9 +407,11 @@ program cosp2_test call nc_read_input_file(fileIN,Npoints,Nlevels,N_HYDRO,lon,lat,p,ph,zlev,zlev_half, & T,sh,rh,tca,cca,mr_lsliq,mr_lsice,mr_ccliq,mr_ccice,fl_lsrain, & fl_lssnow,fl_lsgrpl,fl_ccrain,fl_ccsnow,Reff,dtau_s,dtau_c, & - dem_s,dem_c,skt,psfc,landmask,mr_ozone,u_wind,v_wind,sunlit, & - emsfc_lw,geomode,Nlon,Nlat,surfelev,year,month,day,hour, & - minute,seconds) + dem_s,dem_c,skt,psfc,landmask,mr_ozone,u_wind,v_wind,sunlit, & + gwvel, gcumf, & ! added by DPLRW + mr_lsrain, mr_lssnow, & ! adjust to prognostic precipitation + emsfc_lw,geomode,Nlon,Nlat,surfelev, & + year,month,day,hour,minute,seconds) call cpu_time(driver_time(2)) !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -432,8 +452,8 @@ program cosp2_test Lptradarflag6 .or. Lptradarflag7 .or. Lptradarflag8 .or. Lptradarflag9 .or. & Lradarpia) Lcloudsat = .true. if (Lparasolrefl) Lparasol = .true. - if (rttov_Ninstruments .gt. 0) Lrttov = .true. + if (Ldplrw) Lcloudsat = .true. ! added by DPLRW !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -469,7 +489,7 @@ program cosp2_test rttov_Ninstruments, rttov_instrument_namelists_final, rttov_configs, & debug=rttov_verbose) call cpu_time(driver_time(3)) - + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! Construct output derived type. ! *NOTE* The "construct/destroy" subroutines are local to this module and should be @@ -496,8 +516,7 @@ program cosp2_test LcfadDbze94, Ldbze94, Lparasolrefl, & Lptradarflag0,Lptradarflag1,Lptradarflag2,Lptradarflag3,Lptradarflag4, & Lptradarflag5,Lptradarflag6,Lptradarflag7,Lptradarflag8,Lptradarflag9,Lradarpia, & - Lwr_occfreq, Lcfodd, & - rttov_Ninstruments,rttov_configs, & + Lwr_occfreq, Lcfodd, rttov_Ninstruments, rttov_configs, Ldplrw, & Npoints, Ncolumns, Nlevels, Nlvgrid_local, use_vgrid, cospOUT) !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -510,7 +529,9 @@ program cosp2_test nChunks = nPoints/nPoints_it+1 endif if (nPoints .eq. nPoints_it) nChunks = 1 + write(*,*) 'nChunks = ',nChunks do iChunk=1,nChunks + write(*,*) 'Now ... iChunk = ',iChunk !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! Determine indices for "chunking" (again, if necessary) !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -577,6 +598,10 @@ program cosp2_test ! cospstateIN%hgt_matrix_half(:,Nlevels) contains the bottom of the surface layer. cospstateIN%hgt_matrix_half(:,1:Nlevels) = zlev_half(start_idx:end_idx,Nlevels:1:-1) ! km + ! added by DPLRW + cospstateIN%gwvel(:,1:Nlevels) = gwvel(start_idx:end_idx,Nlevels:1:-1) + cospstateIN%gcumf(:,1:Nlevels) = gcumf(start_idx:end_idx,Nlevels:1:-1) + ! Assign RTTOV values ! Keeping these structures since refl and emis could come from model input ! cospstateIN%emis_in(:,:) = 1._wp @@ -657,7 +682,8 @@ program cosp2_test ! The weighted Reff is given by: Reff_net = (M_1 + M_2) / (M_1/Reff_1 + M_2/Reff_2) cospstateIN%DeffLiq(:,:) = 0._wp ! Initialize for zero everywhere. where ((mr_lsliq(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) .and. (mr_ccliq(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp)) - cospstateIN%DeffLiq(:,:) = 2._wp * 1.0e6 * (mr_lsliq(start_idx:end_idx,Nlevels:1:-1) + mr_ccliq(start_idx:end_idx,Nlevels:1:-1)) / (mr_lsliq(start_idx:end_idx,Nlevels:1:-1) / Reff(start_idx:end_idx,Nlevels:1:-1,I_LSCLIQ) + mr_ccliq(start_idx:end_idx,Nlevels:1:-1) / Reff(start_idx:end_idx,Nlevels:1:-1,I_CVCLIQ)) + cospstateIN%DeffLiq(:,:) = 2._wp * 1.0e6 * (mr_lsliq(start_idx:end_idx,Nlevels:1:-1) + mr_ccliq(start_idx:end_idx,Nlevels:1:-1)) / & + & (mr_lsliq(start_idx:end_idx,Nlevels:1:-1) / Reff(start_idx:end_idx,Nlevels:1:-1,I_LSCLIQ) + mr_ccliq(start_idx:end_idx,Nlevels:1:-1) / Reff(start_idx:end_idx,Nlevels:1:-1,I_CVCLIQ)) elsewhere (mr_lsliq(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) cospstateIN%DeffLiq(:,:) = 2._wp * 1.0e6 * Reff(start_idx:end_idx,Nlevels:1:-1,I_LSCLIQ) elsewhere (mr_ccliq(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) @@ -666,7 +692,8 @@ program cosp2_test cospstateIN%DeffIce(:,:) = 0._wp ! Initialize for zero everywhere. where ((mr_lsice(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) .and. (mr_ccice(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp)) - cospstateIN%DeffIce(:,:) = 2._wp * 1.0e6 * (mr_lsice(start_idx:end_idx,Nlevels:1:-1) + mr_ccice(start_idx:end_idx,Nlevels:1:-1)) / (mr_lsice(start_idx:end_idx,Nlevels:1:-1) / Reff(start_idx:end_idx,Nlevels:1:-1,I_LSCICE) + mr_ccice(start_idx:end_idx,Nlevels:1:-1) / Reff(start_idx:end_idx,Nlevels:1:-1,I_CVCICE)) + cospstateIN%DeffIce(:,:) = 2._wp * 1.0e6 * (mr_lsice(start_idx:end_idx,Nlevels:1:-1) + mr_ccice(start_idx:end_idx,Nlevels:1:-1)) / & + & (mr_lsice(start_idx:end_idx,Nlevels:1:-1) / Reff(start_idx:end_idx,Nlevels:1:-1,I_LSCICE) + mr_ccice(start_idx:end_idx,Nlevels:1:-1) / Reff(start_idx:end_idx,Nlevels:1:-1,I_CVCICE)) elsewhere (mr_lsice(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) cospstateIN%DeffIce(:,:) = 2._wp * 1.0e6 * Reff(start_idx:end_idx,Nlevels:1:-1,I_LSCICE) elsewhere (mr_ccice(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) @@ -686,13 +713,15 @@ program cosp2_test ! Generate subcolumns and compute optical inputs. !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% call subsample_and_optics(nPtsPerIt,nLevels,nColumns,N_HYDRO,overlap, & - use_vgrid,use_precipitation_fluxes,lidar_ice_type,sd, & + use_vgrid,use_precipitation_fluxes,lidar_ice_type,sd, & tca(start_idx:end_idx,Nlevels:1:-1),cca(start_idx:end_idx,Nlevels:1:-1), & fl_lsrain(start_idx:end_idx,Nlevels:1:-1),fl_lssnow(start_idx:end_idx,Nlevels:1:-1), & fl_lsgrpl(start_idx:end_idx,Nlevels:1:-1),fl_ccrain(start_idx:end_idx,Nlevels:1:-1), & fl_ccsnow(start_idx:end_idx,Nlevels:1:-1),mr_lsliq(start_idx:end_idx,Nlevels:1:-1), & mr_lsice(start_idx:end_idx,Nlevels:1:-1),mr_ccliq(start_idx:end_idx,Nlevels:1:-1), & - mr_ccice(start_idx:end_idx,Nlevels:1:-1),Reff(start_idx:end_idx,Nlevels:1:-1,:), & + mr_ccice(start_idx:end_idx,Nlevels:1:-1), & + mr_lsrain(start_idx:end_idx,Nlevels:1:-1),mr_lssnow(start_idx:end_idx,Nlevels:1:-1), & + Reff(start_idx:end_idx,Nlevels:1:-1,:), & dtau_c(start_idx:end_idx,nLevels:1:-1),dtau_s(start_idx:end_idx,nLevels:1:-1), & dem_c(start_idx:end_idx,nLevels:1:-1),dem_s(start_idx:end_idx,nLevels:1:-1), & cospstateIN,cospIN) @@ -708,6 +737,7 @@ program cosp2_test end do call cpu_time(driver_time(7)) + end do print*,'Time to read in data: ',driver_time(2)-driver_time(1) @@ -747,14 +777,16 @@ program cosp2_test ! SUBROUTINE subsample_and_optics !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% subroutine subsample_and_optics(nPoints, nLevels, nColumns, nHydro, overlap, use_vgrid, & - use_precipitation_fluxes, lidar_ice_type, sd, tca, cca, fl_lsrainIN, fl_lssnowIN, & + use_precipitation_fluxes, lidar_ice_type, sd, & + tca, cca, fl_lsrainIN, fl_lssnowIN, & fl_lsgrplIN, fl_ccrainIN, fl_ccsnowIN, mr_lsliq, mr_lsice, mr_ccliq, mr_ccice, & + mr_lsrain, mr_lssnow, & ! adjust to prognostic precipitation reffIN, dtau_c, dtau_s, dem_c, dem_s, cospstateIN, cospIN) ! Inputs integer,intent(in) :: nPoints, nLevels, nColumns, nHydro, overlap, lidar_ice_type real(wp),intent(in),dimension(nPoints,nLevels) :: tca,cca,mr_lsliq,mr_lsice,mr_ccliq, & mr_ccice,dtau_c,dtau_s,dem_c,dem_s,fl_lsrainIN,fl_lssnowIN,fl_lsgrplIN,fl_ccrainIN,& - fl_ccsnowIN + fl_ccsnowIN, mr_lsrain, mr_lssnow real(wp),intent(in),dimension(nPoints,nLevels,nHydro) :: reffIN logical,intent(in) :: use_vgrid ! .false.: outputs on model levels ! .true.: outputs on evenly-spaced vertical levels. @@ -782,6 +814,7 @@ subroutine subsample_and_optics(nPoints, nLevels, nColumns, nHydro, overlap, use column_frac_out, column_prec_out, fl_lsrain, fl_lssnow, fl_lsgrpl, fl_ccrain, fl_ccsnow real(wp),dimension(nPoints,nColumns,Nlvgrid_local) :: tempOut logical :: cmpGases=.true. + logical :: prog_flag=.true. ! adjust to prognostic precipitation if (Ncolumns .gt. 1) then !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -807,8 +840,8 @@ subroutine subsample_and_optics(nPoints, nLevels, nColumns, nHydro, overlap, use cv_p_rate(:,1:nLevels) = fl_ccrainIN + fl_ccsnowIN else ls_p_rate(:,1:nLevels) = 0 ! mixing_ratio(rain) + mixing_ratio(snow) + mixing_ratio (groupel) - cv_p_rate(:,1:nLevels) = 0 ! mixing_ratio(rain) + mixing_ratio(snow) - endif + cv_p_rate(:,1:nLevels) = 0 ! mixing_ratio(rain) + mixing_ratio(snow) + mixing_ratio (groupel) + end if ! Call PREC_SCOPS allocate(frac_prec(nPoints,nColumns,nLevels)) @@ -856,6 +889,10 @@ subroutine subsample_and_optics(nPoints, nLevels, nColumns, nHydro, overlap, use mr_hydro(:,:,:,:) = 0._wp Reff(:,:,:,:) = 0._wp Np(:,:,:,:) = 0._wp + + ! check prognostic precipitaion + if ( any(mr_lsrain .lt. 0._wp) .or. any(mr_lssnow .lt. 0._wp) ) prog_flag = .false. + do k=1,nColumns ! Subcolumn cloud fraction column_frac_out = cospIN%frac_out(:,k,:) @@ -881,8 +918,8 @@ subroutine subsample_and_optics(nPoints, nLevels, nColumns, nHydro, overlap, use where ((column_prec_out == 1) .or. (column_prec_out == 3) ) Reff(:,k,:,I_LSRAIN) = ReffIN(:,:,I_LSRAIN) Reff(:,k,:,I_LSSNOW) = ReffIN(:,:,I_LSSNOW) - Reff(:,k,:,I_LSGRPL) = ReffIN(:,:,I_LSGRPL) - ! CONV precipitation + Reff(:,k,:,I_LSGRPL) = ReffIN(:,:,I_LSGRPL) + ! CONV precipitation elsewhere ((column_prec_out == 2) .or. (column_prec_out == 3)) Reff(:,k,:,I_CVRAIN) = ReffIN(:,:,I_CVRAIN) Reff(:,k,:,I_CVSNOW) = ReffIN(:,:,I_CVSNOW) @@ -899,6 +936,7 @@ subroutine subsample_and_optics(nPoints, nLevels, nColumns, nHydro, overlap, use fl_lsgrpl(:,:) = 0._wp fl_ccrain(:,:) = 0._wp fl_ccsnow(:,:) = 0._wp + do k=1,nLevels do j=1,nPoints ! In-cloud mixing ratios. @@ -913,9 +951,14 @@ subroutine subsample_and_optics(nPoints, nLevels, nColumns, nHydro, overlap, use ! Precipitation if (use_precipitation_fluxes) then if (prec_ls(j,k) .ne. 0.) then - fl_lsrain(j,k) = fl_lsrainIN(j,k)/prec_ls(j,k) - fl_lssnow(j,k) = fl_lssnowIN(j,k)/prec_ls(j,k) - fl_lsgrpl(j,k) = fl_lsgrplIN(j,k)/prec_ls(j,k) + if (prog_flag) then + mr_hydro(j,:,k,I_LSRAIN) = mr_lsrain(j,k)/prec_ls(j,k) + mr_hydro(j,:,k,I_LSSNOW) = mr_lssnow(j,k)/prec_ls(j,k) + else + fl_lsrain(j,k) = fl_lsrainIN(j,k)/prec_ls(j,k) + fl_lssnow(j,k) = fl_lssnowIN(j,k)/prec_ls(j,k) + fl_lsgrpl(j,k) = fl_lsgrplIN(j,k)/prec_ls(j,k) + end if endif if (prec_cv(j,k) .ne. 0.) then fl_ccrain(j,k) = fl_ccrainIN(j,k)/prec_cv(j,k) @@ -932,6 +975,13 @@ subroutine subsample_and_optics(nPoints, nLevels, nColumns, nHydro, overlap, use mr_hydro(j,:,k,I_CVSNOW) = mr_hydro(j,:,k,I_CVSNOW)/prec_cv(j,k) endif endif + + ! cumulus mass flux, added by DPLRW + if (cca(j,k) > 0._wp .and. cca(j,k) <= 1._wp) then + cospstateIN%gcumf(j,k) = cospstateIN%gcumf(j,k)/cca(j,k) + else + cospstateIN%gcumf(j,k) = R_UNDEF + end if enddo enddo deallocate(frac_ls,prec_ls,frac_cv,prec_cv) @@ -941,45 +991,35 @@ subroutine subsample_and_optics(nPoints, nLevels, nColumns, nHydro, overlap, use !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if (use_precipitation_fluxes) then ! LS rain - call cosp_precip_mxratio(nPoints, nLevels, nColumns, cospstateIN%pfull, & - cospstateIN%at, frac_prec, 1._wp, n_ax(I_LSRAIN), n_bx(I_LSRAIN), & - alpha_x(I_LSRAIN), c_x(I_LSRAIN), d_x(I_LSRAIN), g_x(I_LSRAIN), & - a_x(I_LSRAIN), b_x(I_LSRAIN), gamma_1(I_LSRAIN), gamma_2(I_LSRAIN), & - gamma_3(I_LSRAIN), gamma_4(I_LSRAIN), fl_lsrain, & - mr_hydro(:,:,:,I_LSRAIN), Reff(:,:,:,I_LSRAIN)) + if (.not. prog_flag) then + call cosp_precip_mxratio(Npoints, Nlevels, Ncolumns, & + cospstateIN%pfull, cospstateIN%at, frac_prec, 1._wp, I_LSRAIN, sd, & + fl_lsrain, mr_hydro(:,:,:,I_LSRAIN), Reff(:,:,:,I_LSRAIN) ) + end if ! LS snow - call cosp_precip_mxratio(nPoints, nLevels, nColumns, cospstateIN%pfull, & - cospstateIN%at, frac_prec, 1._wp, n_ax(I_LSSNOW), n_bx(I_LSSNOW), & - alpha_x(I_LSSNOW), c_x(I_LSSNOW), d_x(I_LSSNOW), g_x(I_LSSNOW), & - a_x(I_LSSNOW), b_x(I_LSSNOW), gamma_1(I_LSSNOW), gamma_2(I_LSSNOW), & - gamma_3(I_LSSNOW), gamma_4(I_LSSNOW), fl_lssnow, & - mr_hydro(:,:,:,I_LSSNOW), Reff(:,:,:,I_LSSNOW)) + if (.not. prog_flag) then + call cosp_precip_mxratio(Npoints, Nlevels, Ncolumns, & + cospstateIN%pfull, cospstateIN%at, frac_prec, 1._wp, I_LSSNOW, sd, & + fl_lssnow, mr_hydro(:,:,:,I_LSSNOW), Reff(:,:,:,I_LSSNOW) ) + end if ! CV rain - call cosp_precip_mxratio(nPoints, nLevels, nColumns, cospstateIN%pfull, & - cospstateIN%at, frac_prec, 2._wp, n_ax(I_CVRAIN), n_bx(I_CVRAIN), & - alpha_x(I_CVRAIN), c_x(I_CVRAIN), d_x(I_CVRAIN), g_x(I_CVRAIN), & - a_x(I_CVRAIN), b_x(I_CVRAIN), gamma_1(I_CVRAIN), gamma_2(I_CVRAIN), & - gamma_3(I_CVRAIN), gamma_4(I_CVRAIN), fl_ccrain, & - mr_hydro(:,:,:,I_CVRAIN), Reff(:,:,:,I_CVRAIN)) + call cosp_precip_mxratio(Npoints, Nlevels, Ncolumns, & + cospstateIN%pfull, cospstateIN%at, frac_prec, 2._wp, I_CVRAIN, sd, & + fl_lssnow, mr_hydro(:,:,:,I_CVRAIN), Reff(:,:,:,I_CVRAIN) ) ! CV snow - call cosp_precip_mxratio(nPoints, nLevels, nColumns, cospstateIN%pfull, & - cospstateIN%at, frac_prec, 2._wp, n_ax(I_CVSNOW), n_bx(I_CVSNOW), & - alpha_x(I_CVSNOW), c_x(I_CVSNOW), d_x(I_CVSNOW), g_x(I_CVSNOW), & - a_x(I_CVSNOW), b_x(I_CVSNOW), gamma_1(I_CVSNOW), gamma_2(I_CVSNOW), & - gamma_3(I_CVSNOW), gamma_4(I_CVSNOW), fl_ccsnow, & - mr_hydro(:,:,:,I_CVSNOW), Reff(:,:,:,I_CVSNOW)) + call cosp_precip_mxratio(Npoints, Nlevels, Ncolumns, & + cospstateIN%pfull, cospstateIN%at, frac_prec, 2._wp, I_CVSNOW, sd, & + fl_lssnow, mr_hydro(:,:,:,I_CVSNOW), Reff(:,:,:,I_CVSNOW) ) ! LS groupel. - call cosp_precip_mxratio(nPoints, nLevels, nColumns, cospstateIN%pfull, & - cospstateIN%at, frac_prec, 1._wp, n_ax(I_LSGRPL), n_bx(I_LSGRPL), & - alpha_x(I_LSGRPL), c_x(I_LSGRPL), d_x(I_LSGRPL), g_x(I_LSGRPL), & - a_x(I_LSGRPL), b_x(I_LSGRPL), gamma_1(I_LSGRPL), gamma_2(I_LSGRPL), & - gamma_3(I_LSGRPL), gamma_4(I_LSGRPL), fl_lsgrpl, & - mr_hydro(:,:,:,I_LSGRPL), Reff(:,:,:,I_LSGRPL)) + call cosp_precip_mxratio(Npoints, Nlevels, Ncolumns, & + cospstateIN%pfull, cospstateIN%at, frac_prec, 1._wp, I_LSGRPL, sd, & + fl_lssnow, mr_hydro(:,:,:,I_LSGRPL), Reff(:,:,:,I_LSGRPL) ) + deallocate(frac_prec) endif else - cospIN%frac_out(:,:,:) = 1 + cospIN%frac_out(:,:,:) = 1 allocate(mr_hydro(nPoints,1,nLevels,nHydro),Reff(nPoints,1,nLevels,nHydro), & Np(nPoints,1,nLevels,nHydro)) mr_hydro(:,1,:,I_LSCLIQ) = mr_lsliq @@ -1051,7 +1091,7 @@ subroutine subsample_and_optics(nPoints, nLevels, nColumns, nHydro, overlap, use cospIN%g_vol_cloudsat(i,:,j)=g_vol(i,j) end do end do - + ! Loop over all subcolumns allocate(fracPrecipIce(nPoints,nColumns,nLevels)) fracPrecipIce(:,:,:) = 0._wp @@ -1060,8 +1100,16 @@ subroutine subsample_and_optics(nPoints, nLevels, nColumns, nHydro, overlap, use mr_hydro(:,k,:,1:nHydro)*1000._wp, Reff(:,k,:,1:nHydro)*1.e6_wp,& Np(:,k,:,1:nHydro), cospstateIN%pfull, cospstateIN%at, & cospstateIN%qv, cospIN%z_vol_cloudsat(1:nPoints,k,:), & - cospIN%kr_vol_cloudsat(1:nPoints,k,:)) - + cospIN%kr_vol_cloudsat(1:nPoints,k,:), & + cospIN%vfall(1:nPoints,k,:,1:N_Hydro), & + cospIN%vfsqu(1:nPoints,k,:,1:N_Hydro), & + cospIN%zehyd(1:nPoints,k,:,1:N_Hydro), & + cospIN%krhyd(1:nPoints,k,:,1:N_Hydro), & + cospIN%vtrm3(1:nPoints,k,:,1:N_Hydro), & + cospIN%vtrm0(1:nPoints,k,:,1:N_Hydro), & + cospIN%mmnt3(1:nPoints,k,:,1:N_Hydro), & + cospIN%mmnt0(1:nPoints,k,:,1:N_Hydro) ) + ! At each model level, what fraction of the precipitation is frozen? where(mr_hydro(:,k,:,I_LSRAIN) .gt. 0 .or. mr_hydro(:,k,:,I_LSSNOW) .gt. 0 .or. & mr_hydro(:,k,:,I_CVRAIN) .gt. 0 .or. mr_hydro(:,k,:,I_CVSNOW) .gt. 0 .or. & @@ -1204,6 +1252,17 @@ subroutine construct_cospIN(npoints,ncolumns,nlevels,ninst_rttov,y,emis_grey) y%kr_vol_cloudsat(npoints, ncolumns,nlevels),& y%g_vol_cloudsat(npoints, ncolumns,nlevels),& y%fracPrecipIce(npoints, ncolumns)) + + ! added by DPLRW + allocate(y%vfall(npoints, ncolumns, nlevels, N_HYDRO), & + y%vfsqu(npoints, ncolumns, nlevels, N_HYDRO), & + y%zehyd(npoints, ncolumns, nlevels, N_HYDRO), & + y%krhyd(npoints, ncolumns, nlevels, N_HYDRO) ) + allocate(y%vtrm3(npoints, ncolumns, nlevels, N_HYDRO), & + y%vtrm0(npoints, ncolumns, nlevels, N_HYDRO), & + y%mmnt3(npoints, ncolumns, nlevels, N_HYDRO), & + y%mmnt0(npoints, ncolumns, nlevels, N_HYDRO) ) + endif if (Lmodis) then allocate(y%fracLiq(npoints, ncolumns,nlevels),& @@ -1238,6 +1297,8 @@ subroutine construct_cospstateIN(npoints,nlevels,y) y%tca(nPoints,nLevels),y%hgt_matrix_half(nPoints,nlevels), & y%rttov_date(nPoints,3),y%rttov_time(nPoints,3),y%sza(nPoints)) + ! added by DPLRW + allocate(y%gwvel(npoints,nlevels),y%gcumf(npoints,nlevels)) end subroutine construct_cospstateIN @@ -1278,7 +1339,7 @@ subroutine construct_cosp_outputs(Lpctisccp,Lclisccp,& Lptradarflag3,Lptradarflag4,Lptradarflag5, & Lptradarflag6,Lptradarflag7,Lptradarflag8, & Lptradarflag9,Lradarpia,Lwr_occfreq,Lcfodd, & - Ninst_rttov,rttov_configs, & + Ninst_rttov,rttov_configs, Ldplrw, & Npoints,Ncolumns,Nlevels,Nlvgrid,use_vgrid,x) ! Inputs logical,intent(in) :: & @@ -1389,6 +1450,7 @@ subroutine construct_cosp_outputs(Lpctisccp,Lclisccp,& Lradarpia, & ! CLOUDSAT Lwr_occfreq, & ! CloudSat+MODIS joint diagnostics Lcfodd, & ! CloudSat+MODIS joint diagnostics + Ldplrw, & ! Doppler capability of radar (CloudSat) use_vgrid integer,intent(in) :: & @@ -1608,6 +1670,29 @@ subroutine construct_cosp_outputs(Lpctisccp,Lclisccp,& x % Ninst_rttov = 0 end if + ! Doppler capability of radar (CloudSat) + if (Ldplrw) then + allocate(x%dplrw_Z(Npoints, Nlvdplr, Nlvgrid, 0:2)) + allocate(x%spwid_Z(Npoints, Nlvspwd, Nlvgrid, 0:2)) + allocate(x%Zef94_Z(Npoints, NlvdBZe, Nlvgrid, 0:2)) + + allocate(x%dplrw_T(Npoints, Nlvdplr, Nlvtemp, 0:2)) + allocate(x%spwid_T(Npoints, Nlvspwd, Nlvtemp, 0:2)) + allocate(x%Zef94_T(Npoints, NlvdBZe, Nlvtemp, 0:2)) + + allocate(x%ZefVd_2(Npoints, Nlvdplr, NlvdBZe, 0:2)) + + allocate(x%gcumw(Npoints, Nlevels)) + + allocate(x%vfall_Z(Npoints, Nlvdplr, Nlvgrid, 0:2, 3)) + allocate(x%gridw_Z(Npoints, Nlvdplr, Nlvgrid, 0:2)) + allocate(x%vfall_T(Npoints, Nlvdplr, Nlvtemp, 0:2, 3)) + allocate(x%gridw_T(Npoints, Nlvdplr, Nlvtemp, 0:2)) + + allocate(x%ZefVf_2(Npoints, Nlvdplr, NlvdBZe, 0:2, 3)) + + end if + end subroutine construct_cosp_outputs !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1644,7 +1729,28 @@ subroutine destroy_cospIN(y) if (allocated(y%tau_mol_atlid)) deallocate(y%tau_mol_atlid) if (allocated(y%tautot_atlid)) deallocate(y%tautot_atlid) if (allocated(y%fracPrecipIce)) deallocate(y%fracPrecipIce) + + !if (allocated(y%rcfg_cloudsat%N_scale_flag)) deallocate(y%rcfg_cloudsat%N_scale_flag) + !if (allocated(y%rcfg_cloudsat%Z_scale_flag)) deallocate(y%rcfg_cloudsat%Z_scale_flag) + !if (allocated(y%rcfg_cloudsat%Z_scale_added_flag)) deallocate(y%rcfg_cloudsat%Z_scale_added_flag) + !if (allocated(y%rcfg_cloudsat%Ze_scaled)) deallocate(y%rcfg_cloudsat%Ze_scaled) + !if (allocated(y%rcfg_cloudsat%Zr_scaled)) deallocate(y%rcfg_cloudsat%Zr_scaled) + !if (allocated(y%rcfg_cloudsat%kr_scaled)) deallocate(y%rcfg_cloudsat%kr_scaled) + !if (allocated(y%rcfg_cloudsat%fc)) deallocate(y%rcfg_cloudsat%fc) + !if (allocated(y%rcfg_cloudsat%rho_eff)) deallocate(y%rcfg_cloudsat%rho_eff) + !if (allocated(y%rcfg_cloudsat%base_list)) deallocate(y%rcfg_cloudsat%base_list) + !if (allocated(y%rcfg_cloudsat%step_list)) deallocate(y%rcfg_cloudsat%step_list) + if (allocated(y%vfall)) deallocate(y%vfall) + if (allocated(y%vfsqu)) deallocate(y%vfsqu) + if (allocated(y%zehyd)) deallocate(y%zehyd) + if (allocated(y%krhyd)) deallocate(y%krhyd) + if (allocated(y%vtrm3)) deallocate(y%vtrm3) + if (allocated(y%vtrm0)) deallocate(y%vtrm0) + if (allocated(y%mmnt3)) deallocate(y%mmnt3) + if (allocated(y%mmnt0)) deallocate(y%mmnt0) + if (associated(y%cfg_rttov)) nullify(y%cfg_rttov) + end subroutine destroy_cospIN !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! SUBROUTINE destroy_cospstateIN @@ -1685,6 +1791,9 @@ subroutine destroy_cospstateIN(y) if (allocated(y%fl_rain)) deallocate(y%fl_rain) if (allocated(y%fl_snow)) deallocate(y%fl_snow) if (allocated(y%tca)) deallocate(y%tca) + + if (allocated(y%gwvel)) deallocate(y%gwvel) + if (allocated(y%gcumf)) deallocate(y%gcumf) end subroutine destroy_cospstateIN @@ -2004,7 +2113,54 @@ subroutine destroy_cosp_outputs(y) deallocate(y%wr_occfreq_ntotal) nullify(y%wr_occfreq_ntotal) endif + + ! added by DPLRW + if (associated(y%dplrw_Z)) then + deallocate(y%dplrw_Z) ; nullify(y%dplrw_Z) + end if + if (associated(y%spwid_Z)) then + deallocate(y%spwid_Z) ; nullify(y%spwid_Z) + end if + if (associated(y%Zef94_Z)) then + deallocate(y%Zef94_Z) ; nullify(y%Zef94_Z) + end if + + if (associated(y%dplrw_T)) then + deallocate(y%dplrw_T) ; nullify(y%dplrw_T) + end if + if (associated(y%spwid_T)) then + deallocate(y%spwid_T) ; nullify(y%spwid_T) + end if + if (associated(y%Zef94_T)) then + deallocate(y%Zef94_T) ; nullify(y%Zef94_T) + end if + + if (associated(y%ZefVd_2)) then + deallocate(y%ZefVd_2) ; nullify(y%ZefVd_2) + end if + + if (associated(y%gcumw)) then + deallocate(y%gcumw) ; nullify(y%gcumw) + end if + if (associated(y%vfall_Z)) then + deallocate(y%vfall_Z) ; nullify(y%vfall_Z) + end if + if (associated(y%gridw_Z)) then + deallocate(y%gridw_Z) ; nullify(y%gridw_Z) + end if + + if (associated(y%vfall_T)) then + deallocate(y%vfall_T) ; nullify(y%vfall_T) + end if + if (associated(y%gridw_T)) then + deallocate(y%gridw_T) ; nullify(y%gridw_T) + end if + + if (associated(y%ZefVf_2)) then + deallocate(y%ZefVf_2) ; nullify(y%ZefVf_2) + end if + ! RTTOV multi-instrument if (allocated(y%rttov_outputs)) then do i=1,y % Ninst_rttov ! Iterate over each instrument @@ -2073,4 +2229,3 @@ subroutine rttov_cleanup(y) end subroutine rttov_cleanup end program cosp2_test - diff --git a/driver/src/cosp2_test.f90.bak b/driver/src/cosp2_test.f90.bak new file mode 100644 index 0000000000..47ead0012f --- /dev/null +++ b/driver/src/cosp2_test.f90.bak @@ -0,0 +1,2076 @@ +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +! Copyright (c) 2016, Regents of the University of Colorado +! All rights reserved. +! +! Redistribution and use in source and binary forms, with or without modification, are +! permitted provided that the following conditions are met: +! +! 1. Redistributions of source code must retain the above copyright notice, this list of +! conditions and the following disclaimer. +! +! 2. Redistributions in binary form must reproduce the above copyright notice, this list +! of conditions and the following disclaimer in the documentation and/or other +! materials provided with the distribution. +! +! 3. Neither the name of the copyright holder nor the names of its contributors may be +! used to endorse or promote products derived from this software without specific prior +! written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +! +! History +! March 2016 - D. Swales - Original version +! April 2018 - R. Guzman - Added OPAQ diagnostics and Ground LIDar (GLID) simulator +! April 2018 - R. Guzman - Added ATLID simulator +! Nov 2018 - T. Michibata - Added CloudSat+MODIS Warmrain Diagnostics +! June 2025 - J.K. Shaw - Added COSP-RTTOV integration and swathing +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +program cosp2_test + use cosp_kinds, only: wp + USE MOD_COSP_CONFIG, ONLY: R_UNDEF,PARASOL_NREFL,LIDAR_NCAT,LIDAR_NTYPE,SR_BINS, & + N_HYDRO,numMISRHgtBins, & + cloudsat_DBZE_BINS,LIDAR_NTEMP,calipso_histBsct, & + CFODD_NDBZE, CFODD_NICOD, & + CFODD_BNDRE, CFODD_NCLASS, & + CFODD_DBZE_MIN, CFODD_DBZE_MAX, & + CFODD_ICOD_MIN, CFODD_ICOD_MAX, & + CFODD_DBZE_WIDTH, CFODD_ICOD_WIDTH, & + WR_NREGIME, & + numMODISTauBins,numMODISPresBins, & + numMODISReffIceBins,numMODISReffLiqBins, & + numISCCPTauBins,numISCCPPresBins,numMISRTauBins, & + ntau,modis_histTau,tau_binBounds, & + modis_histTauEdges,tau_binEdges, & + modis_histTauCenters,tau_binCenters,ntauV1p4, & + tau_binBoundsV1p4,tau_binEdgesV1p4, tau_binCentersV1p4, & + grLidar532_histBsct,atlid_histBsct,vgrid_zu,vgrid_zl, & + Nlvgrid_local => Nlvgrid, & + vgrid_z,cloudsat_preclvl + use cosp_phys_constants, only: amw,amd,amO3,amCO2,amCH4,amN2O,amCO + use mod_cosp_io, only: nc_read_input_file,write_cosp2_output + USE mod_quickbeam_optics,only: size_distribution,hydro_class_init,quickbeam_optics, & + quickbeam_optics_init,gases + use mod_cosp, only: cosp_init, & + cosp_outputs,swath_inputs,cosp_simulator + USE mod_rng, ONLY: rng_state, init_rng + USE mod_scops, ONLY: scops + USE mod_prec_scops, ONLY: prec_scops + USE MOD_COSP_UTILS, ONLY: cosp_precip_mxratio + use cosp_optics, ONLY: cosp_simulator_optics,lidar_optics,modis_optics, & + modis_optics_partition + use mod_cosp_stats, ONLY: COSP_CHANGE_VERTICAL_GRID,cosp_optical_inputs, & + cosp_column_inputs,radar_cfg,cosp_cleanUp + use MOD_COSP_RTTOV_UTIL, only: rttov_cfg + + implicit none + + ! Input/Output driver file control + character(len=256) :: cosp_input_namelist + character(len=64) :: cosp_output_namelist = 'cosp2_output_nl.txt' + + ! Test data + integer :: & + Nlon,Nlat,geomode + real(wp) :: & + emsfc_lw + real(wp),dimension(:),allocatable,target :: & + lon, & ! Longitude (deg) + lat, & ! Latitude (deg) + skt, & ! Skin temperature (K) + psfc, & ! Surface Pressure (Pa) + surfelev, & ! Surface Elevation (m) + landmask, & ! Land/sea mask (0/1) + u_wind, & ! U-component of wind (m/s) + v_wind, & ! V-component of wind (m/s) + sunlit ! Sunlit flag + real(wp),dimension(:),allocatable :: & + year, & ! Year (CE) + month, & ! Month [1,12] + day, & ! Day [1,31] + hour, & ! Hour [0,24] + minute, & ! Minute [0,60] + seconds ! Second [0,60] + real(wp),dimension(:,:),allocatable,target :: & + p, & ! Model pressure levels (pa) + ph, & ! Model pressure @ half levels (pa) + zlev, & ! Model level height (m) + zlev_half, & ! Model level height @ half-levels (m) + T, & ! Temperature (K) + sh, & ! Specific humidity (kg/kg) + rh, & ! Relative humidity (1) + tca, & ! Total cloud fraction (1) + cca, & ! Convective cloud fraction (1) + mr_lsliq, & ! Mass mixing ratio for stratiform cloud liquid (kg/kg) + mr_lsice, & ! Mass mixing ratio for stratiform cloud ice (kg/kg) + mr_ccliq, & ! Mass mixing ratio for convective cloud liquid (kg/kg) + mr_ccice, & ! Mass mixing ratio for convective cloud ice (kg/kg) + mr_ozone, & ! Mass mixing ratio for ozone (kg/kg) + fl_lsrain, & ! Precipitation flux (rain) for stratiform cloud (kg/m^2/s) + fl_lssnow, & ! Precipitation flux (snow) for stratiform cloud (kg/m^2/s) + fl_lsgrpl, & ! Precipitation flux (groupel) for stratiform cloud (kg/m^2/s) + fl_ccrain, & ! Precipitation flux (rain) for convective cloud (kg/m^2/s) + fl_ccsnow, & ! Precipitation flux (snow) for convective cloud (kg/m^2/s) + dtau_s, & ! 0.67micron optical depth (stratiform cloud) (1) + dtau_c, & ! 0.67micron optical depth (convective cloud) (1) + dem_s, & ! 11micron emissivity (stratiform cloud) + dem_c ! 11microm emissivity (convective cloud) + real(wp),dimension(:,:,:),allocatable,target :: & + frac_out, & ! Subcolumn cloud cover (0/1) + Reff ! Subcolumn effective radius + + ! Input namelist fields + integer :: & ! + Npoints, & ! Number of gridpoints + Ncolumns, & ! Number of subcolumns + Nlevels, & ! Number of model vertical levels + Npoints_it, & ! Number of gridpoints to be processed in one + ! iteration + Nlvgrid, & ! Number of vertical levels for statistical outputs + ! (USE_VGRID=.true.) + surface_radar, & ! surface=1/spaceborne=0 + cloudsat_use_gas_abs, & ! Include gaseous absorption (1=yes/0=no) + cloudsat_do_ray, & ! Calculate output Rayleigh (1=yes/0=no) + lidar_ice_type, & ! Ice particle shape in lidar calculations + ! (0=ice-spheres/1=ice-non-spherical) + overlap, & ! Overlap type: 1=max, 2=rand, 3=max/rand + isccp_topheight, & ! ISCCP cloud top height + isccp_topheight_direction ! ISCCP cloud top height direction + real(wp) :: & ! + cloudsat_radar_freq, & ! CloudSat radar frequency (GHz) + cloudsat_k2 ! |K|^2, -1=use frequency dependent default + logical :: & ! + use_vgrid, & ! Use fixed vertical grid for outputs? + csat_vgrid, & ! CloudSat vertical grid? + use_precipitation_fluxes ! True if precipitation fluxes are input to the + ! algorithm + character(len=64) :: & + cloudsat_micro_scheme ! Microphysical scheme used in cloudsat radar simulator + character(len=64) :: & + finput ! Input NetCDF file + character(len=256) :: & + foutput + character(len=512) :: & + dinput ! Directory where the input files are located + character(len=600) :: & + fileIN ! dinput+finput + + ! RTTOV + integer :: rttov_Ninstruments = 0 + character(len=256), dimension(50) :: & ! Arbitrary limit of 50 should be fine. + rttov_instrument_namelists ! Input of paths to RTTOV instrument namelists + character(len=256), allocatable :: & + rttov_instrument_namelists_final(:) ! Array of paths to RTTOV instrument namelists + logical :: rttov_verbose = .false. + + ! Inputs for orbit swathing + integer :: N_SWATHS_ISCCP = 0 ! Number of ISCCP swaths + integer :: N_SWATHS_MISR = 0 ! Number of MISR swaths + integer :: N_SWATHS_MODIS = 0 ! Number of MODIS swaths + integer :: N_SWATHS_PARASOL = 0 ! Number of PARASOL swaths + integer :: N_SWATHS_CSCAL = 0 ! Number of CLOUDSAT+CALIPSO swaths + integer :: N_SWATHS_ATLID = 0 ! Number of ATLID swaths + real(wp),dimension(10),target :: & ! Arbitrary limit of 10 swaths seems reasonable. + SWATH_LOCALTIMES_ISCCP, & ! Local time of ISCCP satellite overpasses (hrs GMT) + SWATH_LOCALTIMES_MISR, & ! Local time of MISR satellite overpasses (hrs GMT) + SWATH_LOCALTIMES_MODIS, & ! Local time of MODIS satellite overpasses (hrs GMT) + SWATH_LOCALTIMES_PARASOL, & ! Local time of PARASOL satellite overpasses (hrs GMT) + SWATH_LOCALTIMES_CSCAL, & ! Local time of CLOUDSAT+CALIPSO satellite overpasses (hrs GMT) + SWATH_LOCALTIMES_ATLID, & ! Local time of ATLID satellite overpasses (hrs GMT) + SWATH_WIDTHS_ISCCP, & ! Width in km of ISCCP satellite overpasses + SWATH_WIDTHS_MISR, & ! Width in km of MISR satellite overpasses + SWATH_WIDTHS_MODIS, & ! Width in km of MODIS satellite overpasses + SWATH_WIDTHS_PARASOL, & ! Width in km of PARASOL satellite overpasses + SWATH_WIDTHS_CSCAL, & ! Width in km of CLOUDSAT+CALIPSO satellite overpasses + SWATH_WIDTHS_ATLID ! Width in km of ATLID satellite overpasses + + namelist/COSP_INPUT/overlap, isccp_topheight, isccp_topheight_direction, npoints, & + npoints_it, ncolumns, nlevels, use_vgrid, Nlvgrid, csat_vgrid, dinput, finput, & + foutput, cloudsat_radar_freq, surface_radar, cloudsat_use_gas_abs,cloudsat_do_ray,& + cloudsat_k2, cloudsat_micro_scheme, lidar_ice_type, use_precipitation_fluxes, & + rttov_Ninstruments, rttov_instrument_namelists, rttov_verbose, & + N_SWATHS_ISCCP, SWATH_LOCALTIMES_ISCCP, SWATH_WIDTHS_ISCCP, N_SWATHS_MISR, & + SWATH_LOCALTIMES_MISR, SWATH_WIDTHS_MISR, N_SWATHS_MODIS, SWATH_LOCALTIMES_MODIS, & + SWATH_WIDTHS_MODIS, N_SWATHS_PARASOL, SWATH_LOCALTIMES_PARASOL, & + SWATH_WIDTHS_PARASOL, N_SWATHS_CSCAL, SWATH_LOCALTIMES_CSCAL, & + SWATH_WIDTHS_CSCAL, N_SWATHS_ATLID, SWATH_LOCALTIMES_ATLID, SWATH_WIDTHS_ATLID + + ! Output namelist + logical :: Lcfaddbze94,Ldbze94,Latb532,LcfadLidarsr532,Lclcalipso,Lclhcalipso, & + Lcllcalipso,Lclmcalipso,Lcltcalipso,LparasolRefl,Lclcalipsoliq, & + Lclcalipsoice,Lclcalipsoun,Lclcalipsotmp,Lclcalipsotmpliq,Lclcalipsotmpice, & + Lclcalipsotmpun,Lclhcalipsoliq,Lcllcalipsoliq,Lclmcalipsoliq,Lcltcalipsoliq,& + Lclhcalipsoice,Lcllcalipsoice,Lclmcalipsoice,Lcltcalipsoice,Lclhcalipsoun, & + Lcllcalipsoun,Lclmcalipsoun,Lcltcalipsoun,Lclopaquecalipso,Lclthincalipso, & + Lclzopaquecalipso,Lclcalipsoopaque,Lclcalipsothin,Lclcalipsozopaque, & + Lclcalipsoopacity,Lclopaquetemp,Lclthintemp,Lclzopaquetemp,Lclopaquemeanz, & + Lclthinmeanz,Lclthinemis,Lclopaquemeanzse,Lclthinmeanzse,Lclzopaquecalipsose,& + LlidarBetaMol532gr,LcfadLidarsr532gr,Latb532gr,LclgrLidar532,LclhgrLidar532,& + LcllgrLidar532,LclmgrLidar532,LcltgrLidar532,LlidarBetaMol355, & + LcfadLidarsr355,Latb355,Lclatlid,Lclhatlid,Lcllatlid,Lclmatlid,Lcltatlid, & + Lalbisccp,Lboxptopisccp,Lboxtauisccp,Lpctisccp,Lclisccp,Ltauisccp,Lcltisccp,& + Lmeantbisccp,Lmeantbclrisccp,LclMISR,Lclcalipso2,Lcltlidarradar, & + Lcloudsat_tcc, Lcloudsat_tcc2,Lfracout, & + LlidarBetaMol532,Lcltmodis,Lclwmodis,Lclimodis,Lclhmodis,Lclmmodis, & + Lcllmodis,Ltautmodis,Ltauwmodis,Ltauimodis,Ltautlogmodis,Ltauwlogmodis, & + Ltauilogmodis,Lreffclwmodis,Lreffclimodis,Lpctmodis,Llwpmodis,Liwpmodis, & + Lclmodis,Lptradarflag0,Lptradarflag1,Lptradarflag2,Lptradarflag3, & + Lptradarflag4,Lptradarflag5,Lptradarflag6,Lptradarflag7,Lptradarflag8, & + Lptradarflag9,Lradarpia, & + Lwr_occfreq,Lcfodd + namelist/COSP_OUTPUT/Lcfaddbze94,Ldbze94,Latb532,LcfadLidarsr532,Lclcalipso, & + Lclhcalipso,Lcllcalipso,Lclmcalipso,Lcltcalipso,LparasolRefl, & + Lclcalipsoliq,Lclcalipsoice,Lclcalipsoun,Lclcalipsotmp, & + Lclcalipsotmpliq,Lclcalipsotmpice,Lclcalipsotmpun,Lclhcalipsoliq, & + Lcllcalipsoliq,Lclmcalipsoliq,Lcltcalipsoliq,Lclhcalipsoice, & + Lcllcalipsoice,Lclmcalipsoice,Lcltcalipsoice,Lclhcalipsoun, & + Lcllcalipsoun,Lclmcalipsoun,Lcltcalipsoun,Lclopaquecalipso, & + Lclthincalipso,Lclzopaquecalipso,Lclcalipsoopaque,Lclcalipsothin, & + Lclcalipsozopaque,Lclcalipsoopacity,Lclopaquetemp,Lclthintemp, & + Lclzopaquetemp,Lclopaquemeanz,Lclthinmeanz,Lclthinemis, & + Lclopaquemeanzse,Lclthinmeanzse,Lclzopaquecalipsose, & + LlidarBetaMol532gr,LcfadLidarsr532gr,Latb532gr,LclgrLidar532, & + LclhgrLidar532,LcllgrLidar532,LclmgrLidar532,LcltgrLidar532, & + LlidarBetaMol355,LcfadLidarsr355,Latb355,Lclatlid, & + Lclhatlid,Lcllatlid,Lclmatlid,Lcltatlid,Lalbisccp,Lboxptopisccp, & + Lboxtauisccp,Lpctisccp,Lclisccp,Ltauisccp,Lcltisccp,Lmeantbisccp, & + Lmeantbclrisccp,LclMISR,Lclcalipso2,Lcltlidarradar, & + Lcloudsat_tcc, Lcloudsat_tcc2, Lfracout, & + LlidarBetaMol532,Lcltmodis,Lclwmodis,Lclimodis,Lclhmodis, & + Lclmmodis,Lcllmodis,Ltautmodis,Ltauwmodis,Ltauimodis, & + Ltautlogmodis,Ltauwlogmodis,Ltauilogmodis,Lreffclwmodis, & + Lreffclimodis,Lpctmodis,Llwpmodis,Liwpmodis,Lclmodis, & + Lptradarflag0,Lptradarflag1,Lptradarflag2,Lptradarflag3, & + Lptradarflag4,Lptradarflag5,Lptradarflag6,Lptradarflag7, & + Lptradarflag8,Lptradarflag9,Lradarpia, & + Lwr_occfreq, Lcfodd + ! Local variables + logical :: & + lsingle = .true., & ! True if using MMF_v3_single_moment CLOUDSAT microphysical scheme (default) + ldouble = .false., & ! True if using MMF_v3.5_two_moment CLOUDSAT microphysical scheme + lisccp = .false. ,& ! Local on/off switch for simulators (used by initialization) + lmodis = .false., & ! + lmisr = .false., & ! + lcalipso = .false., & ! + lgrLidar532 = .false., & ! + latlid = .false., & ! + lcloudsat = .false., & ! + lrttov = .false., & ! + lparasol = .false. ! + type(size_distribution) :: & + sd ! Hydrometeor description + type(radar_cfg) :: & + rcfg_cloudsat ! Radar configuration + type(rttov_cfg), dimension(:), allocatable, target :: & + rttov_configs + type(cosp_outputs) :: & + cospOUT ! COSP simulator outputs + type(cosp_optical_inputs) :: & + cospIN ! COSP optical (or derived?) fields needed by simulators + type(cosp_column_inputs) :: & + cospstateIN ! COSP model fields needed by simulators + integer :: iChunk,nChunks,start_idx,end_idx,nPtsPerIt,ij + real(wp),dimension(10) :: driver_time + character(len=256),dimension(100) :: cosp_status + + ! Indices to address arrays of LS and CONV hydrometeors + integer,parameter :: & + I_LSCLIQ = 1, & ! Large-scale (stratiform) liquid + I_LSCICE = 2, & ! Large-scale (stratiform) ice + I_LSRAIN = 3, & ! Large-scale (stratiform) rain + I_LSSNOW = 4, & ! Large-scale (stratiform) snow + I_CVCLIQ = 5, & ! Convective liquid + I_CVCICE = 6, & ! Convective ice + I_CVRAIN = 7, & ! Convective rain + I_CVSNOW = 8, & ! Convective snow + I_LSGRPL = 9 ! Large-scale (stratiform) groupel + + ! Stratiform and convective clouds in frac_out (scops output). + integer, parameter :: & + I_LSC = 1, & ! Large-scale clouds + I_CVC = 2 ! Convective clouds + + ! Microphysical settings for the precipitation flux to mixing ratio conversion + real(wp),parameter,dimension(N_HYDRO) :: & + ! LSL LSI LSR LSS CVL CVI CVR CVS LSG + N_ax = (/-1., -1., 8.e6, 3.e6, -1., -1., 8.e6, 3.e6, 4.e6/),& + N_bx = (/-1., -1., 0.0, 0.0, -1., -1., 0.0, 0.0, 0.0/),& + alpha_x = (/-1., -1., 0.0, 0.0, -1., -1., 0.0, 0.0, 0.0/),& + c_x = (/-1., -1., 842.0, 4.84, -1., -1., 842.0, 4.84, 94.5/),& + d_x = (/-1., -1., 0.8, 0.25, -1., -1., 0.8, 0.25, 0.5/),& + g_x = (/-1., -1., 0.5, 0.5, -1., -1., 0.5, 0.5, 0.5/),& + a_x = (/-1., -1., 524.0, 52.36, -1., -1., 524.0, 52.36, 209.44/),& + b_x = (/-1., -1., 3.0, 3.0, -1., -1., 3.0, 3.0, 3.0/),& + gamma_1 = (/-1., -1., 17.83725, 8.284701, -1., -1., 17.83725, 8.284701, 11.63230/),& + gamma_2 = (/-1., -1., 6.0, 6.0, -1., -1., 6.0, 6.0, 6.0/),& + gamma_3 = (/-1., -1., 2.0, 2.0, -1., -1., 2.0, 2.0, 2.0/),& + gamma_4 = (/-1., -1., 6.0, 6.0, -1., -1., 6.0, 6.0, 6.0/) + + ! Swathing DDT array + type(swath_inputs),dimension(6) :: & + cospswathsIN + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + call cpu_time(driver_time(1)) + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Read in namelists + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Input namelist (cosp setup) + call get_command_argument(1, cosp_input_namelist) + open(10,file=cosp_input_namelist,status='unknown') + read(10,nml=cosp_input) + close(10) + + ! Output namelist (logical flags to turn on/off outputs) + if (command_argument_count() .ge. 2) call get_command_argument(2, cosp_output_namelist) + open(10,file=cosp_output_namelist,status='unknown') + read(10,nml=cosp_output) + close(10) + + ! Shift the namelists read in into a shorter array for cosp_init: + allocate(rttov_instrument_namelists_final(rttov_Ninstruments)) + rttov_instrument_namelists_final(:) = rttov_instrument_namelists(1:rttov_Ninstruments) + + ! Read orbital swathing inputs into structure: + ! Indexing order is ISCCP, MISR, CLOUDSAT-CALIPSO, ATLID, PARASOL, MODIS + cospswathsIN(1) % N_inst_swaths = N_SWATHS_ISCCP + cospswathsIN(1) % inst_localtimes(1:N_SWATHS_ISCCP) = SWATH_LOCALTIMES_ISCCP(1:N_SWATHS_ISCCP) + cospswathsIN(1) % inst_localtime_widths(1:N_SWATHS_ISCCP) = SWATH_WIDTHS_ISCCP(1:N_SWATHS_ISCCP) + cospswathsIN(2) % N_inst_swaths = N_SWATHS_MISR + cospswathsIN(2) % inst_localtimes(1:N_SWATHS_MISR) = SWATH_LOCALTIMES_MISR(1:N_SWATHS_MISR) + cospswathsIN(2) % inst_localtime_widths(1:N_SWATHS_MISR) = SWATH_WIDTHS_MISR(1:N_SWATHS_MISR) + cospswathsIN(3) % N_inst_swaths = N_SWATHS_CSCAL + cospswathsIN(3) % inst_localtimes(1:N_SWATHS_CSCAL) = SWATH_LOCALTIMES_CSCAL(1:N_SWATHS_CSCAL) + cospswathsIN(3) % inst_localtime_widths(1:N_SWATHS_CSCAL) = SWATH_WIDTHS_CSCAL(1:N_SWATHS_CSCAL) + cospswathsIN(4) % N_inst_swaths = N_SWATHS_ATLID + cospswathsIN(4) % inst_localtimes(1:N_SWATHS_ATLID) = SWATH_LOCALTIMES_ATLID(1:N_SWATHS_ATLID) + cospswathsIN(4) % inst_localtime_widths(1:N_SWATHS_ATLID) = SWATH_WIDTHS_ATLID(1:N_SWATHS_ATLID) + cospswathsIN(5) % N_inst_swaths = N_SWATHS_PARASOL + cospswathsIN(5) % inst_localtimes(1:N_SWATHS_PARASOL) = SWATH_LOCALTIMES_PARASOL(1:N_SWATHS_PARASOL) + cospswathsIN(5) % inst_localtime_widths(1:N_SWATHS_PARASOL) = SWATH_WIDTHS_PARASOL(1:N_SWATHS_PARASOL) + cospswathsIN(6) % N_inst_swaths = N_SWATHS_MODIS + cospswathsIN(6) % inst_localtimes(1:N_SWATHS_MODIS) = SWATH_LOCALTIMES_MODIS(1:N_SWATHS_MODIS) + cospswathsIN(6) % inst_localtime_widths(1:N_SWATHS_MODIS) = SWATH_WIDTHS_MODIS(1:N_SWATHS_MODIS) + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Read in sample input data. + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + allocate(lon(Npoints),lat(Npoints),p(Npoints,Nlevels),ph(Npoints,Nlevels), & + zlev(Npoints,Nlevels),zlev_half(Npoints,Nlevels),T(Npoints,Nlevels), & + sh(Npoints,Nlevels),rh(Npoints,Nlevels),tca(Npoints,Nlevels), & + cca(Npoints,Nlevels),mr_lsliq(Npoints,Nlevels),mr_lsice(Npoints,Nlevels), & + mr_ccliq(Npoints,Nlevels),mr_ccice(Npoints,Nlevels), & + fl_lsrain(Npoints,Nlevels),fl_lssnow(Npoints,Nlevels), & + fl_lsgrpl(Npoints,Nlevels),fl_ccrain(Npoints,Nlevels), & + fl_ccsnow(Npoints,Nlevels),Reff(Npoints,Nlevels,N_HYDRO), & + dtau_s(Npoints,Nlevels),dtau_c(Npoints,Nlevels),dem_s(Npoints,Nlevels), & + dem_c(Npoints,Nlevels),skt(Npoints),psfc(Npoints),landmask(Npoints), & + mr_ozone(Npoints,Nlevels),u_wind(Npoints),v_wind(Npoints),sunlit(Npoints), & + frac_out(Npoints,Ncolumns,Nlevels),surfelev(Npoints),year(Npoints), & + month(Npoints),day(Npoints),hour(Npoints),minute(Npoints),seconds(Npoints)) + + ! Set some fields to masked values if the COSP offline driver outputs are inconsistent + year(:) = R_UNDEF + month(:) = R_UNDEF + day(:) = R_UNDEF + hour(:) = R_UNDEF + minute(:) = R_UNDEF + seconds(:) = R_UNDEF + + fileIN = trim(dinput)//trim(finput) + call nc_read_input_file(fileIN,Npoints,Nlevels,N_HYDRO,lon,lat,p,ph,zlev,zlev_half, & + T,sh,rh,tca,cca,mr_lsliq,mr_lsice,mr_ccliq,mr_ccice,fl_lsrain, & + fl_lssnow,fl_lsgrpl,fl_ccrain,fl_ccsnow,Reff,dtau_s,dtau_c, & + dem_s,dem_c,skt,psfc,landmask,mr_ozone,u_wind,v_wind,sunlit, & + emsfc_lw,geomode,Nlon,Nlat,surfelev,year,month,day,hour, & + minute,seconds) + call cpu_time(driver_time(2)) + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Which simulators need to be run? Look at which outputs are requested. + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (Lpctisccp .or. Lclisccp .or. Lboxptopisccp .or. Lboxtauisccp .or. Ltauisccp .or. & + Lcltisccp .or. Lmeantbisccp .or. Lmeantbclrisccp .or. Lalbisccp) Lisccp = .true. + if (LclMISR) Lmisr = .true. + if (Lcltmodis .or. Lclwmodis .or. Lclimodis .or. Lclhmodis .or. Lclmmodis .or. & + Lcllmodis .or. Ltautmodis .or. Ltauwmodis .or. Ltauimodis .or. Ltautlogmodis .or. & + Ltauwlogmodis .or. Ltauilogmodis .or. Lreffclwmodis .or. Lreffclimodis .or. & + Lpctmodis .or. Llwpmodis .or. Liwpmodis .or. Lclmodis) Lmodis = .true. + if (Lclcalipso2 .or. Lclcalipso .or. Lclhcalipso .or. Lcllcalipso .or. Lclmcalipso & + .or. Lcltcalipso .or. Lcltlidarradar .or. Lclcalipsoliq .or. Lclcalipsoice .or. & + Lclcalipsoun .or. Lclcalipsotmp .or. Lclcalipsotmpliq .or. Lclcalipsotmpice .or. & + Lclcalipsotmpun .or. Lcltcalipsoliq .or. Lcltcalipsoice .or. Lcltcalipsoun .or. & + Lclhcalipsoliq .or. Lclhcalipsoice .or. Lclhcalipsoun .or. Lclmcalipsoliq .or. & + Lclmcalipsoice .or. Lclmcalipsoun .or. Lcllcalipsoliq .or. Lcllcalipsoice .or. & + Lcllcalipsoun .or. LlidarBetaMol532 .or. LcfadLidarsr532 .or. Lcltlidarradar .or. & + Lcltlidarradar .or. Lclopaquecalipso .or. Lclthincalipso .or. Lclzopaquecalipso & + .or. Lclcalipsoopaque .or. Lclcalipsothin .or. Lclcalipsozopaque .or. & + Lclcalipsoopacity .or. Lclopaquetemp .or. Lclthintemp .or. Lclzopaquetemp .or. & + Lclopaquemeanz .or. Lclthinmeanz .or. Lclthinemis .or. Lclopaquemeanzse .or. & + Lclthinmeanzse .or. Lclzopaquecalipsose) Lcalipso = .true. + + if (LlidarBetaMol532gr .or. LcfadLidarsr532gr .or. Latb532gr .or. LclgrLidar532 .or. & + LclhgrLidar532 .or. LcllgrLidar532 .or. LclmgrLidar532 .or. LcltgrLidar532) & + LgrLidar532 = .true. + + if (LlidarBetaMol355 .or. LcfadLidarsr355 .or. Latb355 .or. Lclatlid .or. & + Lclhatlid .or. Lcllatlid .or. Lclmatlid .or. Lcltatlid) & + Latlid = .true. + + if (LcfadDbze94 .or. Ldbze94 .or. Lcltlidarradar) Lcloudsat = .true. + + if (LcfadDbze94 .or. Ldbze94 .or. Lcltlidarradar .or. Lptradarflag0 .or. Lptradarflag1 & + .or. Lptradarflag2 .or. Lptradarflag3 .or. Lptradarflag4 .or. Lptradarflag5 .or. & + Lptradarflag6 .or. Lptradarflag7 .or. Lptradarflag8 .or. Lptradarflag9 .or. & + Lradarpia) Lcloudsat = .true. + if (Lparasolrefl) Lparasol = .true. + + if (rttov_Ninstruments .gt. 0) Lrttov = .true. + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! IF IMPLEMTING COSP IN GCM, HERE IS WHERE TO START!!! + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Initialize COSP + !*This only needs to be done the first time that COSP is called.* + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + ! Initialize quickbeam_optics, also if two-moment radar microphysics scheme is wanted... + if (cloudsat_micro_scheme == 'MMF_v3.5_two_moment') then + ldouble = .true. + lsingle = .false. + endif + call quickbeam_optics_init() + + ! Initialize the distributional parameters for hydrometeors in radar simulator + call hydro_class_init(lsingle,ldouble,sd) + + ! Initialize COSP simulator + call COSP_INIT(Lisccp, Lmodis, Lmisr, Lcloudsat, Lcalipso, LgrLidar532, Latlid, & + Lparasol, Lrttov, & + cloudsat_radar_freq, cloudsat_k2, cloudsat_use_gas_abs, & + cloudsat_do_ray, isccp_topheight, isccp_topheight_direction, surface_radar, & + rcfg_cloudsat, use_vgrid, csat_vgrid, Nlvgrid, Nlevels, cloudsat_micro_scheme, & + rttov_Ninstruments, rttov_instrument_namelists_final, rttov_configs, & + debug=rttov_verbose) + call cpu_time(driver_time(3)) + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Construct output derived type. + ! *NOTE* The "construct/destroy" subroutines are local to this module and should be + ! modified for your configuration. E.g. it may be overkill to query each field. + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + call construct_cosp_outputs(Lpctisccp, Lclisccp, Lboxptopisccp, Lboxtauisccp, & + Ltauisccp, Lcltisccp, Lmeantbisccp, Lmeantbclrisccp, Lalbisccp, LclMISR, & + Lcltmodis, Lclwmodis, Lclimodis, Lclhmodis, Lclmmodis, Lcllmodis, Ltautmodis, & + Ltauwmodis, Ltauimodis, Ltautlogmodis, Ltauwlogmodis, Ltauilogmodis, & + Lreffclwmodis, Lreffclimodis, Lpctmodis, Llwpmodis, Liwpmodis, Lclmodis, Latb532, & + Latb532gr, Latb355, LlidarBetaMol532, LlidarBetaMol532gr, LlidarBetaMol355, & + LcfadLidarsr532, LcfadLidarsr532gr, LcfadLidarsr355, Lclcalipso2, & + Lclcalipso, LclgrLidar532, Lclatlid, Lclhcalipso, Lcllcalipso, Lclmcalipso, & + Lcltcalipso, LclhgrLidar532, LcllgrLidar532, LclmgrLidar532, LcltgrLidar532, & + Lclhatlid, Lcllatlid, Lclmatlid, Lcltatlid, Lcltlidarradar, Lcloudsat_tcc, & + Lcloudsat_tcc2, Lclcalipsoliq, & + Lclcalipsoice, Lclcalipsoun, Lclcalipsotmp, Lclcalipsotmpliq, Lclcalipsotmpice, & + Lclcalipsotmpun, Lcltcalipsoliq, Lcltcalipsoice, Lcltcalipsoun, Lclhcalipsoliq, & + Lclhcalipsoice, Lclhcalipsoun, Lclmcalipsoliq, Lclmcalipsoice, Lclmcalipsoun, & + Lcllcalipsoliq, Lcllcalipsoice, Lcllcalipsoun, Lclopaquecalipso, Lclthincalipso, & + Lclzopaquecalipso, Lclcalipsoopaque, Lclcalipsothin, Lclcalipsozopaque, & + Lclcalipsoopacity, Lclopaquetemp, Lclthintemp, Lclzopaquetemp, Lclopaquemeanz, & + Lclthinmeanz, Lclthinemis, Lclopaquemeanzse, Lclthinmeanzse, Lclzopaquecalipsose, & + LcfadDbze94, Ldbze94, Lparasolrefl, & + Lptradarflag0,Lptradarflag1,Lptradarflag2,Lptradarflag3,Lptradarflag4, & + Lptradarflag5,Lptradarflag6,Lptradarflag7,Lptradarflag8,Lptradarflag9,Lradarpia, & + Lwr_occfreq, Lcfodd, & + rttov_Ninstruments,rttov_configs, & + Npoints, Ncolumns, Nlevels, Nlvgrid_local, use_vgrid, cospOUT) + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Break COSP up into pieces and loop over each COSP 'chunk'. + ! nChunks = # Points to Process (nPoints) / # Points per COSP iteration (nPoints_it) + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (MOD(nPoints,nPoints_it) .eq. 0) then + nChunks = Npoints/Npoints_it + else + nChunks = nPoints/nPoints_it+1 + endif + if (nPoints .eq. nPoints_it) nChunks = 1 + do iChunk=1,nChunks + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Determine indices for "chunking" (again, if necessary) + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if (nChunks .eq. 1) then + start_idx = 1 + end_idx = nPoints + nPtsPerIt = nPoints + else + start_idx = (iChunk-1)*nPoints_it+1 + end_idx = iChunk*nPoints_it + if (end_idx .gt. nPoints) end_idx=nPoints + nPtsPerIt = end_idx-start_idx+1 + endif + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Construct COSP input types + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (iChunk .eq. 1) then + call construct_cospIN(Nptsperit,nColumns,nLevels,rttov_Ninstruments,cospIN,emis_grey=1.0_wp) + ! call construct_cospIN(Nptsperit,nColumns,nLevels,rttov_Ninstruments,cospIN) + call construct_cospstateIN(Nptsperit,nLevels,cospstateIN) + endif + if (iChunk .eq. nChunks) then + call destroy_cospIN(cospIN) + call destroy_cospstateIN(cospstateIN) + call construct_cospIN(Nptsperit,nColumns,nLevels,rttov_Ninstruments,cospIN,emis_grey=1.0_wp) + ! call construct_cospIN(Nptsperit,nColumns,nLevels,rttov_Ninstruments,cospIN) + call construct_cospstateIN(Nptsperit,nLevels,cospstateIN) + endif + call cpu_time(driver_time(4)) + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Populate input types with model fields. + ! Here the 3D sample model fields (temperature,pressure,etc...) are ordered from the + ! surface-2-TOA, whereas COSP expects all fields to be ordered from TOA-2-SFC. So the + ! vertical fields are flipped prior to storing to COSP input type. + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + cospIN%emsfc_lw = emsfc_lw + cospIN%rcfg_cloudsat = rcfg_cloudsat + cospIN%cfg_rttov => rttov_configs + cospIN%cospswathsIN = cospswathsIN ! Swathing information for each non-RTTOV simulator. + + cospstateIN%hgt_matrix = zlev(start_idx:end_idx,Nlevels:1:-1) ! km + cospstateIN%sunlit = sunlit(start_idx:end_idx) ! 0-1 + cospstateIN%skt = skt(start_idx:end_idx) ! K + cospstateIN%surfelev = surfelev(start_idx:end_idx) ! m + cospstateIN%land = landmask(start_idx:end_idx) ! 0-1 (*note* model specific) + cospstateIN%qv = sh(start_idx:end_idx,Nlevels:1:-1) ! kg/kg + cospstateIN%at = T(start_idx:end_idx,Nlevels:1:-1) ! K + cospstateIN%pfull = p(start_idx:end_idx,Nlevels:1:-1) ! Pa + ! Pressure at interface (nlevels+1). Set uppermost interface to 0. + cospstateIN%phalf(:,2:Nlevels+1) = ph(start_idx:end_idx,Nlevels:1:-1) ! Pa + cospstateIN%phalf(:,1) = 0._wp + ! Surface pressure + if (any(psfc(start_idx:end_idx) .lt. 0._wp)) then + print*,'Some of values of the surface pressure field are negative. Replacing all psfc values with the lowest boundary pressure.' + psfc(start_idx:end_idx) = cospstateIN%phalf(start_idx:end_idx,Nlevels+1) + end if + cospstateIN%psfc = psfc(start_idx:end_idx) ! Pa + ! Height of bottom interfaces of model layers (nlevels). + ! cospstateIN%hgt_matrix_half(:,1) contains the bottom of the top layer. + ! cospstateIN%hgt_matrix_half(:,Nlevels) contains the bottom of the surface layer. + cospstateIN%hgt_matrix_half(:,1:Nlevels) = zlev_half(start_idx:end_idx,Nlevels:1:-1) ! km + + ! Assign RTTOV values + ! Keeping these structures since refl and emis could come from model input + ! cospstateIN%emis_in(:,:) = 1._wp + ! cospstateIN%refl_in(:,:) = 1._wp + + ! Well-mixed gases are not provided in COSP offline input, so hardcoding them in. + ! Units are kg/kg over moist air. + ! Note: user_tracegas_input should be true in instrument namelists for the COSP offline driver + cospstateIN%co2(:,:) = 5.241e-04 + cospstateIN%ch4(:,:) = 9.139e-07 + cospstateIN%n2o(:,:) = 4.665e-07 + cospstateIN%co(:,:) = 2.098e-07 + cospstateIN%so2(:,:) = 2.0e-11 + + if (any(year(start_idx:end_idx) .lt. 0._wp)) then + print*,'Some of values of the input year field are masked. Replacing with 1 so RTTOV will run.' + where (year(start_idx:end_idx) .lt. 0._wp) + year(start_idx:end_idx) = 1 + end where + end if + if (any(month(start_idx:end_idx) .lt. 0._wp)) then + print*,'Some of values of the input month field are masked. Replacing with 1 so RTTOV will run.' + where (month(start_idx:end_idx) .lt. 0._wp) + month(start_idx:end_idx) = 1 + end where + end if + if (any(day(start_idx:end_idx) .lt. 0._wp)) then + print*,'Some of values of the input day field are masked. Replacing with 1 so RTTOV will run.' + where (day(start_idx:end_idx) .lt. 0._wp) + day(start_idx:end_idx) = 1 + end where + end if + if (any(hour(start_idx:end_idx) .lt. 0._wp)) then + print*,'Some of values of the input hour field are masked. Replacing with 1 so RTTOV will run.' + where (hour(start_idx:end_idx) .lt. 0._wp) + hour(start_idx:end_idx) = 1._wp + end where + end if + if (any(minute(start_idx:end_idx) .lt. 0._wp)) then + print*,'Some of values of the input minute field are masked. Replacing with 1 so RTTOV will run.' + where (minute(start_idx:end_idx) .lt. 0._wp) + minute(start_idx:end_idx) = 1._wp + end where + end if + if (any(seconds(start_idx:end_idx) .lt. 0._wp)) then + print*,'Some of values of the input minute field are masked. Replacing with 1 so RTTOV will run.' + where (seconds(start_idx:end_idx) .lt. 0._wp) + seconds(start_idx:end_idx) = 1._wp + end where + end if + + ! Read in date and time objects for RTTOV + cospstateIN%rttov_date(:,1) = year(start_idx:end_idx) + cospstateIN%rttov_date(:,2) = month(start_idx:end_idx) + cospstateIN%rttov_date(:,3) = day(start_idx:end_idx) + + cospstateIN%rttov_time(:,1) = hour(start_idx:end_idx) + cospstateIN%rttov_time(:,2) = minute(start_idx:end_idx) + cospstateIN%rttov_time(:,3) = seconds(start_idx:end_idx) + + cospstateIN%sza = 0._wp ! Hard code to zero for the offline driver. + + ! From the data input file + cospstateIN%u_sfc = u_wind(start_idx:end_idx) + cospstateIN%v_sfc = v_wind(start_idx:end_idx) + cospstateIN%lat = lat(start_idx:end_idx) + cospstateIN%lon = lon(start_idx:end_idx) + + cospstateIN%o3 = mr_ozone(start_idx:end_idx,Nlevels:1:-1) + cospstateIN%tca = tca(start_idx:end_idx,Nlevels:1:-1) + + ! Combine large-scale and convective cloud mixing ratios for RTTOV [kg/kg] + cospstateIN%cloudIce = mr_lsice(start_idx:end_idx,Nlevels:1:-1) + mr_ccice(start_idx:end_idx,Nlevels:1:-1) + cospstateIN%cloudLiq = mr_lsliq(start_idx:end_idx,Nlevels:1:-1) + mr_ccliq(start_idx:end_idx,Nlevels:1:-1) + + ! Combine large-scale and convective cloud effective radii into effective diameters for RTTOV + ! Reff(Npoints,Nlevels,N_HYDRO) + ! The weighted Reff is given by: Reff_net = (M_1 + M_2) / (M_1/Reff_1 + M_2/Reff_2) + cospstateIN%DeffLiq(:,:) = 0._wp ! Initialize for zero everywhere. + where ((mr_lsliq(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) .and. (mr_ccliq(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp)) + cospstateIN%DeffLiq(:,:) = 2._wp * 1.0e6 * (mr_lsliq(start_idx:end_idx,Nlevels:1:-1) + mr_ccliq(start_idx:end_idx,Nlevels:1:-1)) / (mr_lsliq(start_idx:end_idx,Nlevels:1:-1) / Reff(start_idx:end_idx,Nlevels:1:-1,I_LSCLIQ) + mr_ccliq(start_idx:end_idx,Nlevels:1:-1) / Reff(start_idx:end_idx,Nlevels:1:-1,I_CVCLIQ)) + elsewhere (mr_lsliq(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) + cospstateIN%DeffLiq(:,:) = 2._wp * 1.0e6 * Reff(start_idx:end_idx,Nlevels:1:-1,I_LSCLIQ) + elsewhere (mr_ccliq(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) + cospstateIN%DeffLiq(:,:) = 2._wp * 1.0e6 * Reff(start_idx:end_idx,Nlevels:1:-1,I_CVCLIQ) + end where + + cospstateIN%DeffIce(:,:) = 0._wp ! Initialize for zero everywhere. + where ((mr_lsice(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) .and. (mr_ccice(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp)) + cospstateIN%DeffIce(:,:) = 2._wp * 1.0e6 * (mr_lsice(start_idx:end_idx,Nlevels:1:-1) + mr_ccice(start_idx:end_idx,Nlevels:1:-1)) / (mr_lsice(start_idx:end_idx,Nlevels:1:-1) / Reff(start_idx:end_idx,Nlevels:1:-1,I_LSCICE) + mr_ccice(start_idx:end_idx,Nlevels:1:-1) / Reff(start_idx:end_idx,Nlevels:1:-1,I_CVCICE)) + elsewhere (mr_lsice(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) + cospstateIN%DeffIce(:,:) = 2._wp * 1.0e6 * Reff(start_idx:end_idx,Nlevels:1:-1,I_LSCICE) + elsewhere (mr_ccice(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) + cospstateIN%DeffIce(:,:) = 2._wp * 1.0e6 * Reff(start_idx:end_idx,Nlevels:1:-1,I_CVCICE) + end where + + ! RTTOV doesn't consider precip flux for longwave, but it could be used when simulating MW instruments. + ! Graupel goes in the snow category, arbitrarily + cospstateIN%fl_rain = fl_lsrain(start_idx:end_idx,Nlevels:1:-1) + fl_ccrain(start_idx:end_idx,Nlevels:1:-1) + cospstateIN%fl_snow = fl_lssnow(start_idx:end_idx,Nlevels:1:-1) + fl_ccsnow(start_idx:end_idx,Nlevels:1:-1) + & + fl_lsgrpl(start_idx:end_idx,Nlevels:1:-1) + + ! Inputs not supplied in the UKMO test data + cospstateIN%rttov_sfcmask = landmask(start_idx:end_idx) ! (0=ocn,1=land,2=seaice). No sea ice in UKMO input here. + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Generate subcolumns and compute optical inputs. + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + call subsample_and_optics(nPtsPerIt,nLevels,nColumns,N_HYDRO,overlap, & + use_vgrid,use_precipitation_fluxes,lidar_ice_type,sd, & + tca(start_idx:end_idx,Nlevels:1:-1),cca(start_idx:end_idx,Nlevels:1:-1), & + fl_lsrain(start_idx:end_idx,Nlevels:1:-1),fl_lssnow(start_idx:end_idx,Nlevels:1:-1), & + fl_lsgrpl(start_idx:end_idx,Nlevels:1:-1),fl_ccrain(start_idx:end_idx,Nlevels:1:-1), & + fl_ccsnow(start_idx:end_idx,Nlevels:1:-1),mr_lsliq(start_idx:end_idx,Nlevels:1:-1), & + mr_lsice(start_idx:end_idx,Nlevels:1:-1),mr_ccliq(start_idx:end_idx,Nlevels:1:-1), & + mr_ccice(start_idx:end_idx,Nlevels:1:-1),Reff(start_idx:end_idx,Nlevels:1:-1,:), & + dtau_c(start_idx:end_idx,nLevels:1:-1),dtau_s(start_idx:end_idx,nLevels:1:-1), & + dem_c(start_idx:end_idx,nLevels:1:-1),dem_s(start_idx:end_idx,nLevels:1:-1), & + cospstateIN,cospIN) + + call cpu_time(driver_time(6)) + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Call COSP + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + cosp_status = COSP_SIMULATOR(cospIN, cospstateIN, cospOUT,start_idx,end_idx,rttov_verbose) + do ij=1,size(cosp_status,1) + if (cosp_status(ij) .ne. '') print*,trim(cosp_status(ij)) + end do + + call cpu_time(driver_time(7)) + end do + + print*,'Time to read in data: ',driver_time(2)-driver_time(1) + print*,'Time to initialize: ',driver_time(3)-driver_time(2) + print*,'Time to construct types: ',driver_time(4)-driver_time(3) + print*,'Time to compute optics: ',driver_time(6)-driver_time(4) + print*,'Time to run COSP: ',driver_time(7)-driver_time(6) + print*,'Total time: ',driver_time(7)-driver_time(1) + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Output + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + call write_cosp2_output(Npoints, Ncolumns, Nlevels, rttov_Ninstruments, zlev(1,Nlevels:1:-1), lon, lat, cospOUT, foutput) + + call cpu_time(driver_time(8)) + print*,'Time to write to output: ',driver_time(8)-driver_time(7) + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Free up memory + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (rttov_verbose) print*,'Calling "destroy_cosp_outputs".' + call destroy_cosp_outputs(cospOUT) + if (associated(cospIN%cfg_rttov)) then + if (rttov_verbose) print*,'Calling "rttov_cleanup".' + call rttov_cleanup(cospIN) + endif + if (rttov_verbose) print*,'Calling "destroy_cospIN".' + call destroy_cospIN(cospIN) + if (rttov_verbose) print*,'Calling "destroy_cospstateIN".' + call destroy_cospstateIN(cospstateIN) + if (rttov_verbose) print*,'Calling "cosp_cleanUp".' + call cosp_cleanUp() + if (rttov_verbose) print*,'all done.' + +contains + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE subsample_and_optics + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + subroutine subsample_and_optics(nPoints, nLevels, nColumns, nHydro, overlap, use_vgrid, & + use_precipitation_fluxes, lidar_ice_type, sd, tca, cca, fl_lsrainIN, fl_lssnowIN, & + fl_lsgrplIN, fl_ccrainIN, fl_ccsnowIN, mr_lsliq, mr_lsice, mr_ccliq, mr_ccice, & + reffIN, dtau_c, dtau_s, dem_c, dem_s, cospstateIN, cospIN) + ! Inputs + integer,intent(in) :: nPoints, nLevels, nColumns, nHydro, overlap, lidar_ice_type + real(wp),intent(in),dimension(nPoints,nLevels) :: tca,cca,mr_lsliq,mr_lsice,mr_ccliq, & + mr_ccice,dtau_c,dtau_s,dem_c,dem_s,fl_lsrainIN,fl_lssnowIN,fl_lsgrplIN,fl_ccrainIN,& + fl_ccsnowIN + real(wp),intent(in),dimension(nPoints,nLevels,nHydro) :: reffIN + logical,intent(in) :: use_vgrid ! .false.: outputs on model levels + ! .true.: outputs on evenly-spaced vertical levels. + logical,intent(in) :: use_precipitation_fluxes + type(size_distribution),intent(inout) :: sd + + ! Outputs + type(cosp_optical_inputs),intent(inout) :: cospIN + type(cosp_column_inputs),intent(inout) :: cospstateIN + + ! Local variables + type(rng_state),allocatable,dimension(:) :: rngs ! Seeds for random number generator + integer,dimension(:),allocatable :: seed + integer,dimension(:),allocatable :: cloudsat_preclvl_index + integer :: i,j,k + real(wp) :: zstep + real(wp),dimension(:,:), allocatable :: & + ls_p_rate, cv_p_rate, frac_ls, frac_cv, prec_ls, prec_cv,g_vol + real(wp),dimension(:,:,:), allocatable :: & + frac_prec, MODIS_cloudWater, MODIS_cloudIce, fracPrecipIce, fracPrecipIce_statGrid,& + MODIS_watersize,MODIS_iceSize, MODIS_opticalThicknessLiq,MODIS_opticalThicknessIce + real(wp),dimension(:,:,:,:),allocatable :: & + mr_hydro, Reff, Np + real(wp),dimension(nPoints,nLevels) :: & + column_frac_out, column_prec_out, fl_lsrain, fl_lssnow, fl_lsgrpl, fl_ccrain, fl_ccsnow + real(wp),dimension(nPoints,nColumns,Nlvgrid_local) :: tempOut + logical :: cmpGases=.true. + + if (Ncolumns .gt. 1) then + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Generate subcolumns for clouds (SCOPS) and precipitation type (PREC_SCOPS) + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! RNG used for subcolumn generation + allocate(rngs(nPoints),seed(nPoints)) + seed(:)=0 + seed = int(cospstateIN%phalf(:,Nlevels+1)) ! In case of NPoints=1 + ! *NOTE* Chunking will change the seed + if (NPoints .gt. 1) seed=int((cospstateIN%phalf(:,Nlevels+1)-minval(cospstateIN%phalf(:,Nlevels+1)))/ & + (maxval(cospstateIN%phalf(:,Nlevels+1))-minval(cospstateIN%phalf(:,Nlevels+1)))*100000) + 1 + call init_rng(rngs, seed) + + ! Call scops + call scops(NPoints,Nlevels,Ncolumns,rngs,tca,cca,overlap,cospIN%frac_out,0) + deallocate(seed,rngs) + + ! Sum up precipitation rates + allocate(ls_p_rate(nPoints,nLevels),cv_p_rate(nPoints,Nlevels)) + if(use_precipitation_fluxes) then + ls_p_rate(:,1:nLevels) = fl_lsrainIN + fl_lssnowIN + fl_lsgrplIN + cv_p_rate(:,1:nLevels) = fl_ccrainIN + fl_ccsnowIN + else + ls_p_rate(:,1:nLevels) = 0 ! mixing_ratio(rain) + mixing_ratio(snow) + mixing_ratio (groupel) + cv_p_rate(:,1:nLevels) = 0 ! mixing_ratio(rain) + mixing_ratio(snow) + endif + + ! Call PREC_SCOPS + allocate(frac_prec(nPoints,nColumns,nLevels)) + call prec_scops(nPoints,nLevels,nColumns,ls_p_rate,cv_p_rate,cospIN%frac_out,frac_prec) + deallocate(ls_p_rate,cv_p_rate) + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Compute fraction in each gridbox for precipitation and cloud type. + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Allocate + allocate(frac_ls(nPoints,nLevels),prec_ls(nPoints,nLevels), & + frac_cv(nPoints,nLevels),prec_cv(nPoints,nLevels)) + + ! Initialize + frac_ls(1:nPoints,1:nLevels) = 0._wp + prec_ls(1:nPoints,1:nLevels) = 0._wp + frac_cv(1:nPoints,1:nLevels) = 0._wp + prec_cv(1:nPoints,1:nLevels) = 0._wp + do j=1,nPoints + do k=1,nLevels + do i=1,nColumns + if (cospIN%frac_out(j,i,k) .eq. 1) frac_ls(j,k) = frac_ls(j,k)+1._wp + if (cospIN%frac_out(j,i,k) .eq. 2) frac_cv(j,k) = frac_cv(j,k)+1._wp + if (frac_prec(j,i,k) .eq. 1) prec_ls(j,k) = prec_ls(j,k)+1._wp + if (frac_prec(j,i,k) .eq. 2) prec_cv(j,k) = prec_cv(j,k)+1._wp + if (frac_prec(j,i,k) .eq. 3) prec_cv(j,k) = prec_cv(j,k)+1._wp + if (frac_prec(j,i,k) .eq. 3) prec_ls(j,k) = prec_ls(j,k)+1._wp + enddo + frac_ls(j,k)=frac_ls(j,k)/nColumns + frac_cv(j,k)=frac_cv(j,k)/nColumns + prec_ls(j,k)=prec_ls(j,k)/nColumns + prec_cv(j,k)=prec_cv(j,k)/nColumns + enddo + enddo + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Assign gridmean mixing-ratios (mr_XXXXX), effective radius (ReffIN) and number + ! concentration (not defined) to appropriate sub-column. Here we are using scops. + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + allocate(mr_hydro(nPoints,nColumns,nLevels,nHydro), & + Reff(nPoints,nColumns,nLevels,nHydro), & + Np(nPoints,nColumns,nLevels,nHydro)) + + ! Initialize + mr_hydro(:,:,:,:) = 0._wp + Reff(:,:,:,:) = 0._wp + Np(:,:,:,:) = 0._wp + do k=1,nColumns + ! Subcolumn cloud fraction + column_frac_out = cospIN%frac_out(:,k,:) + + ! LS clouds + where (column_frac_out == I_LSC) + mr_hydro(:,k,:,I_LSCLIQ) = mr_lsliq + mr_hydro(:,k,:,I_LSCICE) = mr_lsice + Reff(:,k,:,I_LSCLIQ) = ReffIN(:,:,I_LSCLIQ) + Reff(:,k,:,I_LSCICE) = ReffIN(:,:,I_LSCICE) + ! CONV clouds + elsewhere (column_frac_out == I_CVC) + mr_hydro(:,k,:,I_CVCLIQ) = mr_ccliq + mr_hydro(:,k,:,I_CVCICE) = mr_ccice + Reff(:,k,:,I_CVCLIQ) = ReffIN(:,:,I_CVCLIQ) + Reff(:,k,:,I_CVCICE) = ReffIN(:,:,I_CVCICE) + end where + + ! Subcolumn precipitation + column_prec_out = frac_prec(:,k,:) + + ! LS Precipitation + where ((column_prec_out == 1) .or. (column_prec_out == 3) ) + Reff(:,k,:,I_LSRAIN) = ReffIN(:,:,I_LSRAIN) + Reff(:,k,:,I_LSSNOW) = ReffIN(:,:,I_LSSNOW) + Reff(:,k,:,I_LSGRPL) = ReffIN(:,:,I_LSGRPL) + ! CONV precipitation + elsewhere ((column_prec_out == 2) .or. (column_prec_out == 3)) + Reff(:,k,:,I_CVRAIN) = ReffIN(:,:,I_CVRAIN) + Reff(:,k,:,I_CVSNOW) = ReffIN(:,:,I_CVSNOW) + end where + enddo + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Convert the subcolumn mixing ratio and precipitation fluxes from gridbox mean + ! values to fraction-based values. + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Initialize + fl_lsrain(:,:) = 0._wp + fl_lssnow(:,:) = 0._wp + fl_lsgrpl(:,:) = 0._wp + fl_ccrain(:,:) = 0._wp + fl_ccsnow(:,:) = 0._wp + do k=1,nLevels + do j=1,nPoints + ! In-cloud mixing ratios. + if (frac_ls(j,k) .ne. 0.) then + mr_hydro(j,:,k,I_LSCLIQ) = mr_hydro(j,:,k,I_LSCLIQ)/frac_ls(j,k) + mr_hydro(j,:,k,I_LSCICE) = mr_hydro(j,:,k,I_LSCICE)/frac_ls(j,k) + endif + if (frac_cv(j,k) .ne. 0.) then + mr_hydro(j,:,k,I_CVCLIQ) = mr_hydro(j,:,k,I_CVCLIQ)/frac_cv(j,k) + mr_hydro(j,:,k,I_CVCICE) = mr_hydro(j,:,k,I_CVCICE)/frac_cv(j,k) + endif + ! Precipitation + if (use_precipitation_fluxes) then + if (prec_ls(j,k) .ne. 0.) then + fl_lsrain(j,k) = fl_lsrainIN(j,k)/prec_ls(j,k) + fl_lssnow(j,k) = fl_lssnowIN(j,k)/prec_ls(j,k) + fl_lsgrpl(j,k) = fl_lsgrplIN(j,k)/prec_ls(j,k) + endif + if (prec_cv(j,k) .ne. 0.) then + fl_ccrain(j,k) = fl_ccrainIN(j,k)/prec_cv(j,k) + fl_ccsnow(j,k) = fl_ccsnowIN(j,k)/prec_cv(j,k) + endif + else + if (prec_ls(j,k) .ne. 0.) then + mr_hydro(j,:,k,I_LSRAIN) = mr_hydro(j,:,k,I_LSRAIN)/prec_ls(j,k) + mr_hydro(j,:,k,I_LSSNOW) = mr_hydro(j,:,k,I_LSSNOW)/prec_ls(j,k) + mr_hydro(j,:,k,I_LSGRPL) = mr_hydro(j,:,k,I_LSGRPL)/prec_ls(j,k) + endif + if (prec_cv(j,k) .ne. 0.) then + mr_hydro(j,:,k,I_CVRAIN) = mr_hydro(j,:,k,I_CVRAIN)/prec_cv(j,k) + mr_hydro(j,:,k,I_CVSNOW) = mr_hydro(j,:,k,I_CVSNOW)/prec_cv(j,k) + endif + endif + enddo + enddo + deallocate(frac_ls,prec_ls,frac_cv,prec_cv) + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Convert precipitation fluxes to mixing ratios + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (use_precipitation_fluxes) then + ! LS rain + call cosp_precip_mxratio(nPoints, nLevels, nColumns, cospstateIN%pfull, & + cospstateIN%at, frac_prec, 1._wp, n_ax(I_LSRAIN), n_bx(I_LSRAIN), & + alpha_x(I_LSRAIN), c_x(I_LSRAIN), d_x(I_LSRAIN), g_x(I_LSRAIN), & + a_x(I_LSRAIN), b_x(I_LSRAIN), gamma_1(I_LSRAIN), gamma_2(I_LSRAIN), & + gamma_3(I_LSRAIN), gamma_4(I_LSRAIN), fl_lsrain, & + mr_hydro(:,:,:,I_LSRAIN), Reff(:,:,:,I_LSRAIN)) + ! LS snow + call cosp_precip_mxratio(nPoints, nLevels, nColumns, cospstateIN%pfull, & + cospstateIN%at, frac_prec, 1._wp, n_ax(I_LSSNOW), n_bx(I_LSSNOW), & + alpha_x(I_LSSNOW), c_x(I_LSSNOW), d_x(I_LSSNOW), g_x(I_LSSNOW), & + a_x(I_LSSNOW), b_x(I_LSSNOW), gamma_1(I_LSSNOW), gamma_2(I_LSSNOW), & + gamma_3(I_LSSNOW), gamma_4(I_LSSNOW), fl_lssnow, & + mr_hydro(:,:,:,I_LSSNOW), Reff(:,:,:,I_LSSNOW)) + ! CV rain + call cosp_precip_mxratio(nPoints, nLevels, nColumns, cospstateIN%pfull, & + cospstateIN%at, frac_prec, 2._wp, n_ax(I_CVRAIN), n_bx(I_CVRAIN), & + alpha_x(I_CVRAIN), c_x(I_CVRAIN), d_x(I_CVRAIN), g_x(I_CVRAIN), & + a_x(I_CVRAIN), b_x(I_CVRAIN), gamma_1(I_CVRAIN), gamma_2(I_CVRAIN), & + gamma_3(I_CVRAIN), gamma_4(I_CVRAIN), fl_ccrain, & + mr_hydro(:,:,:,I_CVRAIN), Reff(:,:,:,I_CVRAIN)) + ! CV snow + call cosp_precip_mxratio(nPoints, nLevels, nColumns, cospstateIN%pfull, & + cospstateIN%at, frac_prec, 2._wp, n_ax(I_CVSNOW), n_bx(I_CVSNOW), & + alpha_x(I_CVSNOW), c_x(I_CVSNOW), d_x(I_CVSNOW), g_x(I_CVSNOW), & + a_x(I_CVSNOW), b_x(I_CVSNOW), gamma_1(I_CVSNOW), gamma_2(I_CVSNOW), & + gamma_3(I_CVSNOW), gamma_4(I_CVSNOW), fl_ccsnow, & + mr_hydro(:,:,:,I_CVSNOW), Reff(:,:,:,I_CVSNOW)) + ! LS groupel. + call cosp_precip_mxratio(nPoints, nLevels, nColumns, cospstateIN%pfull, & + cospstateIN%at, frac_prec, 1._wp, n_ax(I_LSGRPL), n_bx(I_LSGRPL), & + alpha_x(I_LSGRPL), c_x(I_LSGRPL), d_x(I_LSGRPL), g_x(I_LSGRPL), & + a_x(I_LSGRPL), b_x(I_LSGRPL), gamma_1(I_LSGRPL), gamma_2(I_LSGRPL), & + gamma_3(I_LSGRPL), gamma_4(I_LSGRPL), fl_lsgrpl, & + mr_hydro(:,:,:,I_LSGRPL), Reff(:,:,:,I_LSGRPL)) + deallocate(frac_prec) + endif + + else + cospIN%frac_out(:,:,:) = 1 + allocate(mr_hydro(nPoints,1,nLevels,nHydro),Reff(nPoints,1,nLevels,nHydro), & + Np(nPoints,1,nLevels,nHydro)) + mr_hydro(:,1,:,I_LSCLIQ) = mr_lsliq + mr_hydro(:,1,:,I_LSCICE) = mr_lsice + mr_hydro(:,1,:,I_CVCLIQ) = mr_ccliq + mr_hydro(:,1,:,I_CVCICE) = mr_ccice + Reff(:,1,:,:) = ReffIN + endif + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! 11 micron emissivity + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (Lisccp) then + call cosp_simulator_optics(nPoints,nColumns,nLevels,cospIN%frac_out,dem_c,dem_s, & + cospIN%emiss_11) + endif + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! 0.67 micron optical depth + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (Lisccp .or. Lmisr .or. Lmodis) then + call cosp_simulator_optics(nPoints,nColumns,nLevels,cospIN%frac_out,dtau_c,dtau_s, & + cospIN%tau_067) + endif + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! LIDAR Polarized optics + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (Lcalipso) then + call lidar_optics(nPoints, nColumns, nLevels, 4, lidar_ice_type, 532, .false., & + mr_hydro(:,:,:,I_LSCLIQ), mr_hydro(:,:,:,I_LSCICE), mr_hydro(:,:,:,I_CVCLIQ), & + mr_hydro(:,:,:,I_CVCICE), ReffIN(:,:,I_LSCLIQ), ReffIN(:,:,I_LSCICE), & + ReffIN(:,:,I_CVCLIQ), ReffIN(:,:,I_CVCICE), cospstateIN%pfull, & + cospstateIN%phalf, cospstateIN%at, cospIN%beta_mol_calipso, & + cospIN%betatot_calipso, cospIN%tau_mol_calipso, cospIN%tautot_calipso, & + cospIN%tautot_S_liq, cospIN%tautot_S_ice, cospIN%betatot_ice_calipso, & + cospIN%betatot_liq_calipso, cospIN%tautot_ice_calipso, cospIN%tautot_liq_calipso) + endif + + if (LgrLidar532) then + call lidar_optics(nPoints, nColumns, nLevels, 4, lidar_ice_type, 532, .true., & + mr_hydro(:,:,:,I_LSCLIQ), mr_hydro(:,:,:,I_LSCICE), mr_hydro(:,:,:,I_CVCLIQ), & + mr_hydro(:,:,:,I_CVCICE), ReffIN(:,:,I_LSCLIQ), ReffIN(:,:,I_LSCICE), & + ReffIN(:,:,I_CVCLIQ), ReffIN(:,:,I_CVCICE), cospstateIN%pfull, & + cospstateIN%phalf, cospstateIN%at, cospIN%beta_mol_grLidar532, & + cospIN%betatot_grLidar532, cospIN%tau_mol_grLidar532, cospIN%tautot_grLidar532) + endif + + if (Latlid) then + call lidar_optics(nPoints, nColumns, nLevels, 4, lidar_ice_type, 355, .false., & + mr_hydro(:,:,:,I_LSCLIQ), mr_hydro(:,:,:,I_LSCICE), mr_hydro(:,:,:,I_CVCLIQ), & + mr_hydro(:,:,:,I_CVCICE), ReffIN(:,:,I_LSCLIQ), ReffIN(:,:,I_LSCICE), & + ReffIN(:,:,I_CVCLIQ), ReffIN(:,:,I_CVCICE), cospstateIN%pfull, & + cospstateIN%phalf, cospstateIN%at, cospIN%beta_mol_atlid, cospIN%betatot_atlid,& + cospIN%tau_mol_atlid, cospIN%tautot_atlid) + endif + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! CLOUDSAT RADAR OPTICS + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (lcloudsat) then + + ! Compute gaseous absorption (assume identical for each subcolun) + allocate(g_vol(nPoints,nLevels)) + g_vol(:,:)=0._wp + do i=1,nPoints + do j=1,nLevels + if (rcfg_cloudsat%use_gas_abs == 1 .or. (rcfg_cloudsat%use_gas_abs == 2 .and. j .eq. 1)) then + g_vol(i,j) = gases(cospstateIN%pfull(i,j), cospstateIN%at(i,j),cospstateIN%qv(i,j),rcfg_cloudsat%freq) + endif + cospIN%g_vol_cloudsat(i,:,j)=g_vol(i,j) + end do + end do + + ! Loop over all subcolumns + allocate(fracPrecipIce(nPoints,nColumns,nLevels)) + fracPrecipIce(:,:,:) = 0._wp + do k=1,nColumns + call quickbeam_optics(sd, rcfg_cloudsat, nPoints, nLevels, R_UNDEF, & + mr_hydro(:,k,:,1:nHydro)*1000._wp, Reff(:,k,:,1:nHydro)*1.e6_wp,& + Np(:,k,:,1:nHydro), cospstateIN%pfull, cospstateIN%at, & + cospstateIN%qv, cospIN%z_vol_cloudsat(1:nPoints,k,:), & + cospIN%kr_vol_cloudsat(1:nPoints,k,:)) + + ! At each model level, what fraction of the precipitation is frozen? + where(mr_hydro(:,k,:,I_LSRAIN) .gt. 0 .or. mr_hydro(:,k,:,I_LSSNOW) .gt. 0 .or. & + mr_hydro(:,k,:,I_CVRAIN) .gt. 0 .or. mr_hydro(:,k,:,I_CVSNOW) .gt. 0 .or. & + mr_hydro(:,k,:,I_LSGRPL) .gt. 0) + fracPrecipIce(:,k,:) = (mr_hydro(:,k,:,I_LSSNOW) + mr_hydro(:,k,:,I_CVSNOW) + & + mr_hydro(:,k,:,I_LSGRPL)) / & + (mr_hydro(:,k,:,I_LSSNOW) + mr_hydro(:,k,:,I_CVSNOW) + mr_hydro(:,k,:,I_LSGRPL) + & + mr_hydro(:,k,:,I_LSRAIN) + mr_hydro(:,k,:,I_CVRAIN)) + elsewhere + fracPrecipIce(:,k,:) = 0._wp + endwhere + enddo + + ! Regrid frozen fraction to Cloudsat/Calipso statistical grid + if (use_vgrid) then + allocate(fracPrecipIce_statGrid(nPoints,nColumns,Nlvgrid_local)) + fracPrecipIce_statGrid(:,:,:) = 0._wp + call cosp_change_vertical_grid(Npoints, Ncolumns, Nlevels, cospstateIN%hgt_matrix(:,Nlevels:1:-1), & + cospstateIN%hgt_matrix_half(:,Nlevels:1:-1), fracPrecipIce(:,:,Nlevels:1:-1), Nlvgrid_local, & + vgrid_zl(Nlvgrid_local:1:-1), vgrid_zu(Nlvgrid_local:1:-1), fracPrecipIce_statGrid(:,:,Nlvgrid_local:1:-1)) + + ! Find proper layer above de surface elevation to compute precip flags in Cloudsat/Calipso statistical grid + allocate(cloudsat_preclvl_index(nPoints)) + cloudsat_preclvl_index(:) = 0._wp + ! Compute the zstep distance between two atmopsheric layers + zstep = vgrid_zl(1)-vgrid_zl(2) + ! Computing altitude index for precip flags calculation (one layer above surfelev layer) + cloudsat_preclvl_index(:) = cloudsat_preclvl - floor( cospstateIN%surfelev(:)/zstep ) + + ! For near-surface diagnostics, we only need the frozen fraction at one layer. + do i=1,nPoints + cospIN%fracPrecipIce(i,:) = fracPrecipIce_statGrid(i,:,cloudsat_preclvl_index(i)) + enddo + deallocate(cloudsat_preclvl_index) + deallocate(fracPrecipIce_statGrid) + endif + + endif + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! MODIS optics + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (Lmodis) then + allocate(MODIS_cloudWater(nPoints,nColumns,nLevels), & + MODIS_cloudIce(nPoints,nColumns,nLevels), & + MODIS_waterSize(nPoints,nColumns,nLevels), & + MODIS_iceSize(nPoints,nColumns,nLevels), & + MODIS_opticalThicknessLiq(nPoints,nColumns,nLevels), & + MODIS_opticalThicknessIce(nPoints,nColumns,nLevels)) + ! Cloud water + call cosp_simulator_optics(nPoints,nColumns,nLevels,cospIN%frac_out, & + mr_hydro(:,:,:,I_CVCLIQ),mr_hydro(:,:,:,I_LSCLIQ),MODIS_cloudWater) + ! Cloud ice + call cosp_simulator_optics(nPoints,nColumns,nLevels,cospIN%frac_out, & + mr_hydro(:,:,:,I_CVCICE),mr_hydro(:,:,:,I_LSCICE),MODIS_cloudIce) + ! Water droplet size + call cosp_simulator_optics(nPoints,nColumns,nLevels,cospIN%frac_out, & + Reff(:,:,:,I_CVCLIQ),Reff(:,:,:,I_LSCLIQ),MODIS_waterSize) + ! Ice crystal size + call cosp_simulator_optics(nPoints,nColumns,nLevels,cospIN%frac_out, & + Reff(:,:,:,I_CVCICE),Reff(:,:,:,I_LSCICE),MODIS_iceSize) + + ! Partition optical thickness into liquid and ice parts + call modis_optics_partition(nPoints, nLevels, nColumns, MODIS_cloudWater, & + MODIS_cloudIce, MODIS_waterSize, MODIS_iceSize, cospIN%tau_067, & + MODIS_opticalThicknessLiq, MODIS_opticalThicknessIce) + + ! Compute assymetry parameter and single scattering albedo + call modis_optics(nPoints, nLevels, nColumns, MODIS_opticalThicknessLiq, & + MODIS_waterSize*1.0e6_wp, MODIS_opticalThicknessIce, & + MODIS_iceSize*1.0e6_wp, cospIN%fracLiq, cospIN%asym, cospIN%ss_alb) + + ! Deallocate memory + deallocate(MODIS_cloudWater,MODIS_cloudIce,MODIS_WaterSize,MODIS_iceSize, & + MODIS_opticalThicknessLiq,MODIS_opticalThicknessIce,mr_hydro, & + Np,Reff) + endif + end subroutine subsample_and_optics + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE construct_cospIN + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + subroutine construct_cospIN(npoints,ncolumns,nlevels,ninst_rttov,y,emis_grey) + ! Inputs + integer,intent(in) :: & + npoints, & ! Number of horizontal gridpoints + ncolumns, & ! Number of subcolumns + nlevels, & ! Number of vertical levels + ninst_rttov ! Number of RTTOV instruments + ! Outputs + type(cosp_optical_inputs),intent(out) :: y + ! Optional input + real(kind=wp),intent(in),target, optional :: & + emis_grey + + ! Dimensions + y%Npoints = Npoints + y%Ncolumns = Ncolumns + y%Nlevels = Nlevels + y%Ninst_rttov = Ninst_rttov + y%Npart = 4 + y%Nrefl = PARASOL_NREFL + allocate(y%frac_out(npoints, ncolumns,nlevels)) + + if (present(emis_grey)) y%emis_grey => emis_grey + + if (Lmodis .or. Lmisr .or. Lisccp) then + allocate(y%tau_067(npoints, ncolumns,nlevels),& + y%emiss_11(npoints, ncolumns,nlevels)) + endif + if (Lcalipso) then + allocate(y%betatot_calipso(npoints, ncolumns,nlevels),& + y%betatot_ice_calipso(npoints, ncolumns,nlevels),& + y%betatot_liq_calipso(npoints, ncolumns,nlevels),& + y%tautot_calipso(npoints, ncolumns,nlevels),& + y%tautot_ice_calipso(npoints, ncolumns,nlevels),& + y%tautot_liq_calipso(npoints, ncolumns,nlevels),& + y%beta_mol_calipso(npoints, nlevels),& + y%tau_mol_calipso(npoints, nlevels),& + y%tautot_S_ice(npoints, ncolumns ),& + y%tautot_S_liq(npoints, ncolumns )) + endif + + if (LgrLidar532) then + allocate(y%beta_mol_grLidar532(npoints, nlevels),& + y%betatot_grLidar532(npoints, ncolumns,nlevels),& + y%tau_mol_grLidar532(npoints, nlevels),& + y%tautot_grLidar532(npoints, ncolumns,nlevels)) + endif + + if (Latlid) then + allocate(y%beta_mol_atlid(npoints, nlevels),& + y%betatot_atlid(npoints, ncolumns,nlevels),& + y%tau_mol_atlid(npoints, nlevels),& + y%tautot_atlid(npoints, ncolumns,nlevels)) + endif + + if (Lcloudsat) then + allocate(y%z_vol_cloudsat(npoints, ncolumns,nlevels),& + y%kr_vol_cloudsat(npoints, ncolumns,nlevels),& + y%g_vol_cloudsat(npoints, ncolumns,nlevels),& + y%fracPrecipIce(npoints, ncolumns)) + endif + if (Lmodis) then + allocate(y%fracLiq(npoints, ncolumns,nlevels),& + y%asym(npoints, ncolumns,nlevels),& + y%ss_alb(npoints, ncolumns,nlevels)) + endif + + end subroutine construct_cospIN + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE construct_cospstateIN + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + subroutine construct_cospstateIN(npoints,nlevels,y) + ! Inputs + integer,intent(in) :: & + npoints, & ! Number of horizontal gridpoints + nlevels ! Number of vertical levels + + ! Outputs + type(cosp_column_inputs),intent(out) :: y + + allocate(y%sunlit(npoints),y%skt(npoints),y%land(npoints),y%at(npoints,nlevels), & + y%psfc(npoints), & + y%pfull(npoints,nlevels),y%phalf(npoints,nlevels+1),y%qv(npoints,nlevels), & + y%o3(npoints,nlevels),y%hgt_matrix(npoints,nlevels),y%u_sfc(npoints), & + y%v_sfc(npoints),y%lat(npoints),y%lon(nPoints),y%rttov_sfcmask(nPoints), & + y%co(npoints,nlevels),y%n2o(npoints,nlevels),y%ch4(npoints,nlevels), & + y%co2(npoints,nlevels), y%so2(npoints,nlevels), & + y%cloudIce(nPoints,nLevels),y%cloudLiq(nPoints,nLevels),y%surfelev(nPoints),& + y%DeffLiq(nPoints,nLevels),y%DeffIce(nPoints,nLevels), & + y%fl_snow(nPoints,nLevels),y%fl_rain(nPoints,nLevels), & + y%tca(nPoints,nLevels),y%hgt_matrix_half(nPoints,nlevels), & + y%rttov_date(nPoints,3),y%rttov_time(nPoints,3),y%sza(nPoints)) + + + end subroutine construct_cospstateIN + + ! ###################################################################################### + ! SUBROUTINE construct_cosp_outputs + ! + ! This subroutine allocates output fields based on input logical flag switches. + ! ###################################################################################### + subroutine construct_cosp_outputs(Lpctisccp,Lclisccp,& + Lboxptopisccp,Lboxtauisccp,Ltauisccp,Lcltisccp, & + Lmeantbisccp,Lmeantbclrisccp,Lalbisccp,LclMISR, & + Lcltmodis,Lclwmodis,Lclimodis,Lclhmodis,Lclmmodis, & + Lcllmodis,Ltautmodis,Ltauwmodis,Ltauimodis, & + Ltautlogmodis,Ltauwlogmodis,Ltauilogmodis, & + Lreffclwmodis,Lreffclimodis,Lpctmodis,Llwpmodis, & + Liwpmodis,Lclmodis,Latb532,Latb532gr,Latb355, & + LlidarBetaMol532,LlidarBetaMol532gr,LlidarBetaMol355,& + LcfadLidarsr532,LcfadLidarsr532gr,LcfadLidarsr355, & + Lclcalipso2,Lclcalipso,LclgrLidar532,Lclatlid, & + Lclhcalipso,Lcllcalipso,Lclmcalipso,Lcltcalipso, & + LclhgrLidar532,LcllgrLidar532,LclmgrLidar532, & + LcltgrLidar532,Lclhatlid,Lcllatlid,Lclmatlid, & + Lcltatlid,Lcltlidarradar,Lcloudsat_tcc, & + Lcloudsat_tcc2,Lclcalipsoliq, & + Lclcalipsoice,Lclcalipsoun,Lclcalipsotmp, & + Lclcalipsotmpliq,Lclcalipsotmpice,Lclcalipsotmpun, & + Lcltcalipsoliq,Lcltcalipsoice,Lcltcalipsoun, & + Lclhcalipsoliq,Lclhcalipsoice,Lclhcalipsoun, & + Lclmcalipsoliq,Lclmcalipsoice,Lclmcalipsoun, & + Lcllcalipsoliq,Lcllcalipsoice,Lcllcalipsoun, & + Lclopaquecalipso,Lclthincalipso,Lclzopaquecalipso, & + Lclcalipsoopaque,Lclcalipsothin,Lclcalipsozopaque, & + Lclcalipsoopacity,Lclopaquetemp,Lclthintemp, & + Lclzopaquetemp,Lclopaquemeanz,Lclthinmeanz, & + Lclthinemis,Lclopaquemeanzse,Lclthinmeanzse, & + Lclzopaquecalipsose,LcfadDbze94,Ldbze94,Lparasolrefl,& + Lptradarflag0,Lptradarflag1,Lptradarflag2, & + Lptradarflag3,Lptradarflag4,Lptradarflag5, & + Lptradarflag6,Lptradarflag7,Lptradarflag8, & + Lptradarflag9,Lradarpia,Lwr_occfreq,Lcfodd, & + Ninst_rttov,rttov_configs, & + Npoints,Ncolumns,Nlevels,Nlvgrid,use_vgrid,x) + ! Inputs + logical,intent(in) :: & + Lpctisccp, & ! ISCCP mean cloud top pressure + Lclisccp, & ! ISCCP cloud area fraction + Lboxptopisccp, & ! ISCCP CTP in each column + Lboxtauisccp, & ! ISCCP optical epth in each column + Ltauisccp, & ! ISCCP mean optical depth + Lcltisccp, & ! ISCCP total cloud fraction + Lmeantbisccp, & ! ISCCP mean all-sky 10.5micron brightness temperature + Lmeantbclrisccp, & ! ISCCP mean clear-sky 10.5micron brightness temperature + Lalbisccp, & ! ISCCP mean cloud albedo + LclMISR, & ! MISR cloud fraction + Lcltmodis, & ! MODIS total cloud fraction + Lclwmodis, & ! MODIS liquid cloud fraction + Lclimodis, & ! MODIS ice cloud fraction + Lclhmodis, & ! MODIS high-level cloud fraction + Lclmmodis, & ! MODIS mid-level cloud fraction + Lcllmodis, & ! MODIS low-level cloud fraction + Ltautmodis, & ! MODIS total cloud optical thicknes + Ltauwmodis, & ! MODIS liquid optical thickness + Ltauimodis, & ! MODIS ice optical thickness + Ltautlogmodis, & ! MODIS total cloud optical thickness (log10 mean) + Ltauwlogmodis, & ! MODIS liquid optical thickness (log10 mean) + Ltauilogmodis, & ! MODIS ice optical thickness (log10 mean) + Lreffclwmodis, & ! MODIS liquid cloud particle size + Lreffclimodis, & ! MODIS ice particle size + Lpctmodis, & ! MODIS cloud top pressure + Llwpmodis, & ! MODIS cloud liquid water path + Liwpmodis, & ! MODIS cloud ice water path + Lclmodis, & ! MODIS cloud area fraction + Latb532, & ! CALIPSO attenuated total backscatter (532nm) + Latb532gr, & ! GROUND LIDAR @ 532NM attenuated total backscatter (532nm) + Latb355, & ! ATLID attenuated total backscatter (355nm) + LlidarBetaMol532, & ! CALIPSO molecular backscatter (532nm) + LlidarBetaMol532gr,&! GROUND LIDAR @ 532NM molecular backscatter (532nm) + LlidarBetaMol355, & ! ATLID molecular backscatter (355nm) + LcfadLidarsr532, & ! CALIPSO scattering ratio CFAD + LcfadLidarsr532gr,& ! GROUND LIDAR @ 532NM scattering ratio CFAD + LcfadLidarsr355, & ! ATLID scattering ratio CFAD + Lclcalipso2, & ! CALIPSO cloud fraction undetected by cloudsat + Lclcalipso, & ! CALIPSO cloud area fraction + LclgrLidar532, & ! GROUND LIDAR @ 532NM cloud area fraction + Lclatlid, & ! ATLID cloud area fraction + Lclhcalipso, & ! CALIPSO high-level cloud fraction + Lcllcalipso, & ! CALIPSO low-level cloud fraction + Lclmcalipso, & ! CALIPSO mid-level cloud fraction + Lcltcalipso, & ! CALIPSO total cloud fraction + LclhgrLidar532, & ! GROUND LIDAR @ 532NM high-level cloud fraction + LcllgrLidar532, & ! GROUND LIDAR @ 532NM low-level cloud fraction + LclmgrLidar532, & ! GROUND LIDAR @ 532NM mid-level cloud fraction + LcltgrLidar532, & ! GROUND LIDAR @ 532NM total cloud fraction + Lclhatlid, & ! ATLID high-level cloud fraction + Lcllatlid, & ! ATLID low-level cloud fraction + Lclmatlid, & ! ATLID mid-level cloud fraction + Lcltatlid, & ! ATLID total cloud fraction + Lcltlidarradar, & ! CALIPSO-CLOUDSAT total cloud fraction + Lcloudsat_tcc, & ! + Lcloudsat_tcc2, & ! + Lclcalipsoliq, & ! CALIPSO liquid cloud area fraction + Lclcalipsoice, & ! CALIPSO ice cloud area fraction + Lclcalipsoun, & ! CALIPSO undetected cloud area fraction + Lclcalipsotmp, & ! CALIPSO undetected cloud area fraction + Lclcalipsotmpliq, & ! CALIPSO liquid cloud area fraction + Lclcalipsotmpice, & ! CALIPSO ice cloud area fraction + Lclcalipsotmpun, & ! CALIPSO undetected cloud area fraction + Lcltcalipsoliq, & ! CALIPSO liquid total cloud fraction + Lcltcalipsoice, & ! CALIPSO ice total cloud fraction + Lcltcalipsoun, & ! CALIPSO undetected total cloud fraction + Lclhcalipsoliq, & ! CALIPSO high-level liquid cloud fraction + Lclhcalipsoice, & ! CALIPSO high-level ice cloud fraction + Lclhcalipsoun, & ! CALIPSO high-level undetected cloud fraction + Lclmcalipsoliq, & ! CALIPSO mid-level liquid cloud fraction + Lclmcalipsoice, & ! CALIPSO mid-level ice cloud fraction + Lclmcalipsoun, & ! CALIPSO mid-level undetected cloud fraction + Lcllcalipsoliq, & ! CALIPSO low-level liquid cloud fraction + Lcllcalipsoice, & ! CALIPSO low-level ice cloud fraction + Lcllcalipsoun, & ! CALIPSO low-level undetected cloud fraction + Lclopaquecalipso, & ! CALIPSO opaque cloud cover (2D Map) + Lclthincalipso, & ! CALIPSO thin cloud cover (2D Map) + Lclzopaquecalipso,& ! CALIPSO z_opaque altitude (opaque clouds only, 2D Map) + Lclcalipsoopaque, & ! CALIPSO opaque cloud profiles 3D fraction + Lclcalipsothin, & ! CALIPSO thin cloud profiles 3D fraction + Lclcalipsozopaque,& ! CALIPSO z_opaque 3D fraction + Lclcalipsoopacity,& ! CALIPSO opacity 3D fraction + Lclopaquetemp, & ! CALIPSO opaque cloud temperature + Lclthintemp, & ! CALIPSO thin cloud temperature + Lclzopaquetemp, & ! CALIPSO z_opaque temperature + Lclopaquemeanz, & ! CALIPSO opaque cloud altitude + Lclthinmeanz, & ! CALIPSO thin cloud altitude + Lclthinemis, & ! CALIPSO thin cloud emissivity + Lclopaquemeanzse, & ! CALIPSO opaque cloud altitude with respect to SE + Lclthinmeanzse, & ! CALIPSO thin cloud altitude with respect to SE + Lclzopaquecalipsose,& ! CALIPSO z_opaque altitude with respect to SE + LcfadDbze94, & ! CLOUDSAT radar reflectivity CFAD + Ldbze94, & ! CLOUDSAT radar reflectivity + LparasolRefl, & ! PARASOL reflectance + Lptradarflag0, & ! CLOUDSAT + Lptradarflag1, & ! CLOUDSAT + Lptradarflag2, & ! CLOUDSAT + Lptradarflag3, & ! CLOUDSAT + Lptradarflag4, & ! CLOUDSAT + Lptradarflag5, & ! CLOUDSAT + Lptradarflag6, & ! CLOUDSAT + Lptradarflag7, & ! CLOUDSAT + Lptradarflag8, & ! CLOUDSAT + Lptradarflag9, & ! CLOUDSAT + Lradarpia, & ! CLOUDSAT + Lwr_occfreq, & ! CloudSat+MODIS joint diagnostics + Lcfodd, & ! CloudSat+MODIS joint diagnostics + use_vgrid + + integer,intent(in) :: & + Npoints, & ! Number of sampled points + Ncolumns, & ! Number of subgrid columns + Nlevels, & ! Number of model levels + Nlvgrid, & ! Number of levels in L3 stats computation + Ninst_rttov + + type(rttov_cfg), dimension(:),intent(in) :: & + rttov_configs + + ! Outputs + type(cosp_outputs),intent(out) :: & + x ! COSP output structure + + integer :: & + i + + ! ISCCP simulator outputs + if (Lboxtauisccp) allocate(x%isccp_boxtau(Npoints,Ncolumns)) + if (Lboxptopisccp) allocate(x%isccp_boxptop(Npoints,Ncolumns)) + if (Lclisccp) allocate(x%isccp_fq(Npoints,numISCCPTauBins,numISCCPPresBins)) + if (Lcltisccp) allocate(x%isccp_totalcldarea(Npoints)) + if (Lpctisccp) allocate(x%isccp_meanptop(Npoints)) + if (Ltauisccp) allocate(x%isccp_meantaucld(Npoints)) + if (Lmeantbisccp) allocate(x%isccp_meantb(Npoints)) + if (Lmeantbclrisccp) allocate(x%isccp_meantbclr(Npoints)) + if (Lalbisccp) allocate(x%isccp_meanalbedocld(Npoints)) + + ! MISR simulator + if (LclMISR) then + allocate(x%misr_fq(Npoints,numMISRTauBins,numMISRHgtBins)) + ! *NOTE* These 3 fields are not output, but were part of the v1.4.0 cosp_misr, so + ! they are still computed. Should probably have a logical to control these + ! outputs. + allocate(x%misr_dist_model_layertops(Npoints,numMISRHgtBins)) + allocate(x%misr_meanztop(Npoints)) + allocate(x%misr_cldarea(Npoints)) + endif + + ! MODIS simulator + if (Lcltmodis) allocate(x%modis_Cloud_Fraction_Total_Mean(Npoints)) + if (Lclwmodis) allocate(x%modis_Cloud_Fraction_Water_Mean(Npoints)) + if (Lclimodis) allocate(x%modis_Cloud_Fraction_Ice_Mean(Npoints)) + if (Lclhmodis) allocate(x%modis_Cloud_Fraction_High_Mean(Npoints)) + if (Lclmmodis) allocate(x%modis_Cloud_Fraction_Mid_Mean(Npoints)) + if (Lcllmodis) allocate(x%modis_Cloud_Fraction_Low_Mean(Npoints)) + if (Ltautmodis) allocate(x%modis_Optical_Thickness_Total_Mean(Npoints)) + if (Ltauwmodis) allocate(x%modis_Optical_Thickness_Water_Mean(Npoints)) + if (Ltauimodis) allocate(x%modis_Optical_Thickness_Ice_Mean(Npoints)) + if (Ltautlogmodis) allocate(x%modis_Optical_Thickness_Total_LogMean(Npoints)) + if (Ltauwlogmodis) allocate(x%modis_Optical_Thickness_Water_LogMean(Npoints)) + if (Ltauilogmodis) allocate(x%modis_Optical_Thickness_Ice_LogMean(Npoints)) + if (Lreffclwmodis) allocate(x%modis_Cloud_Particle_Size_Water_Mean(Npoints)) + if (Lreffclimodis) allocate(x%modis_Cloud_Particle_Size_Ice_Mean(Npoints)) + if (Lpctmodis) allocate(x%modis_Cloud_Top_Pressure_Total_Mean(Npoints)) + if (Llwpmodis) allocate(x%modis_Liquid_Water_Path_Mean(Npoints)) + if (Liwpmodis) allocate(x%modis_Ice_Water_Path_Mean(Npoints)) + if (Lclmodis) then + allocate(x%modis_Optical_Thickness_vs_Cloud_Top_Pressure(nPoints,numModisTauBins,numMODISPresBins)) + allocate(x%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(nPoints,numModisTauBins,numMODISPresBins)) + allocate(x%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(nPoints,numModisTauBins,numMODISPresBins)) + allocate(x%modis_Optical_thickness_vs_ReffLIQ(nPoints,numMODISTauBins,numMODISReffLiqBins)) + allocate(x%modis_Optical_Thickness_vs_ReffICE(nPoints,numMODISTauBins,numMODISReffIceBins)) + endif + + ! LIDAR simulator + if (LlidarBetaMol532) allocate(x%calipso_beta_mol(Npoints,Nlevels)) + if (Latb532) allocate(x%calipso_beta_tot(Npoints,Ncolumns,Nlevels)) + if (LcfadLidarsr532) then + allocate(x%calipso_srbval(SR_BINS+1)) + allocate(x%calipso_cfad_sr(Npoints,SR_BINS,Nlvgrid)) + allocate(x%calipso_betaperp_tot(Npoints,Ncolumns,Nlevels)) + endif + if (Lclcalipso) allocate(x%calipso_lidarcld(Npoints,Nlvgrid)) + if (Lclhcalipso .or. Lclmcalipso .or. Lcllcalipso .or. Lcltcalipso) then + allocate(x%calipso_cldlayer(Npoints,LIDAR_NCAT)) + endif + if (Lclcalipsoice .or. Lclcalipsoliq .or. Lclcalipsoun) then + allocate(x%calipso_lidarcldphase(Npoints,Nlvgrid,6)) + endif + if (Lclcalipsotmp .or. Lclcalipsotmpliq .or. Lclcalipsoice .or. Lclcalipsotmpun .or. Lclcalipsotmpice) then + allocate(x%calipso_lidarcldtmp(Npoints,LIDAR_NTEMP,5)) + endif + if (Lcllcalipsoice .or. Lclmcalipsoice .or. Lclhcalipsoice .or. & + Lcltcalipsoice .or. Lcllcalipsoliq .or. Lclmcalipsoliq .or. & + Lclhcalipsoliq .or. Lcltcalipsoliq .or. Lcllcalipsoun .or. & + Lclmcalipsoun .or. Lclhcalipsoun .or. Lcltcalipsoun) then + allocate(x%calipso_cldlayerphase(Npoints,LIDAR_NCAT,6)) + endif + if (Lclopaquecalipso .or. Lclthincalipso .or. Lclzopaquecalipso) then + allocate(x%calipso_cldtype(Npoints,LIDAR_NTYPE)) + endif + if (Lclopaquetemp .or. Lclthintemp .or. Lclzopaquetemp) then + allocate(x%calipso_cldtypetemp(Npoints,LIDAR_NTYPE)) + endif + if (Lclopaquemeanz .or. Lclthinmeanz) then + allocate(x%calipso_cldtypemeanz(Npoints,2)) + endif + if (Lclopaquemeanzse .or. Lclthinmeanzse .or. Lclzopaquecalipsose) then + allocate(x%calipso_cldtypemeanzse(Npoints,3)) + endif + if (Lclthinemis) then + allocate(x%calipso_cldthinemis(Npoints)) + endif + if (Lclcalipsoopaque .or. Lclcalipsothin .or. Lclcalipsozopaque .or. Lclcalipsoopacity) then + allocate(x%calipso_lidarcldtype(Npoints,Nlvgrid,LIDAR_NTYPE+1)) + endif + + ! GROUND LIDAR @ 532NM simulator + if (LlidarBetaMol532gr) allocate(x%grLidar532_beta_mol(Npoints,Nlevels)) + if (Latb532gr) allocate(x%grLidar532_beta_tot(Npoints,Ncolumns,Nlevels)) + if (LcfadLidarsr532gr) then + allocate(x%grLidar532_srbval(SR_BINS+1)) + allocate(x%grLidar532_cfad_sr(Npoints,SR_BINS,Nlvgrid)) + endif + if (LclgrLidar532) allocate(x%grLidar532_lidarcld(Npoints,Nlvgrid)) + if (LclhgrLidar532 .or. LclmgrLidar532 .or. LcllgrLidar532 .or. LcltgrLidar532) then + allocate(x%grLidar532_cldlayer(Npoints,LIDAR_NCAT)) + endif + + ! ATLID simulator + if (LlidarBetaMol355) allocate(x%atlid_beta_mol(Npoints,Nlevels)) + if (Latb355) allocate(x%atlid_beta_tot(Npoints,Ncolumns,Nlevels)) + if (LcfadLidarsr355) then + allocate(x%atlid_srbval(SR_BINS+1)) + allocate(x%atlid_cfad_sr(Npoints,SR_BINS,Nlvgrid)) + endif + if (Lclatlid) allocate(x%atlid_lidarcld(Npoints,Nlvgrid)) + if (Lclhatlid .or. Lclmatlid .or. Lcllatlid .or. Lcltatlid) then + allocate(x%atlid_cldlayer(Npoints,LIDAR_NCAT)) + endif + + ! PARASOL + if (Lparasolrefl) then + allocate(x%parasolPix_refl(Npoints,Ncolumns,PARASOL_NREFL)) + allocate(x%parasolGrid_refl(Npoints,PARASOL_NREFL)) + endif + + ! Cloudsat simulator + if (Ldbze94) allocate(x%cloudsat_Ze_tot(Npoints,Ncolumns,Nlevels)) + if (LcfadDbze94) allocate(x%cloudsat_cfad_ze(Npoints,cloudsat_DBZE_BINS,Nlvgrid)) + if (Lptradarflag0 .or. Lptradarflag1 .or. Lptradarflag2 .or. Lptradarflag3 .or. & + Lptradarflag4 .or. Lptradarflag5 .or. Lptradarflag6 .or. Lptradarflag7 .or. & + Lptradarflag8 .or. Lptradarflag9) then + if (use_vgrid) then + allocate(x%cloudsat_precip_cover(Npoints,cloudsat_DBZE_BINS)) + else + print*,'WARNING: CLOUDSAT Precipitation occurrence diagnostics not available when use_vgrid=FALSE.' + print*,'WARNING: Turning CLOUDSAT Precipitation occurrence diagnostcs OFF' + endif + endif + if (Lradarpia) then + if (use_vgrid) then + allocate(x%cloudsat_pia(Npoints)) + else + print*,'WARNING: CLOUDSAT Precipitation occurrence diagnostics not available when use_vgrid=FALSE.' + print*,'WARNING: Turning CLOUDSAT Precipitation occurrence diagnostcs OFF' + endif + endif + + ! Combined CALIPSO/CLOUDSAT fields + if (Lclcalipso2) allocate(x%lidar_only_freq_cloud(Npoints,Nlvgrid)) + if (Lcltlidarradar) allocate(x%radar_lidar_tcc(Npoints)) + if (Lcloudsat_tcc) allocate(x%cloudsat_tcc(Npoints)) + if (Lcloudsat_tcc2) allocate(x%cloudsat_tcc2(Npoints)) + + ! Joint MODIS/CloudSat Statistics + if (Lwr_occfreq) allocate(x%wr_occfreq_ntotal(Npoints,WR_NREGIME)) + if (Lcfodd) allocate(x%cfodd_ntotal(Npoints,CFODD_NDBZE,CFODD_NICOD,CFODD_NCLASS)) + + ! RTTOV - Allocate output for multiple instruments + ! Do I not need to allocate the number of instruments? Because each rttov output DDT will be a pointer? + if (Lrttov) then + x % Ninst_rttov = Ninst_rttov + allocate(x % rttov_outputs(Ninst_rttov)) ! Need to allocate a pointer? + do i=1,Ninst_rttov + x % rttov_outputs(i) % nchan_out = rttov_configs(i) % nchan_out + if (rttov_configs(i) % Lrttov_pc) then ! Treat PC-RTTOV fields as clear-sky only for now + allocate(x % rttov_outputs(i) % channel_indices(rttov_configs(i) % nchan_out)) + if (rttov_configs(i) % Lrttov_bt) then ! Brightness temp + allocate(x % rttov_outputs(i) % bt_total_pc(Npoints,rttov_configs(i) % nchan_out)) + ! if (Lrttov_cld .or. Lrttov_aer) allocate(x%rttov_bt_clear(Npoints,Nchan)) + end if + if (rttov_configs(i) % Lrttov_rad) then ! Radiance + allocate(x % rttov_outputs(i) % rad_total_pc(Npoints,rttov_configs(i) % nchan_out)) + ! if (Lrttov_cld .or. Lrttov_aer) allocate(x%rttov_rad_clear(Npoints,Nchan)) + ! if (Lrttov_cld .or. Lrttov_aer) allocate(x%rttov_rad_cloudy(Npoints,Nchan)) + end if + else + allocate(x % rttov_outputs(i) % channel_indices(rttov_configs(i) % nchan_out)) + if (rttov_configs(i) % Lrttov_bt) then ! Brightness temp + allocate(x % rttov_outputs(i) % bt_total(Npoints,rttov_configs(i) % nchan_out)) + if ((rttov_configs(i) % Lrttov_cld) .or. (rttov_configs(i) % Lrttov_aer)) then + allocate(x % rttov_outputs(i) % bt_clear(Npoints,rttov_configs(i) % nchan_out)) + end if + end if + if (rttov_configs(i) % Lrttov_rad) then ! Radiance + allocate(x % rttov_outputs(i) % rad_total(Npoints,rttov_configs(i) % nchan_out)) + if ((rttov_configs(i) % Lrttov_cld) .or. (rttov_configs(i) % Lrttov_aer)) then + allocate(x % rttov_outputs(i) % rad_clear(Npoints,rttov_configs(i) % nchan_out)) + end if + if ((rttov_configs(i) % Lrttov_cld) .or. (rttov_configs(i) % Lrttov_aer)) then + allocate(x % rttov_outputs(i) % rad_cloudy(Npoints,rttov_configs(i) % nchan_out)) + end if + end if + if (rttov_configs(i) % Lrttov_refl) then ! Reflectance + allocate(x % rttov_outputs(i) % refl_total(Npoints,rttov_configs(i) % nchan_out)) + if ((rttov_configs(i) % Lrttov_cld) .or. (rttov_configs(i) % Lrttov_aer)) then + allocate(x % rttov_outputs(i) % refl_clear(Npoints,rttov_configs(i) % nchan_out)) + end if + end if + end if + end do + else + x % Ninst_rttov = 0 + end if + + end subroutine construct_cosp_outputs + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE destroy_cospIN + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + subroutine destroy_cospIN(y) + type(cosp_optical_inputs),intent(inout) :: y + + if (allocated(y%tau_067)) deallocate(y%tau_067) + if (allocated(y%emiss_11)) deallocate(y%emiss_11) + if (allocated(y%frac_out)) deallocate(y%frac_out) + if (allocated(y%beta_mol_calipso)) deallocate(y%beta_mol_calipso) + if (allocated(y%tau_mol_calipso)) deallocate(y%tau_mol_calipso) + if (allocated(y%betatot_calipso)) deallocate(y%betatot_calipso) + if (allocated(y%betatot_ice_calipso)) deallocate(y%betatot_ice_calipso) + if (allocated(y%betatot_liq_calipso)) deallocate(y%betatot_liq_calipso) + if (allocated(y%tautot_calipso)) deallocate(y%tautot_calipso) + if (allocated(y%tautot_ice_calipso)) deallocate(y%tautot_ice_calipso) + if (allocated(y%tautot_liq_calipso)) deallocate(y%tautot_liq_calipso) + if (allocated(y%tautot_S_liq)) deallocate(y%tautot_S_liq) + if (allocated(y%tautot_S_ice)) deallocate(y%tautot_S_ice) + if (allocated(y%z_vol_cloudsat)) deallocate(y%z_vol_cloudsat) + if (allocated(y%kr_vol_cloudsat)) deallocate(y%kr_vol_cloudsat) + if (allocated(y%g_vol_cloudsat)) deallocate(y%g_vol_cloudsat) + if (allocated(y%asym)) deallocate(y%asym) + if (allocated(y%ss_alb)) deallocate(y%ss_alb) + if (allocated(y%fracLiq)) deallocate(y%fracLiq) + if (allocated(y%beta_mol_grLidar532)) deallocate(y%beta_mol_grLidar532) + if (allocated(y%betatot_grLidar532)) deallocate(y%betatot_grLidar532) + if (allocated(y%tau_mol_grLidar532)) deallocate(y%tau_mol_grLidar532) + if (allocated(y%tautot_grLidar532)) deallocate(y%tautot_grLidar532) + if (allocated(y%beta_mol_atlid)) deallocate(y%beta_mol_atlid) + if (allocated(y%betatot_atlid)) deallocate(y%betatot_atlid) + if (allocated(y%tau_mol_atlid)) deallocate(y%tau_mol_atlid) + if (allocated(y%tautot_atlid)) deallocate(y%tautot_atlid) + if (allocated(y%fracPrecipIce)) deallocate(y%fracPrecipIce) + if (associated(y%cfg_rttov)) nullify(y%cfg_rttov) + end subroutine destroy_cospIN + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE destroy_cospstateIN + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + subroutine destroy_cospstateIN(y) + type(cosp_column_inputs),intent(inout) :: y + + if (allocated(y%sunlit)) deallocate(y%sunlit) + if (allocated(y%skt)) deallocate(y%skt) + if (allocated(y%psfc)) deallocate(y%psfc) + if (allocated(y%land)) deallocate(y%land) + if (allocated(y%rttov_sfcmask)) deallocate(y%rttov_sfcmask) + if (allocated(y%at)) deallocate(y%at) + if (allocated(y%pfull)) deallocate(y%pfull) + if (allocated(y%phalf)) deallocate(y%phalf) + if (allocated(y%qv)) deallocate(y%qv) + if (allocated(y%hgt_matrix)) deallocate(y%hgt_matrix) + if (allocated(y%hgt_matrix_half)) deallocate(y%hgt_matrix_half) + if (allocated(y%surfelev)) deallocate(y%surfelev) + if (allocated(y%rttov_date)) deallocate(y%rttov_date) + if (allocated(y%rttov_time)) deallocate(y%rttov_time) + if (allocated(y%sza)) deallocate(y%sza) + if (allocated(y%co2)) deallocate(y%co2) + if (allocated(y%ch4)) deallocate(y%ch4) + if (allocated(y%n2o)) deallocate(y%n2o) + if (allocated(y%co)) deallocate(y%co) + if (allocated(y%o3)) deallocate(y%o3) + if (allocated(y%u_sfc)) deallocate(y%u_sfc) + if (allocated(y%v_sfc)) deallocate(y%v_sfc) + if (allocated(y%lat)) deallocate(y%lat) + if (allocated(y%lon)) deallocate(y%lon) + ! if (allocated(y%emis_in)) deallocate(y%emis_in) + ! if (allocated(y%refl_in)) deallocate(y%refl_in) + if (allocated(y%cloudIce)) deallocate(y%cloudIce) + if (allocated(y%cloudLiq)) deallocate(y%cloudLiq) + if (allocated(y%DeffLiq)) deallocate(y%DeffLiq) + if (allocated(y%DeffIce)) deallocate(y%DeffIce) + if (allocated(y%fl_rain)) deallocate(y%fl_rain) + if (allocated(y%fl_snow)) deallocate(y%fl_snow) + if (allocated(y%tca)) deallocate(y%tca) + + end subroutine destroy_cospstateIN + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE destroy_cosp_outputs + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + subroutine destroy_cosp_outputs(y) + type(cosp_outputs),intent(inout) :: y + integer :: i ! Local iterator for RTTOV instruments + + ! Deallocate and nullify + if (associated(y%calipso_beta_mol)) then + deallocate(y%calipso_beta_mol) + nullify(y%calipso_beta_mol) + endif + if (associated(y%calipso_betaperp_tot)) then + deallocate(y%calipso_betaperp_tot) + nullify(y%calipso_betaperp_tot) + endif + if (associated(y%calipso_beta_tot)) then + deallocate(y%calipso_beta_tot) + nullify(y%calipso_beta_tot) + endif + if (associated(y%calipso_lidarcldphase)) then + deallocate(y%calipso_lidarcldphase) + nullify(y%calipso_lidarcldphase) + endif + if (associated(y%calipso_lidarcldtype)) then + deallocate(y%calipso_lidarcldtype) + nullify(y%calipso_lidarcldtype) + endif + if (associated(y%calipso_cldlayerphase)) then + deallocate(y%calipso_cldlayerphase) + nullify(y%calipso_cldlayerphase) + endif + if (associated(y%calipso_lidarcldtmp)) then + deallocate(y%calipso_lidarcldtmp) + nullify(y%calipso_lidarcldtmp) + endif + if (associated(y%calipso_cldlayer)) then + deallocate(y%calipso_cldlayer) + nullify(y%calipso_cldlayer) + endif + if (associated(y%calipso_cldtype)) then + deallocate(y%calipso_cldtype) + nullify(y%calipso_cldtype) + endif + if (associated(y%calipso_cldtypetemp)) then + deallocate(y%calipso_cldtypetemp) + nullify(y%calipso_cldtypetemp) + endif + if (associated(y%calipso_cldtypemeanz)) then + deallocate(y%calipso_cldtypemeanz) + nullify(y%calipso_cldtypemeanz) + endif + if (associated(y%calipso_cldtypemeanzse)) then + deallocate(y%calipso_cldtypemeanzse) + nullify(y%calipso_cldtypemeanzse) + endif + if (associated(y%calipso_cldthinemis)) then + deallocate(y%calipso_cldthinemis) + nullify(y%calipso_cldthinemis) + endif + if (associated(y%calipso_lidarcld)) then + deallocate(y%calipso_lidarcld) + nullify(y%calipso_lidarcld) + endif + if (associated(y%calipso_srbval)) then + deallocate(y%calipso_srbval) + nullify(y%calipso_srbval) + endif + if (associated(y%calipso_cfad_sr)) then + deallocate(y%calipso_cfad_sr) + nullify(y%calipso_cfad_sr) + endif + if (associated(y%grLidar532_beta_mol)) then + deallocate(y%grLidar532_beta_mol) + nullify(y%grLidar532_beta_mol) + endif + if (associated(y%grLidar532_beta_tot)) then + deallocate(y%grLidar532_beta_tot) + nullify(y%grLidar532_beta_tot) + endif + if (associated(y%grLidar532_cldlayer)) then + deallocate(y%grLidar532_cldlayer) + nullify(y%grLidar532_cldlayer) + endif + if (associated(y%grLidar532_lidarcld)) then + deallocate(y%grLidar532_lidarcld) + nullify(y%grLidar532_lidarcld) + endif + if (associated(y%grLidar532_cfad_sr)) then + deallocate(y%grLidar532_cfad_sr) + nullify(y%grLidar532_cfad_sr) + endif + if (associated(y%grLidar532_srbval)) then + deallocate(y%grLidar532_srbval) + nullify(y%grLidar532_srbval) + endif + if (associated(y%atlid_beta_mol)) then + deallocate(y%atlid_beta_mol) + nullify(y%atlid_beta_mol) + endif + if (associated(y%atlid_beta_tot)) then + deallocate(y%atlid_beta_tot) + nullify(y%atlid_beta_tot) + endif + if (associated(y%atlid_cldlayer)) then + deallocate(y%atlid_cldlayer) + nullify(y%atlid_cldlayer) + endif + if (associated(y%atlid_lidarcld)) then + deallocate(y%atlid_lidarcld) + nullify(y%atlid_lidarcld) + endif + if (associated(y%atlid_cfad_sr)) then + deallocate(y%atlid_cfad_sr) + nullify(y%atlid_cfad_sr) + endif + if (associated(y%atlid_srbval)) then + deallocate(y%atlid_srbval) + nullify(y%atlid_srbval) + endif + if (associated(y%parasolPix_refl)) then + deallocate(y%parasolPix_refl) + nullify(y%parasolPix_refl) + endif + if (associated(y%parasolGrid_refl)) then + deallocate(y%parasolGrid_refl) + nullify(y%parasolGrid_refl) + endif + if (associated(y%cloudsat_Ze_tot)) then + deallocate(y%cloudsat_Ze_tot) + nullify(y%cloudsat_Ze_tot) + endif + if (associated(y%cloudsat_cfad_ze)) then + deallocate(y%cloudsat_cfad_ze) + nullify(y%cloudsat_cfad_ze) + endif + if (associated(y%cloudsat_precip_cover)) then + deallocate(y%cloudsat_precip_cover) + nullify(y%cloudsat_precip_cover) + endif + if (associated(y%cloudsat_pia)) then + deallocate(y%cloudsat_pia) + nullify(y%cloudsat_pia) + endif + if (associated(y%cloudsat_tcc)) then + deallocate(y%cloudsat_tcc) + nullify(y%cloudsat_tcc) + endif + if (associated(y%cloudsat_tcc2)) then + deallocate(y%cloudsat_tcc2) + nullify(y%cloudsat_tcc2) + endif + if (associated(y%radar_lidar_tcc)) then + deallocate(y%radar_lidar_tcc) + nullify(y%radar_lidar_tcc) + endif + if (associated(y%cloudsat_tcc)) then + deallocate(y%cloudsat_tcc) + nullify(y%cloudsat_tcc) + endif + if (associated(y%cloudsat_tcc2)) then + deallocate(y%cloudsat_tcc2) + nullify(y%cloudsat_tcc2) + endif + if (associated(y%lidar_only_freq_cloud)) then + deallocate(y%lidar_only_freq_cloud) + nullify(y%lidar_only_freq_cloud) + endif + if (associated(y%isccp_totalcldarea)) then + deallocate(y%isccp_totalcldarea) + nullify(y%isccp_totalcldarea) + endif + if (associated(y%isccp_meantb)) then + deallocate(y%isccp_meantb) + nullify(y%isccp_meantb) + endif + if (associated(y%isccp_meantbclr)) then + deallocate(y%isccp_meantbclr) + nullify(y%isccp_meantbclr) + endif + if (associated(y%isccp_meanptop)) then + deallocate(y%isccp_meanptop) + nullify(y%isccp_meanptop) + endif + if (associated(y%isccp_meantaucld)) then + deallocate(y%isccp_meantaucld) + nullify(y%isccp_meantaucld) + endif + if (associated(y%isccp_meanalbedocld)) then + deallocate(y%isccp_meanalbedocld) + nullify(y%isccp_meanalbedocld) + endif + if (associated(y%isccp_boxtau)) then + deallocate(y%isccp_boxtau) + nullify(y%isccp_boxtau) + endif + if (associated(y%isccp_boxptop)) then + deallocate(y%isccp_boxptop) + nullify(y%isccp_boxptop) + endif + if (associated(y%isccp_fq)) then + deallocate(y%isccp_fq) + nullify(y%isccp_fq) + endif + if (associated(y%misr_fq)) then + deallocate(y%misr_fq) + nullify(y%misr_fq) + endif + if (associated(y%misr_dist_model_layertops)) then + deallocate(y%misr_dist_model_layertops) + nullify(y%misr_dist_model_layertops) + endif + if (associated(y%misr_meanztop)) then + deallocate(y%misr_meanztop) + nullify(y%misr_meanztop) + endif + if (associated(y%misr_cldarea)) then + deallocate(y%misr_cldarea) + nullify(y%misr_cldarea) + endif + if (associated(y%modis_Cloud_Fraction_Total_Mean)) then + deallocate(y%modis_Cloud_Fraction_Total_Mean) + nullify(y%modis_Cloud_Fraction_Total_Mean) + endif + if (associated(y%modis_Cloud_Fraction_Ice_Mean)) then + deallocate(y%modis_Cloud_Fraction_Ice_Mean) + nullify(y%modis_Cloud_Fraction_Ice_Mean) + endif + if (associated(y%modis_Cloud_Fraction_Water_Mean)) then + deallocate(y%modis_Cloud_Fraction_Water_Mean) + nullify(y%modis_Cloud_Fraction_Water_Mean) + endif + if (associated(y%modis_Cloud_Fraction_High_Mean)) then + deallocate(y%modis_Cloud_Fraction_High_Mean) + nullify(y%modis_Cloud_Fraction_High_Mean) + endif + if (associated(y%modis_Cloud_Fraction_Mid_Mean)) then + deallocate(y%modis_Cloud_Fraction_Mid_Mean) + nullify(y%modis_Cloud_Fraction_Mid_Mean) + endif + if (associated(y%modis_Cloud_Fraction_Low_Mean)) then + deallocate(y%modis_Cloud_Fraction_Low_Mean) + nullify(y%modis_Cloud_Fraction_Low_Mean) + endif + if (associated(y%modis_Optical_Thickness_Total_Mean)) then + deallocate(y%modis_Optical_Thickness_Total_Mean) + nullify(y%modis_Optical_Thickness_Total_Mean) + endif + if (associated(y%modis_Optical_Thickness_Water_Mean)) then + deallocate(y%modis_Optical_Thickness_Water_Mean) + nullify(y%modis_Optical_Thickness_Water_Mean) + endif + if (associated(y%modis_Optical_Thickness_Ice_Mean)) then + deallocate(y%modis_Optical_Thickness_Ice_Mean) + nullify(y%modis_Optical_Thickness_Ice_Mean) + endif + if (associated(y%modis_Optical_Thickness_Total_LogMean)) then + deallocate(y%modis_Optical_Thickness_Total_LogMean) + nullify(y%modis_Optical_Thickness_Total_LogMean) + endif + if (associated(y%modis_Optical_Thickness_Water_LogMean)) then + deallocate(y%modis_Optical_Thickness_Water_LogMean) + nullify(y%modis_Optical_Thickness_Water_LogMean) + endif + if (associated(y%modis_Optical_Thickness_Ice_LogMean)) then + deallocate(y%modis_Optical_Thickness_Ice_LogMean) + nullify(y%modis_Optical_Thickness_Ice_LogMean) + endif + if (associated(y%modis_Cloud_Particle_Size_Water_Mean)) then + deallocate(y%modis_Cloud_Particle_Size_Water_Mean) + nullify(y%modis_Cloud_Particle_Size_Water_Mean) + endif + if (associated(y%modis_Cloud_Particle_Size_Ice_Mean)) then + deallocate(y%modis_Cloud_Particle_Size_Ice_Mean) + nullify(y%modis_Cloud_Particle_Size_Ice_Mean) + endif + if (associated(y%modis_Cloud_Top_Pressure_Total_Mean)) then + deallocate(y%modis_Cloud_Top_Pressure_Total_Mean) + nullify(y%modis_Cloud_Top_Pressure_Total_Mean) + endif + if (associated(y%modis_Liquid_Water_Path_Mean)) then + deallocate(y%modis_Liquid_Water_Path_Mean) + nullify(y%modis_Liquid_Water_Path_Mean) + endif + if (associated(y%modis_Ice_Water_Path_Mean)) then + deallocate(y%modis_Ice_Water_Path_Mean) + nullify(y%modis_Ice_Water_Path_Mean) + endif + if (associated(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) then + deallocate(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure) + nullify(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure) + endif + if (associated(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) then + deallocate(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq) + nullify(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq) + endif + if (associated(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) then + deallocate(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice) + nullify(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice) + endif + if (associated(y%modis_Optical_thickness_vs_ReffLIQ)) then + deallocate(y%modis_Optical_thickness_vs_ReffLIQ) + nullify(y%modis_Optical_thickness_vs_ReffLIQ) + endif + if (associated(y%modis_Optical_thickness_vs_ReffICE)) then + deallocate(y%modis_Optical_thickness_vs_ReffICE) + nullify(y%modis_Optical_thickness_vs_ReffICE) + endif + if (associated(y%cfodd_ntotal)) then + deallocate(y%cfodd_ntotal) + nullify(y%cfodd_ntotal) + endif + if (associated(y%wr_occfreq_ntotal)) then + deallocate(y%wr_occfreq_ntotal) + nullify(y%wr_occfreq_ntotal) + endif + + ! RTTOV multi-instrument + if (allocated(y%rttov_outputs)) then + do i=1,y % Ninst_rttov ! Iterate over each instrument + if (associated(y%rttov_outputs(i)%channel_indices)) then + deallocate(y%rttov_outputs(i)%channel_indices) + nullify(y%rttov_outputs(i)%channel_indices) + endif + if (associated(y%rttov_outputs(i)%bt_total)) then + deallocate(y%rttov_outputs(i)%bt_total) + nullify(y%rttov_outputs(i)%bt_total) + endif + if (associated(y%rttov_outputs(i)%bt_clear)) then + deallocate(y%rttov_outputs(i)%bt_clear) + nullify(y%rttov_outputs(i)%bt_clear) + endif + if (associated(y%rttov_outputs(i)%rad_total)) then + deallocate(y%rttov_outputs(i)%rad_total) + nullify(y%rttov_outputs(i)%rad_total) + endif + if (associated(y%rttov_outputs(i)%rad_clear)) then + deallocate(y%rttov_outputs(i)%rad_clear) + nullify(y%rttov_outputs(i)%rad_clear) + endif + if (associated(y%rttov_outputs(i)%rad_cloudy)) then + deallocate(y%rttov_outputs(i)%rad_cloudy) + nullify(y%rttov_outputs(i)%rad_cloudy) + endif + if (associated(y%rttov_outputs(i)%refl_total)) then + deallocate(y%rttov_outputs(i)%refl_total) + nullify(y%rttov_outputs(i)%refl_total) + endif + if (associated(y%rttov_outputs(i)%refl_clear)) then + deallocate(y%rttov_outputs(i)%refl_clear) + nullify(y%rttov_outputs(i)%refl_clear) + endif + if (associated(y%rttov_outputs(i)%bt_total_pc)) then + deallocate(y%rttov_outputs(i)%bt_total_pc) + nullify(y%rttov_outputs(i)%bt_total_pc) + endif + if (associated(y%rttov_outputs(i)%rad_total_pc)) then + deallocate(y%rttov_outputs(i)%rad_total_pc) + nullify(y%rttov_outputs(i)%rad_total_pc) + endif + end do + deallocate(y%rttov_outputs) + end if + + end subroutine destroy_cosp_outputs + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE rttov_cleanup + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + subroutine rttov_cleanup(y) + use MOD_COSP_RTTOV_INTERFACE, only: DESTROY_RTTOV_CONFIG + + type(cosp_optical_inputs),intent(inout) :: y + integer :: i + + if (size(y%cfg_rttov) .gt. 0) then + do i=1,y%Ninst_rttov + call destroy_rttov_config(y%cfg_rttov(i)) + end do + end if + nullify(y%cfg_rttov) + + end subroutine rttov_cleanup + + end program cosp2_test + diff --git a/src/cosp.F90 b/src/cosp.F90 index 02ed2a6337..c36cb6b15e 100755 --- a/src/cosp.F90 +++ b/src/cosp.F90 @@ -70,6 +70,7 @@ MODULE MOD_COSP USE MOD_COSP_CLOUDSAT_INTERFACE, ONLY: cosp_cloudsat_init, cloudsat_IN, & COSP_ASSIGN_cloudsatIN,COSP_ASSIGN_cloudsatIN_clean USE quickbeam, ONLY: quickbeam_subcolumn, quickbeam_column + USE quickbeam, ONLY: quickbeam_dplrw ! for DPLRW USE MOD_ICARUS, ONLY: icarus_subcolumn, icarus_column USE MOD_MISR_SIMULATOR, ONLY: misr_subcolumn, misr_column USE MOD_LIDAR_SIMULATOR, ONLY: lidar_subcolumn, lidar_column @@ -171,7 +172,7 @@ MODULE MOD_COSP isccp_fq => null() ! The fraction of the model grid box covered by each of ! the 49 ISCCP D level cloud types. (%) - ! MISR outptus + ! MISR outputs real(wp),dimension(:,:,:),pointer :: & ! misr_fq => null() ! Fraction of the model grid box covered by each of the MISR ! cloud types @@ -181,7 +182,7 @@ MODULE MOD_COSP misr_meanztop => null(), & ! Mean MISR cloud top height misr_cldarea => null() ! Mean MISR cloud cover area - ! MODIS outptus + ! MODIS outputs real(wp),pointer,dimension(:) :: & ! modis_Cloud_Fraction_Total_Mean => null(), & ! L3 MODIS retrieved cloud fraction (total) modis_Cloud_Fraction_Water_Mean => null(), & ! L3 MODIS retrieved cloud fraction (liq) @@ -214,11 +215,24 @@ MODULE MOD_COSP cfodd_ntotal => null() ! # of CFODD (Npoints,CFODD_NDBZE,CFODD_NICOD,CFODD_NCLASS) real(wp),dimension(:,:), pointer :: & wr_occfreq_ntotal => null() ! # of nonprecip/drizzle/precip (Npoints,WR_NREGIME) + + ! RTTOV outputs integer :: & Ninst_rttov type(rttov_output),dimension(:),allocatable :: & rttov_outputs + ! Doppler capability of radar (CloudSat/QuickBeam) + real(wp),dimension(:,:,:,:),pointer :: & + dplrw_Z => null(), spwid_Z => null(), Zef94_Z => null(), & + dplrw_T => null(), spwid_T => null(), Zef94_T => null(), & + ZefVd_2 => null(), & + gridw_Z => null(), gridw_T => null() + real(wp),dimension(:,:,:,:,:),pointer :: & + vfall_Z => null(), vfall_T => null(), ZefVf_2 => null() + real(wp),dimension(:,:),pointer :: & + gcumw => null() + end type cosp_outputs CONTAINS @@ -276,7 +290,8 @@ function COSP_SIMULATOR(cospIN,cospgridIN,cospOUT,start_idx,stop_idx,debug) Lcloudsat_tcc, & ! Lcloudsat_tcc2, & ! Llidar_only_freq_cloud, & ! On/Off switch from joint Calipso/Cloudsat product - Lcloudsat_modis_wr ! On/Off switch from joint CloudSat/MODIS warm rain product + Lcloudsat_modis_wr, & ! On/Off switch from joint CloudSat/MODIS warm rain product + Ldplrw ! On/Off switch from Doppler capability of CLOUDSAT simulator logical :: & ok_lidar_cfad = .false., & ok_lidar_cfad_grLidar532 = .false., & @@ -603,6 +618,12 @@ function COSP_SIMULATOR(cospIN,cospgridIN,cospOUT,start_idx,stop_idx,debug) Lcloudsat_modis_wr = .true. ! WR: warm rain product endif + ! for DPLRW + if (associated(cospOUT%dplrw_Z)) then + Ldplrw = .true. + Lcloudsat_subcolumn = .true. + end if + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! 2b) Error Checking ! Enforce bounds on input fields. If input field is out-of-bounds, report error @@ -1493,7 +1514,7 @@ function COSP_SIMULATOR(cospIN,cospgridIN,cospOUT,start_idx,stop_idx,debug) if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays if (cloudsatIN%Npoints .gt. 0) then allocate(temp_cloudsat_cfad_ze(cloudsatIN%Npoints,cloudsat_DBZE_BINS,Nlvgrid), & - temp_cloudsat_precip_cover(cloudsatIN%Npoints,cloudsat_DBZE_BINS), & + temp_cloudsat_precip_cover(cloudsatIN%Npoints,nCloudsatPrecipClass), & temp_cloudsat_pia(cloudsatIN%Npoints)) call quickbeam_column(cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels, & Nlvgrid, cloudsat_DBZE_BINS, 'cloudsat', cloudsatDBZe, cloudsatZe_non, & @@ -1543,6 +1564,27 @@ function COSP_SIMULATOR(cospIN,cospgridIN,cospOUT,start_idx,stop_idx,debug) deallocate(out1D_3) nullify(cospOUT%cloudsat_precip_cover) endif + + ! for DPLRW + if (Ldplrw) then + call quickbeam_dplrw(cospIN%Npoints, cospIN%Ncolumns, cospIN%Nlevels, & + cospIN%rcfg_cloudsat, & + cospgridIN%hgt_matrix, cospgridIN%hgt_matrix_half, cospgridIN%surfelev, & + cospgridIN%at, cospgridIN%pfull, & + cospgridIN%gwvel, cospgridIN%gcumf, & + cospIN%vfall, cospIN%vfsqu, cospIN%zehyd, & + cospIN%g_vol_cloudsat, cospIN%krhyd, & + cospIN%vtrm3, cospIN%vtrm0, cospIN%mmnt3, cospIN%mmnt0, & + cospOUT%gcumw(ij:ik,:), & + cospOUT%dplrw_Z(ij:ik,:,:,:), cospOUT%spwid_Z(ij:ik,:,:,:), & + cospOUT%Zef94_Z(ij:ik,:,:,:), & + cospOUT%dplrw_T(ij:ik,:,:,:), cospOUT%spwid_T(ij:ik,:,:,:), & + cospOUT%Zef94_T(ij:ik,:,:,:), & + cospOUT%ZefVd_2(ij:ik,:,:,:), & + cospOUT%vfall_Z(ij:ik,:,:,:,:), cospOUT%gridw_Z(ij:ik,:,:,:), & + cospOUT%vfall_T(ij:ik,:,:,:,:), cospOUT%gridw_T(ij:ik,:,:,:), & + cospOUT%ZefVf_2(ij:ik,:,:,:,:) ) + end if endif ! MODIS diff --git a/src/cosp.F90.bak b/src/cosp.F90.bak new file mode 100755 index 0000000000..02ed2a6337 --- /dev/null +++ b/src/cosp.F90.bak @@ -0,0 +1,4840 @@ +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +! Copyright (c) 2015, Regents of the University of Colorado +! All rights reserved. +! +! Redistribution and use in source and binary forms, with or without modification, are +! permitted provided that the following conditions are met: +! +! 1. Redistributions of source code must retain the above copyright notice, this list of +! conditions and the following disclaimer. +! +! 2. Redistributions in binary form must reproduce the above copyright notice, this list +! of conditions and the following disclaimer in the documentation and/or other +! materials provided with the distribution. +! +! 3. Neither the name of the copyright holder nor the names of its contributors may be +! used to endorse or promote products derived from this software without specific prior +! written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +! +! History: +! May 2015- D. Swales - Original version +! Mar 2018- R. Guzman - Added OPAQ diagnostics and GLID simulator +! Apr 2018- R. Guzman - Added ATLID simulator +! Nov 2018- T. Michibata - Added CloudSat+MODIS Warmrain Diagnostics +! Mar 2024- C. Wall - Added MODIS joint-histogram diagnostics +! +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +MODULE MOD_COSP + USE COSP_KINDS, ONLY: wp + USE MOD_COSP_CONFIG, ONLY: R_UNDEF,PARASOL_NREFL,LIDAR_NCAT,LIDAR_NTYPE, SR_BINS,& + N_HYDRO,numMISRHgtBins, & + cloudsat_DBZE_BINS,LIDAR_NTEMP,calipso_histBsct,& + use_vgrid,Nlvgrid,vgrid_zu,vgrid_zl,vgrid_z,dz, & + WR_NREGIME, CFODD_NCLASS, & + CFODD_NDBZE, CFODD_NICOD, & + numMODISTauBins,numMODISPresBins, & + numMODISReffIceBins,numMODISReffLiqBins, & + numMODISLWPBins,numMODISIWPBins, & + numISCCPTauBins,numISCCPPresBins,numMISRTauBins,& + ntau,modis_histTau,tau_binBounds, & + modis_histTauEdges,tau_binEdges,nCloudsatPrecipClass,& + modis_histTauCenters,tau_binCenters, & + cloudsat_preclvl,grLidar532_histBsct,atlid_histBsct + USE MOD_COSP_MODIS_INTERFACE, ONLY: cosp_modis_init, modis_IN, & + COSP_ASSIGN_modisIN + USE MOD_COSP_RTTOV_INTERFACE, ONLY: cosp_rttov_init, cosp_rttov_simulate + USE MOD_COSP_RTTOV_UTIL, ONLY: rttov_cfg, rttov_output + USE MOD_COSP_MISR_INTERFACE, ONLY: cosp_misr_init, misr_IN, & + COSP_ASSIGN_misrIN, COSP_ASSIGN_misrIN_clean + USE MOD_COSP_ISCCP_INTERFACE, ONLY: cosp_isccp_init, isccp_IN, & + COSP_ASSIGN_isccpIN, COSP_ASSIGN_isccpIN_clean + USE MOD_COSP_CALIPSO_INTERFACE, ONLY: cosp_calipso_init, calipso_IN, & + COSP_ASSIGN_calipsoIN, COSP_ASSIGN_calipsoIN_clean + USE MOD_COSP_ATLID_INTERFACE, ONLY: cosp_atlid_init, atlid_IN, & + COSP_ASSIGN_atlidIN, COSP_ASSIGN_atlidIN_clean + USE MOD_COSP_GRLIDAR532_INTERFACE, ONLY: cosp_grLidar532_init, grLidar532_IN + USE MOD_COSP_PARASOL_INTERFACE, ONLY: cosp_parasol_init, parasol_in, & + COSP_ASSIGN_parasolIN, COSP_ASSIGN_parasolIN_clean + USE MOD_COSP_CLOUDSAT_INTERFACE, ONLY: cosp_cloudsat_init, cloudsat_IN, & + COSP_ASSIGN_cloudsatIN,COSP_ASSIGN_cloudsatIN_clean + USE quickbeam, ONLY: quickbeam_subcolumn, quickbeam_column + USE MOD_ICARUS, ONLY: icarus_subcolumn, icarus_column + USE MOD_MISR_SIMULATOR, ONLY: misr_subcolumn, misr_column + USE MOD_LIDAR_SIMULATOR, ONLY: lidar_subcolumn, lidar_column + USE MOD_MODIS_SIM, ONLY: modis_subcolumn, modis_column + USE MOD_PARASOL, ONLY: parasol_subcolumn, parasol_column + USE MOD_COSP_RTTOV, ONLY: rttov_IN + USE MOD_COSP_STATS, ONLY: COSP_LIDAR_ONLY_CLOUD,COSP_CHANGE_VERTICAL_GRID, & + COSP_DIAG_WARMRAIN, COMPUTE_ORBITMASKS, & + cosp_optical_inputs, cosp_column_inputs, & + swath_inputs, radar_cfg + USE COSP_PHYS_CONSTANTS, ONLY: radius_earth + USE COSP_MATH_CONSTANTS, ONLY: pi + + IMPLICIT NONE + + logical :: linitialization ! Initialization flag + + + ! ###################################################################################### + ! TYPE cosp_outputs + ! ###################################################################################### + type cosp_outputs + + ! CALIPSO outputs + real(wp),dimension(:,:,:),pointer :: & + calipso_betaperp_tot => null(), & ! Total backscattered signal + calipso_beta_tot => null(), & ! Total backscattered signal + calipso_lidarcldphase => null(), & ! 3D "lidar" phase cloud fraction + calipso_lidarcldtype => null(), & ! 3D "lidar" OPAQ type fraction + calipso_cldlayerphase => null(), & ! low, mid, high-level lidar phase cloud cover + calipso_lidarcldtmp => null(), & ! 3D "lidar" phase cloud temperature + calipso_cfad_sr => null() ! CFAD of scattering ratio + real(wp), dimension(:,:),pointer :: & + calipso_lidarcld => null(), & ! 3D "lidar" cloud fraction + calipso_cldlayer => null(), & ! low, mid, high-level, total lidar cloud cover + calipso_cldtype => null(), & ! opaque and thin lidar cloud cover + z_opaque altitude + calipso_cldtypetemp => null(), & ! opaque and thin cloud temperature + calipso_cldtypemeanz => null(), & ! opaque and thin cloud altitude + calipso_cldtypemeanzse => null(),& ! same as just above with respect to SE + calipso_beta_mol => null() ! Molecular backscatter + real(wp), dimension(:),pointer :: & + calipso_cldthinemis => null(), & ! thin cloud emissivity + calipso_srbval => null() ! SR bins in cfad_sr + + ! GROUND LIDAR outputs + real(wp),dimension(:,:,:),pointer :: & + grLidar532_beta_tot => null(), & ! Total GROUND LIDAR backscattered signal + grLidar532_cfad_sr => null() ! CFAD of GROUND LIDAR scattering ratio + real(wp), dimension(:,:),pointer :: & + grLidar532_lidarcld => null(), & ! 3D GROUND "lidar" cloud fraction + grLidar532_cldlayer => null(), & ! low, mid, high-level, total GROUND lidar cloud cover + grLidar532_beta_mol => null() ! GROUND LIDAR Molecular backscatter + real(wp), dimension(:),pointer :: & + grLidar532_srbval => null() ! SR bins in cfad_sr + + ! ATLID outputs + real(wp),dimension(:,:,:),pointer :: & + atlid_beta_tot => null(), & ! Total ATLID backscattered signal + atlid_cfad_sr => null() ! CFAD of ATLID scattering ratio + real(wp), dimension(:,:),pointer :: & + atlid_lidarcld => null(), & ! 3D ATLID cloud fraction + atlid_cldlayer => null(), & ! low, mid, high-level, total ATLID cloud cover + atlid_beta_mol => null() ! ATLID Molecular backscatter + real(wp), dimension(:),pointer :: & + atlid_srbval => null() ! SR bins in cfad_sr + + ! PARASOL outputs + real(wp),dimension(:,:,:),pointer :: & + parasolPix_refl => null() ! PARASOL reflectances (subcolumn) + real(wp),dimension(:,:),pointer :: & + parasolGrid_refl => null() ! PARASOOL reflectances (column) + + ! CLOUDSAT outputs + real(wp),dimension(:,:,:),pointer :: & + cloudsat_Ze_tot => null(), & ! Effective reflectivity factor (Npoints,Ncolumns,Nlevels) + cloudsat_cfad_ze => null() ! Ze CFAD(Npoints,dBZe_bins,Nlevels) + real(wp), dimension(:,:),pointer :: & + lidar_only_freq_cloud => null(), & ! (Npoints,Nlevels) + cloudsat_precip_cover => null() ! Radar total cloud amount by CloudSat precip flag (Npoints,dBZe_bins) + real(wp),dimension(:),pointer :: & + cloudsat_tcc => null(), & + cloudsat_tcc2 => null(), & + radar_lidar_tcc => null(), & ! Radar&lidar total cloud amount, grid-box scale (Npoints) + cloudsat_pia => null() ! Radar path integrated attenuation (Npoints) + + ! ISCCP outputs + real(wp),dimension(:),pointer :: & + isccp_totalcldarea => null(), & ! The fraction of model grid box columns with cloud + ! somewhere in them. (%) + isccp_meantb => null(), & ! Mean all-sky 10.5 micron brightness temperature. (K) + isccp_meantbclr => null(), & ! Mean clear-sky 10.5 micron brightness temperature. (K) + isccp_meanptop => null(), & ! Mean cloud top pressure (mb). + isccp_meantaucld => null(), & ! Mean optical thickness. (1) + isccp_meanalbedocld => null() ! Mean cloud albedo. (1) + real(wp),dimension(:,:),pointer ::& + isccp_boxtau => null(), & ! Optical thickness in each column. (1) + isccp_boxptop => null() ! Cloud top pressure in each column. (mb) + real(wp),dimension(:,:,:),pointer :: & + isccp_fq => null() ! The fraction of the model grid box covered by each of + ! the 49 ISCCP D level cloud types. (%) + + ! MISR outptus + real(wp),dimension(:,:,:),pointer :: & ! + misr_fq => null() ! Fraction of the model grid box covered by each of the MISR + ! cloud types + real(wp),dimension(:,:),pointer :: & ! + misr_dist_model_layertops => null() ! + real(wp),dimension(:),pointer :: & ! + misr_meanztop => null(), & ! Mean MISR cloud top height + misr_cldarea => null() ! Mean MISR cloud cover area + + ! MODIS outptus + real(wp),pointer,dimension(:) :: & ! + modis_Cloud_Fraction_Total_Mean => null(), & ! L3 MODIS retrieved cloud fraction (total) + modis_Cloud_Fraction_Water_Mean => null(), & ! L3 MODIS retrieved cloud fraction (liq) + modis_Cloud_Fraction_Ice_Mean => null(), & ! L3 MODIS retrieved cloud fraction (ice) + modis_Cloud_Fraction_High_Mean => null(), & ! L3 MODIS retrieved cloud fraction (high) + modis_Cloud_Fraction_Mid_Mean => null(), & ! L3 MODIS retrieved cloud fraction (middle) + modis_Cloud_Fraction_Low_Mean => null(), & ! L3 MODIS retrieved cloud fraction (low ) + modis_Optical_Thickness_Total_Mean => null(), & ! L3 MODIS retrieved optical thickness (tot) + modis_Optical_Thickness_Water_Mean => null(), & ! L3 MODIS retrieved optical thickness (liq) + modis_Optical_Thickness_Ice_Mean => null(), & ! L3 MODIS retrieved optical thickness (ice) + modis_Optical_Thickness_Total_LogMean => null(), & ! L3 MODIS retrieved log10 optical thickness + modis_Optical_Thickness_Water_LogMean => null(), & ! L3 MODIS retrieved log10 optical thickness + modis_Optical_Thickness_Ice_LogMean => null(), & ! L3 MODIS retrieved log10 optical thickness + modis_Cloud_Particle_Size_Water_Mean => null(), & ! L3 MODIS retrieved particle size (liquid) + modis_Cloud_Particle_Size_Ice_Mean => null(), & ! L3 MODIS retrieved particle size (ice) + modis_Cloud_Top_Pressure_Total_Mean => null(), & ! L3 MODIS retrieved cloud top pressure + modis_Liquid_Water_Path_Mean => null(), & ! L3 MODIS retrieved liquid water path + modis_Ice_Water_Path_Mean => null() ! L3 MODIS retrieved ice water path + real(wp),pointer,dimension(:,:,:) :: & + modis_Optical_Thickness_vs_Cloud_Top_Pressure => null(), & ! Tau/Pressure joint histogram + modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq => null(), & ! Tau/Pressure Liq joint histogram + modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice => null(), & ! Tau/Pressure Ice joint histogram + modis_Optical_Thickness_vs_ReffICE => null(), & ! Tau/ReffICE joint histogram + modis_Optical_Thickness_vs_ReffLIQ => null(), & ! Tau/ReffLIQ joint histogram + modis_LWP_vs_ReffLIQ => null(), & ! LWP/ReffLIQ joint histogram + modis_IWP_vs_ReffICE => null() ! IWP/ReffICE joint histogram + + ! Joint CloudSat+MODIS simulators outputs + real(wp),dimension(:,:,:,:),pointer :: & + cfodd_ntotal => null() ! # of CFODD (Npoints,CFODD_NDBZE,CFODD_NICOD,CFODD_NCLASS) + real(wp),dimension(:,:), pointer :: & + wr_occfreq_ntotal => null() ! # of nonprecip/drizzle/precip (Npoints,WR_NREGIME) + integer :: & + Ninst_rttov + type(rttov_output),dimension(:),allocatable :: & + rttov_outputs + + end type cosp_outputs + +CONTAINS + ! ###################################################################################### + ! FUNCTION cosp_simulator + ! ###################################################################################### + function COSP_SIMULATOR(cospIN,cospgridIN,cospOUT,start_idx,stop_idx,debug) + type(cosp_optical_inputs),intent(in),target :: cospIN ! Optical inputs to COSP simulator + type(cosp_column_inputs), intent(in),target :: cospgridIN ! Host model inputs to COSP + + ! Inputs into the simulators + type(isccp_IN) :: isccpIN ! Input to the ISCCP simulator + type(misr_IN) :: misrIN ! Input to the LIDAR simulator + type(calipso_IN) :: calipsoIN ! Input to the LIDAR simulator + type(grLidar532_IN) :: grLidar532IN ! Input to the GROUND LIDAR simulator + type(atlid_IN) :: atlidIN ! Input to the ATLID simulator + type(parasol_IN) :: parasolIN ! Input to the PARASOL simulator + type(cloudsat_IN) :: cloudsatIN ! Input to the CLOUDSAT radar simulator + type(modis_IN) :: modisIN ! Input to the MODIS simulator + type(rttov_IN) :: rttovIN ! Input to the RTTOV simulator + + ! Outputs from the simulators (nested simulator output structure) + type(cosp_outputs), intent(inout) :: cospOUT + + integer,optional :: start_idx,stop_idx + logical,optional :: debug + + character(len=256),dimension(100) :: cosp_simulator + + ! Local variables + integer :: & + i,icol,ij,ik,nError + integer :: k + integer,target :: & + Npoints + logical :: & + Lisccp_subcolumn, & ! On/Off switch for subcolumn ISCCP simulator + Lmisr_subcolumn, & ! On/Off switch for subcolumn MISR simulator + Lcalipso_subcolumn, & ! On/Off switch for subcolumn CALIPSO simulator + LgrLidar532_subcolumn,& ! On/Off switch for subcolumn GROUND LIDAR simulator + Latlid_subcolumn, & ! On/Off switch for subcolumn ATLID simulator + Lparasol_subcolumn, & ! On/Off switch for subcolumn PARASOL simulator + Lcloudsat_subcolumn, & ! On/Off switch for subcolumn CLOUDSAT simulator + Lmodis_subcolumn, & ! On/Off switch for subcolumn MODIS simulator + Lisccp_column, & ! On/Off switch for column ISCCP simulator + Lmisr_column, & ! On/Off switch for column MISR simulator + Lcalipso_column, & ! On/Off switch for column CALIPSO simulator + LgrLidar532_column, & ! On/Off switch for column GROUND LIDAR simulator + Latlid_column, & ! On/Off switch for column ATLID simulator + Lparasol_column, & ! On/Off switch for column PARASOL simulator + Lcloudsat_column, & ! On/Off switch for column CLOUDSAT simulator + Lmodis_column, & ! On/Off switch for column MODIS simulator + Lrttov_column, & ! On/Off switch for column RTTOV simulator + Lradar_lidar_tcc, & ! On/Off switch from joint Calipso/Cloudsat product + Lcloudsat_tcc, & ! + Lcloudsat_tcc2, & ! + Llidar_only_freq_cloud, & ! On/Off switch from joint Calipso/Cloudsat product + Lcloudsat_modis_wr ! On/Off switch from joint CloudSat/MODIS warm rain product + logical :: & + ok_lidar_cfad = .false., & + ok_lidar_cfad_grLidar532 = .false., & + ok_lidar_cfad_atlid = .false., & + verbose = .false. + integer, dimension(:,:),allocatable :: & + modisRetrievedPhase,isccpLEVMATCH + real(wp), dimension(:), allocatable :: & + modisCfTotal,modisCfLiquid,modisMeanIceWaterPath, isccp_meantbclr, & + modisCfIce, modisCfHigh, modisCfMid, modisCfLow,modisMeanTauTotal, & + modisMeanTauLiquid, modisMeanTauIce, modisMeanLogTauTotal, & + modisMeanLogTauLiquid, modisMeanLogTauIce, modisMeanSizeLiquid, & + modisMeanSizeIce, modisMeanCloudTopPressure, modisMeanLiquidWaterPath, & + radar_lidar_tcc, cloudsat_tcc, cloudsat_tcc2 + REAL(WP), dimension(:,:),allocatable :: & + modisRetrievedCloudTopPressure,modisRetrievedTau,modisRetrievedSize, & + misr_boxtau,misr_boxztop,misr_dist_model_layertops,isccp_boxtau, & + isccp_boxttop,isccp_boxptop,calipso_beta_mol,lidar_only_freq_cloud, & + grLidar532_beta_mol,atlid_beta_mol, & + rttov_bt_total,rttov_bt_clear, & ! RTTOV brightness temps + rttov_rad_total,rttov_rad_clear,rttov_rad_cloudy, & ! RTTOV radiances + rttov_refl_total,rttov_refl_clear ! RTTOV reflectances + REAL(WP), dimension(:,:,:),allocatable :: & + modisJointHistogram,modisJointHistogramIce,modisJointHistogramLiq, & + modisJointHistogram_CtpCodLiq,modisJointHistogram_CtpCodIce, & + modisJointHistogram_LwpRefLiq,modisJointHistogram_IwpRefIce, & + calipso_beta_tot,calipso_betaperp_tot, cloudsatDBZe,parasolPix_refl, & + grLidar532_beta_tot,atlid_beta_tot,cloudsatZe_non + real(wp),dimension(:),allocatable,target :: & + out1D_1,out1D_2,out1D_3,out1D_4,out1D_5,out1D_6,out1D_7,out1D_8, & + out1D_9,out1D_10,out1D_11,out1D_12 + real(wp),dimension(:,:,:),allocatable :: & + betamol_in,betamoli,pnormi,ze_toti + real(wp),dimension(:,:,:),allocatable :: & + t_in,tempI,frac_outI ! subscript "I": vertical interpolation (use_vgrid=.true.) + real(wp), allocatable :: & + zlev (:,:), & ! altitude (used only when use_vgrid=.true.) + cfodd_ntotal (:,:,:,:), & ! # of total samples for CFODD (Npoints,CFODD_NDBZE,CFODD_NICOD,CFODD_NCLASS) + wr_occfreq_ntotal(:,:) ! # of warm-rain (nonprecip/drizzle/precip) (Npoints,WR_NREGIME) + + ! Fields used in orbit swathing of gridcells. + logical,dimension(:),allocatable :: & ! Mask of reals over all local times + CSCAL_SWATH_MASK, & ! Needed for MODIS CSCAL + MODIS_SWATH_MASK ! Needed for MODIS CSCAL + normal MODIS + integer,dimension(:),allocatable :: & ! Arrays containing the indices of the swath masks + ISCCP_MASK_INDICES, & + MISR_MASK_INDICES, & + CSCAL_MASK_INDICES, & + PARASOL_MASK_INDICES, & + ATLID_MASK_INDICES, & + MODIS_CSCAL_MASK_INDICES + integer :: j + ! ISCCP swathing variables + real(wp),dimension(:),target,allocatable :: & + temp_isccp_meanalbedocld, & + temp_isccp_meanptop, & + temp_isccp_meantaucld, & + temp_isccp_totalcldarea, & + temp_isccp_meantb + real(wp),dimension(:,:,:),target,allocatable :: & + temp_isccp_fq + ! MISR swathing variables + real(wp),dimension(:),target,allocatable :: & + temp_misr_cldarea, & + temp_misr_meanztop + real(wp),dimension(:,:,:),target,allocatable :: & + temp_misr_fq + ! CALIPSO swathing variables + real(wp),dimension(:),target,allocatable :: & + temp_calipso_cldthinemis + real(wp),dimension(:,:),target,allocatable :: & + temp_calipso_lidarcld, & + temp_calipso_cldlayer, & + temp_calipso_cldtype, & + temp_calipso_cldtypetemp, & + temp_calipso_cldtypemeanz,& + temp_calipso_cldtypemeanzse + real(wp),dimension(:,:,:),target,allocatable :: & + temp_calipso_cfad_sr, & + temp_calipso_lidarcldphase, & + temp_calipso_lidarcldtype, & + temp_calipso_cldlayerphase, & + temp_calipso_lidarcldtmp + ! ATLID swathing variables + real(wp),dimension(:,:),target,allocatable :: & + temp_atlid_lidarcld, & + temp_atlid_cldlayer + real(wp),dimension(:,:,:),target,allocatable :: & + temp_atlid_cfad_sr + ! PARASOL swathing variables + real(wp),dimension(:,:),target,allocatable :: & + temp_parasolGrid_refl + ! CLOUDSAT swathing variables + real(wp),dimension(:),target,allocatable :: & + temp_cloudsat_pia + real(wp),dimension(:,:),target,allocatable :: & + temp_cloudsat_precip_cover + real(wp),dimension(:,:,:),target,allocatable :: & + temp_cloudsat_cfad_ze + ! MODIS swathing variables. + real(wp),dimension(:,:),allocatable :: & + modis_boxptop, & + modis_boxttop, & + modis_boxtau + integer,dimension(:,:),allocatable :: & + modisLEVMATCH + real(wp),dimension(:),target,allocatable :: & + modis_meantbclr + + ! Initialize error reporting for output + cosp_simulator(:)='' + if (present(debug)) verbose = debug + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! 1) Determine if using full inputs or subset + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (present(start_idx) .and. present(stop_idx)) then + ij=start_idx + ik=stop_idx + else + ij=1 + ik=cospIN%Npoints + endif + Npoints = ik-ij+1 + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! 2a) Determine which simulators to run and which statistics to compute + ! - If any of the subcolumn fields are allocated, then run the subcolumn simulators. + ! - If any of the column fields are allocated, then compute the statistics for that + ! simulator, but only save the requested fields. + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Start with all simulators and joint-diagnostics off + Lisccp_subcolumn = .false. + Lmisr_subcolumn = .false. + Lcalipso_subcolumn = .false. + LgrLidar532_subcolumn = .false. + Latlid_subcolumn = .false. + Lparasol_subcolumn = .false. + Lcloudsat_subcolumn = .false. + Lmodis_subcolumn = .false. + Lisccp_column = .false. + Lmisr_column = .false. + Lcalipso_column = .false. + LgrLidar532_column = .false. + Latlid_column = .false. + Lparasol_column = .false. + Lcloudsat_column = .false. + Lmodis_column = .false. + Lrttov_column = .false. + Lradar_lidar_tcc = .false. + Llidar_only_freq_cloud = .false. + Lcloudsat_tcc = .false. + Lcloudsat_tcc2 = .false. + Lcloudsat_modis_wr = .false. + + ! CLOUDSAT subcolumn + if (associated(cospOUT%cloudsat_Ze_tot)) Lcloudsat_subcolumn = .true. + + ! MODIS subcolumn + if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean) .or. & + associated(cospOUT%modis_Cloud_Fraction_Total_Mean) .or. & + associated(cospOUT%modis_Cloud_Fraction_Ice_Mean) .or. & + associated(cospOUT%modis_Cloud_Fraction_High_Mean) .or. & + associated(cospOUT%modis_Cloud_Fraction_Mid_Mean) .or. & + associated(cospOUT%modis_Cloud_Fraction_Low_Mean) .or. & + associated(cospOUT%modis_Optical_Thickness_Total_Mean) .or. & + associated(cospOUT%modis_Optical_Thickness_Water_Mean) .or. & + associated(cospOUT%modis_Optical_Thickness_Ice_Mean) .or. & + associated(cospOUT%modis_Optical_Thickness_Total_LogMean) .or. & + associated(cospOUT%modis_Optical_Thickness_Water_LogMean) .or. & + associated(cospOUT%modis_Optical_Thickness_Ice_LogMean) .or. & + associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean) .or. & + associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean) .or. & + associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean) .or. & + associated(cospOUT%modis_Liquid_Water_Path_Mean) .or. & + associated(cospOUT%modis_Ice_Water_Path_Mean) .or. & + associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure) .or. & + associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq) .or. & + associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & + Lmodis_subcolumn = .true. + + ! ISCCP subcolumn + if (associated(cospOUT%isccp_boxtau) .or. & + associated(cospOUT%isccp_boxptop)) & + Lisccp_subcolumn = .true. + + ! MISR subcolumn + if (associated(cospOUT%misr_dist_model_layertops)) & + Lmisr_subcolumn = .true. + + ! CALIPOSO subcolumn + if (associated(cospOUT%calipso_beta_mol) .or. & + associated(cospOUT%calipso_betaperp_tot) .or. & + associated(cospOUT%calipso_beta_tot)) & + Lcalipso_subcolumn = .true. + + ! GROUND LIDAR subcolumn + if (associated(cospOUT%grLidar532_beta_mol) .or. & + associated(cospOUT%grLidar532_beta_tot)) & + LgrLidar532_subcolumn = .true. + + ! ATLID subcolumn + if (associated(cospOUT%atlid_beta_mol) .or. & + associated(cospOUT%atlid_beta_tot)) & + Latlid_subcolumn = .true. + + ! PARASOL subcolumn + if (associated(cospOUT%parasolPix_refl)) & + Lparasol_subcolumn = .true. + + ! RTTOV Column + if (allocated(cospOUT%rttov_outputs)) then + Lrttov_column = .true. + endif + + ! ISCCP column + if (associated(cospOUT%isccp_fq) .or. & + associated(cospOUT%isccp_meanalbedocld) .or. & + associated(cospOUT%isccp_meanptop) .or. & + associated(cospOUT%isccp_meantaucld) .or. & + associated(cospOUT%isccp_totalcldarea) .or. & + associated(cospOUT%isccp_meantb)) then + Lisccp_column = .true. + Lisccp_subcolumn = .true. + endif + + ! MISR column + if (associated(cospOUT%misr_cldarea) .or. & + associated(cospOUT%misr_meanztop) .or. & + associated(cospOUT%misr_fq)) then + Lmisr_column = .true. + Lmisr_subcolumn = .true. + endif + + ! CALIPSO column + if (associated(cospOUT%calipso_cfad_sr) .or. & + associated(cospOUT%calipso_lidarcld) .or. & + associated(cospOUT%calipso_lidarcldphase) .or. & + associated(cospOUT%calipso_lidarcldtype) .or. & + associated(cospOUT%calipso_cldlayer) .or. & + associated(cospOUT%calipso_cldtype) .or. & + associated(cospOUT%calipso_cldtypetemp) .or. & + associated(cospOUT%calipso_cldtypemeanz) .or. & + associated(cospOUT%calipso_cldtypemeanzse) .or. & + associated(cospOUT%calipso_cldthinemis) .or. & + associated(cospOUT%calipso_cldlayerphase) .or. & + associated(cospOUT%calipso_lidarcldtmp)) then + Lcalipso_column = .true. + Lcalipso_subcolumn = .true. + endif + + ! GROUND LIDAR column + if (associated(cospOUT%grLidar532_cfad_sr) .or. & + associated(cospOUT%grLidar532_lidarcld) .or. & + associated(cospOUT%grLidar532_cldlayer)) then + LgrLidar532_column = .true. + LgrLidar532_subcolumn = .true. + endif + + ! ATLID column + if (associated(cospOUT%atlid_cfad_sr) .or. & + associated(cospOUT%atlid_lidarcld) .or. & + associated(cospOUT%atlid_cldlayer)) then + Latlid_column = .true. + Latlid_subcolumn = .true. + endif + + ! PARASOL column + if (associated(cospOUT%parasolGrid_refl)) then + Lparasol_column = .true. + Lparasol_subcolumn = .true. + endif + + ! CLOUDSAT column + if (associated(cospOUT%cloudsat_cfad_ze)) then + Lcloudsat_column = .true. + Lcloudsat_subcolumn = .true. + endif + + ! MODIS column + if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean) .or. & + associated(cospOUT%modis_Cloud_Fraction_Water_Mean) .or. & + associated(cospOUT%modis_Cloud_Fraction_Ice_Mean) .or. & + associated(cospOUT%modis_Cloud_Fraction_High_Mean) .or. & + associated(cospOUT%modis_Cloud_Fraction_Mid_Mean) .or. & + associated(cospOUT%modis_Cloud_Fraction_Low_Mean) .or. & + associated(cospOUT%modis_Optical_Thickness_Total_Mean) .or. & + associated(cospOUT%modis_Optical_Thickness_Water_Mean) .or. & + associated(cospOUT%modis_Optical_Thickness_Ice_Mean) .or. & + associated(cospOUT%modis_Optical_Thickness_Total_LogMean) .or. & + associated(cospOUT%modis_Optical_Thickness_Water_LogMean) .or. & + associated(cospOUT%modis_Optical_Thickness_Ice_LogMean) .or. & + associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean) .or. & + associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean) .or. & + associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean) .or. & + associated(cospOUT%modis_Liquid_Water_Path_Mean) .or. & + associated(cospOUT%modis_Ice_Water_Path_Mean) .or. & + associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure) .or. & + associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq) .or. & + associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) then + Lmodis_column = .true. + Lmodis_subcolumn = .true. + endif + + ! Joint simulator products + if (associated(cospOUT%lidar_only_freq_cloud) .or. associated(cospOUT%radar_lidar_tcc) .or. & + associated(cospOUT%cloudsat_tcc) .or. associated(cospOUT%cloudsat_tcc2)) then + Lcalipso_column = .true. + Lcalipso_subcolumn = .true. + Lcloudsat_column = .true. + Lcloudsat_subcolumn = .true. + Lradar_lidar_tcc = .true. + Llidar_only_freq_cloud = .true. + Lcloudsat_tcc = .true. + Lcloudsat_tcc2 = .true. + endif + + ! CloudSat+MODIS joint simulator product + if ( associated(cospOUT%cfodd_ntotal) .or. associated(cospOUT%wr_occfreq_ntotal) ) then + Lmodis_column = .true. + Lmodis_subcolumn = .true. + Lcloudsat_column = .true. + Lcloudsat_subcolumn = .true. + Lcloudsat_modis_wr = .true. ! WR: warm rain product + endif + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! 2b) Error Checking + ! Enforce bounds on input fields. If input field is out-of-bounds, report error + ! and turn off simulator + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + call cosp_errorCheck(cospgridIN, cospIN, Lisccp_subcolumn, Lisccp_column, & + Lmisr_subcolumn, Lmisr_column, Lmodis_subcolumn, Lmodis_column, & + Lcloudsat_subcolumn, Lcloudsat_column, Lcalipso_subcolumn, Lcalipso_column, & + Latlid_subcolumn, Latlid_column, LgrLidar532_subcolumn, LgrLidar532_column, & + Lrttov_column, Lparasol_subcolumn, Lparasol_column, & + Lradar_lidar_tcc, Llidar_only_freq_cloud, Lcloudsat_tcc,Lcloudsat_tcc2, & + Lcloudsat_modis_wr, cospOUT, cosp_simulator, nError) + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! 3) Populate instrument simulator inputs + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + ! Indexing order for "cospIN % cospswathsIN" is ISCCP, MISR, CLOUDSAT-CALIPSO, ATLID, PARASOL, MODIS + if (Lisccp_subcolumn .or. Lmodis_subcolumn) then + call COSP_ASSIGN_isccpIN(cospIN,cospgridIN,Npoints,isccpIN,ISCCP_MASK_INDICES) !COSP_ASSIGN_isccpIN + endif + + if (Lmisr_subcolumn) then + call COSP_ASSIGN_misrIN(cospIN,cospgridIN,Npoints,misrIN,MISR_MASK_INDICES) + endif + + if (Lcalipso_subcolumn) then + call COSP_ASSIGN_calipsoIN(cospIN,cospgridIN,Npoints,calipsoIN,CSCAL_MASK_INDICES,CSCAL_SWATH_MASK) + endif + + if (LgrLidar532_subcolumn) then + grLidar532IN%Npoints => Npoints + grLidar532IN%Ncolumns => cospIN%Ncolumns + grLidar532IN%Nlevels => cospIN%Nlevels + grLidar532IN%beta_mol => cospIN%beta_mol_grLidar532 + grLidar532IN%betatot => cospIN%betatot_grLidar532 + grLidar532IN%tau_mol => cospIN%tau_mol_grLidar532 + grLidar532IN%tautot => cospIN%tautot_grLidar532 + endif + + if (Latlid_subcolumn) then + call COSP_ASSIGN_atlidIN(cospIN,cospgridIN,Npoints,atlidIN,ATLID_MASK_INDICES) + endif + + if (Lparasol_subcolumn) then + call COSP_ASSIGN_parasolIN(cospIN,cospgridIN,Npoints,parasolIN,PARASOL_MASK_INDICES) + endif + + if (Lcloudsat_subcolumn) then + call COSP_ASSIGN_cloudsatIN(cospIN,cospgridIN,Npoints,cloudsatIN,CSCAL_MASK_INDICES,CSCAL_SWATH_MASK) + endif + + if (Lmodis_subcolumn) then + call COSP_ASSIGN_modisIN(cospIN,cospgridIN,Npoints,modisIN,CSCAL_SWATH_MASK,MODIS_CSCAL_MASK_INDICES) + endif + + if (Lrttov_column) then + rttovIN%nPoints => Npoints + rttovIN%nLevels => cospIN%nLevels ! This is actually "nlayers" in the RTTOV sense + rttovIN%nSubCols => cospIN%nColumns + rttovIN%co2 => cospgridIN%co2 + rttovIN%ch4 => cospgridIN%ch4 + rttovIN%n2o => cospgridIN%n2o + rttovIN%co => cospgridIN%co + rttovIN%h_surf => cospgridIN%surfelev + rttovIN%u_surf => cospgridIN%u_sfc + rttovIN%v_surf => cospgridIN%v_sfc + rttovIN%t_skin => cospgridIN%skt + rttovIN%p_surf => cospgridIN%psfc ! Lower boundary of lowest layer may not be the surface. + if (associated(cospIN%emis_grey)) rttovIN%emis_grey => cospIN%emis_grey +! rttovIN%surfem => cospgridIN%emis_in +! rttovIN%refl_in => cospgridIN%refl_in + if (allocated(cospgridIN%q2m)) then + rttovIN%q2m => cospgridIN%q2m(:) + else + rttovIN%q2m => cospgridIN%qv(:,cospIN%Nlevels) + end if + if (allocated(cospgridIN%t2m)) then + rttovIN%t2m => cospgridIN%t2m(:) + else + rttovIN%t2m => cospgridIN%at(:,cospIN%Nlevels) + end if + rttovIN%sfcmask => cospgridIN%rttov_sfcmask + rttovIN%latitude => cospgridIN%lat + rttovIN%longitude => cospgridIN%lon + rttovIN%p => cospgridIN%pfull + rttovIN%ph => cospgridIN%phalf + rttovIN%t => cospgridIN%at + rttovIN%q => cospgridIN%qv + rttovIN%o3 => cospgridIN%o3 + ! Below only needed for all-sky RTTOV calculation + rttovIN%rttov_date => cospgridIN%rttov_date + rttovIN%rttov_time => cospgridIN%rttov_time + rttovIN%sza => cospgridIN%sza + rttovIN%tca => cospgridIN%tca + rttovIN%cldLiq => cospgridIN%cloudLiq + rttovIN%cldIce => cospgridIN%cloudIce + rttovIN%DeffLiq => cospgridIN%DeffLiq + rttovIN%DeffIce => cospgridIN%DeffIce + rttovIN%fl_rain => cospgridIN%fl_rain ! Keep in case of RTTOV-SCATT implementation. + rttovIN%fl_snow => cospgridIN%fl_snow ! Keep in case of RTTOV-SCATT implementation. + endif + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! 4) Call subcolumn simulators + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + ! ISCCP (icarus) subcolumn simulator + if (Lisccp_subcolumn .or. Lmodis_subcolumn) then + if (isccpIN%Npoints .gt. 0) then + allocate(isccpLEVMATCH(isccpIN%Npoints,isccpIN%Ncolumns), & + isccp_boxttop(isccpIN%Npoints,isccpIN%Ncolumns), & + isccp_boxptop(isccpIN%Npoints,isccpIN%Ncolumns), & + isccp_boxtau(isccpIN%Npoints,isccpIN%Ncolumns), & + isccp_meantbclr(isccpIN%Npoints)) + ! Call simulator + call icarus_subcolumn(isccpIN%npoints,isccpIN%ncolumns,isccpIN%nlevels, & + isccpIN%sunlit,isccpIN%dtau,isccpIN%dem,isccpIN%skt, & + isccpIN%emsfc_lw,isccpIN%qv,isccpIN%at,isccpIN%pfull, & + isccpIN%phalf,isccpIN%frac_out,isccpLEVMATCH, & + isccp_boxtau(:,:),isccp_boxptop(:,:), & + isccp_boxttop(:,:),isccp_meantbclr(:)) + if (cospIN % cospswathsIN(1) % N_inst_swaths .gt. 0) then + ! Decode outputs from swaths when reading into cospOUT fields + cospOUT%isccp_boxtau(ij:ik,:) = R_UNDEF + cospOUT%isccp_boxptop(ij:ik,:) = R_UNDEF + cospOUT%isccp_meantbclr(ij:ik) = R_UNDEF + if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(ij+int(ISCCP_MASK_INDICES)-1,:) = isccp_boxtau(:,:) + if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(ij+int(ISCCP_MASK_INDICES)-1,:) = isccp_boxptop(:,:) + if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(ij+int(ISCCP_MASK_INDICES)-1) = isccp_meantbclr(:) + else + if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(ij:ik,:) = isccp_boxtau + if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(ij:ik,:) = isccp_boxptop + if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(ij:ik) = isccp_meantbclr + end if + else + cospOUT%isccp_boxtau(ij:ik,:) = R_UNDEF + cospOUT%isccp_boxptop(ij:ik,:) = R_UNDEF + cospOUT%isccp_meantbclr(ij:ik) = R_UNDEF + end if + end if + + ! MISR subcolumn simulator + if (Lmisr_subcolumn) then + if (misrIN%Npoints .gt. 0) then + ! Allocate space for local variables. + allocate(misr_boxztop(misrIN%Npoints,misrIN%Ncolumns), & + misr_boxtau(misrIN%Npoints,misrIN%Ncolumns), & + misr_dist_model_layertops(misrIN%Npoints,numMISRHgtBins)) + ! Call simulator + call misr_subcolumn(misrIN%Npoints,misrIN%Ncolumns,misrIN%Nlevels,misrIN%dtau, & + misrIN%zfull,misrIN%at,misrIN%sunlit,misr_boxtau, & + misr_dist_model_layertops,misr_boxztop) + if (cospIN % cospswathsIN(2) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + ! Decode outputs from swaths when reading into cospOUT fields + cospOUT%misr_dist_model_layertops(ij:ik,:) = R_UNDEF + if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(ij+int(MISR_MASK_INDICES)-1,:) = misr_dist_model_layertops(:,:) + else + if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(ij:ik,:) = misr_dist_model_layertops + end if + else + cospOUT%misr_dist_model_layertops(ij:ik,:) = R_UNDEF + end if + end if + + ! Calipso subcolumn simulator + if (Lcalipso_subcolumn) then + if (calipsoIN%Npoints .gt. 0) then + ! Allocate space for local variables + allocate(calipso_beta_mol(calipsoIN%Npoints,calipsoIN%Nlevels), & + calipso_beta_tot(calipsoIN%Npoints,calipsoIN%Ncolumns,calipsoIN%Nlevels),& + calipso_betaperp_tot(calipsoIN%Npoints,calipsoIN%Ncolumns,calipsoIN%Nlevels)) + ! Call simulator + call lidar_subcolumn(calipsoIN%npoints, calipsoIN%ncolumns, calipsoIN%nlevels, .false., & + calipsoIN%beta_mol, calipsoIN%tau_mol, calipsoIN%betatot, calipsoIN%tautot, & + calipso_beta_mol(:,:), calipso_beta_tot(:,:,:), calipsoIN%betatot_ice, & + calipsoIN%tautot_ice, calipsoIN%betatot_liq, calipsoIN%tautot_liq, & + calipso_betaperp_tot(:,:,:)) + if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + ! Decode outputs from swaths when reading into cospOUT fields + cospOUT%calipso_beta_mol(ij:ik,:) = R_UNDEF + cospOUT%calipso_beta_tot(ij:ik,:,:) = R_UNDEF + cospOUT%calipso_betaperp_tot(ij:ik,:,:) = R_UNDEF + if (associated(cospOUT%calipso_beta_mol)) cospOUT%calipso_beta_mol(ij+int(CSCAL_MASK_INDICES)-1,calipsoIN%Nlevels:1:-1) = calipso_beta_mol(:,:) + if (associated(cospOUT%calipso_beta_tot)) cospOUT%calipso_beta_tot(ij+int(CSCAL_MASK_INDICES)-1,:,calipsoIN%Nlevels:1:-1) = calipso_beta_tot(:,:,:) + if (associated(cospOUT%calipso_betaperp_tot)) cospOUT%calipso_betaperp_tot(ij+int(CSCAL_MASK_INDICES)-1,:,:) = calipso_betaperp_tot(:,:,:) + else ! Proceed normally + ! Store output (if requested) + if (associated(cospOUT%calipso_beta_mol)) cospOUT%calipso_beta_mol(ij:ik,calipsoIN%Nlevels:1:-1) = calipso_beta_mol + if (associated(cospOUT%calipso_beta_tot)) cospOUT%calipso_beta_tot(ij:ik,:,calipsoIN%Nlevels:1:-1) = calipso_beta_tot + if (associated(cospOUT%calipso_betaperp_tot)) cospOUT%calipso_betaperp_tot(ij:ik,:,:) = calipso_betaperp_tot + endif + else + cospOUT%calipso_beta_mol(ij:ik,:) = R_UNDEF + cospOUT%calipso_beta_tot(ij:ik,:,:) = R_UNDEF + cospOUT%calipso_betaperp_tot(ij:ik,:,:) = R_UNDEF + endif + endif + + ! GROUND LIDAR subcolumn simulator + if (LgrLidar532_subcolumn) then + ! Allocate space for local variables + allocate(grLidar532_beta_mol(grLidar532IN%Npoints,grLidar532IN%Nlevels), & + grLidar532_beta_tot(grLidar532IN%Npoints,grLidar532IN%Ncolumns,grLidar532IN%Nlevels)) + ! Call simulator + call lidar_subcolumn(grLidar532IN%npoints, grLidar532IN%ncolumns, grLidar532IN%nlevels,& + .true., grLidar532IN%beta_mol, grLidar532IN%tau_mol, grLidar532IN%betatot,& + grLidar532IN%tautot, grLidar532_beta_mol(:,:), grLidar532_beta_tot(:,:,:)) + ! Store output (if requested) + if (associated(cospOUT%grLidar532_beta_mol)) & + cospOUT%grLidar532_beta_mol(ij:ik,grLidar532IN%Nlevels:1:-1) = grLidar532_beta_mol + if (associated(cospOUT%grLidar532_beta_tot)) & + cospOUT%grLidar532_beta_tot(ij:ik,:,grLidar532IN%Nlevels:1:-1) = grLidar532_beta_tot + endif + + ! ATLID subcolumn simulator + if (Latlid_subcolumn) then + if (atlidIN%Npoints .gt. 0) then + ! Allocate space for local variables + allocate(atlid_beta_mol(atlidIN%Npoints,atlidIN%Nlevels), & + atlid_beta_tot(atlidIN%Npoints,atlidIN%Ncolumns,atlidIN%Nlevels)) + ! Call simulator + call lidar_subcolumn(atlidIN%npoints, atlidIN%ncolumns, atlidIN%nlevels, & + .false., atlidIN%beta_mol_atlid, atlidIN%tau_mol_atlid, atlidIN%betatot_atlid, & + atlidIN%tautot_atlid, atlid_beta_mol(:,:), atlid_beta_tot(:,:,:)) + ! Decode outputs from swaths when reading into cospOUT fields + if (cospIN % cospswathsIN(4) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + cospOUT%atlid_beta_mol(ij:ik,:) = R_UNDEF + cospOUT%atlid_beta_tot(ij:ik,:,:) = R_UNDEF + if (associated(cospOUT%atlid_beta_mol)) cospOUT%atlid_beta_mol(ij+int(ATLID_MASK_INDICES)-1,atlidIN%Nlevels:1:-1) = atlid_beta_mol(:,:) + if (associated(cospOUT%atlid_beta_tot)) cospOUT%atlid_beta_tot(ij+int(ATLID_MASK_INDICES)-1,:,atlidIN%Nlevels:1:-1) = atlid_beta_tot(:,:,:) + else + ! Store output (if requested) + if (associated(cospOUT%atlid_beta_mol)) & + cospOUT%atlid_beta_mol(ij:ik,atlidIN%Nlevels:1:-1) = atlid_beta_mol + if (associated(cospOUT%atlid_beta_tot)) & + cospOUT%atlid_beta_tot(ij:ik,:,atlidIN%Nlevels:1:-1) = atlid_beta_tot + end if + else + cospOUT%atlid_beta_mol(ij:ik,:) = R_UNDEF + cospOUT%atlid_beta_tot(ij:ik,:,:) = R_UNDEF + endif + endif + + ! PARASOL subcolumn simulator + if (Lparasol_subcolumn) then + if (parasolIN%Npoints .gt. 0) then + ! Allocate space for local variables + allocate(parasolPix_refl(parasolIN%Npoints,parasolIN%Ncolumns,PARASOL_NREFL)) + ! Call simulator + do icol=1,parasolIN%Ncolumns + call parasol_subcolumn(parasolIN%npoints, PARASOL_NREFL, & + parasolIN%tautot_S_liq(1:parasolIN%Npoints,icol), & + parasolIN%tautot_S_ice(1:parasolIN%Npoints,icol), & + parasolPix_refl(:,icol,1:PARASOL_NREFL)) + ! Store output (if requested) + if (cospIN % cospswathsIN(5) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + cospOUT%parasolPix_refl(ij:ik,icol,1:PARASOL_NREFL) = R_UNDEF + if (associated(cospOUT%parasolPix_refl)) cospOUT%parasolPix_refl(ij+int(PARASOL_MASK_INDICES)-1,icol,1:PARASOL_NREFL) = parasolPix_refl(:,icol,1:PARASOL_NREFL) + else + if (associated(cospOUT%parasolPix_refl)) cospOUT%parasolPix_refl(ij:ik,icol,1:PARASOL_NREFL) = parasolPix_refl(:,icol,1:PARASOL_NREFL) + endif + enddo + else + cospOUT%parasolPix_refl(ij:ik,:,1:PARASOL_NREFL) = R_UNDEF + endif + endif + + ! Cloudsat (quickbeam) subcolumn simulator + if (Lcloudsat_subcolumn) then + ! Allocate space for local variables + if (cloudsatIN%Npoints .gt. 0) then + allocate(cloudsatDBZe(cloudsatIN%Npoints,cloudsatIN%Ncolumns,cloudsatIN%Nlevels), & + cloudsatZe_non(cloudsatIN%Npoints,cloudsatIN%Ncolumns,cloudsatIN%Nlevels)) + do icol=1,cloudsatIN%ncolumns + call quickbeam_subcolumn(cloudsatIN%rcfg,cloudsatIN%Npoints,cloudsatIN%Nlevels,& + cloudsatIN%hgt_matrix/1000._wp, & + cloudsatIN%z_vol(:,icol,:), & + cloudsatIN%kr_vol(:,icol,:), & + cloudsatIN%g_vol(:,1,:),cloudsatDBze(:,icol,:),cloudsatZe_non(:,icol,:)) + enddo + ! Store output (if requested) + if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + cospOUT%cloudsat_Ze_tot(ij:ik,:,:) = R_UNDEF + if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(ij+int(CSCAL_MASK_INDICES)-1,:,1:cloudsatIN%Nlevels) = cloudsatDBZe(:,:,1:cloudsatIN%Nlevels) + else + if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(ij:ik,:,:) = cloudsatDBZe(:,:,1:cloudsatIN%Nlevels) + endif + else + cospOUT%cloudsat_Ze_tot(ij:ik,:,:) = R_UNDEF + endif + endif + + ! MODIS subcolumn simulator + if (Lmodis_subcolumn) then + if (modisiN%nSunlit > 0) then + ! Allocate space for local variables + allocate(modisRetrievedTau(modisIN%nSunlit,modisIN%nColumns), & + modisRetrievedSize(modisIN%nSunlit,modisIN%nColumns), & + modisRetrievedPhase(modisIN%nSunlit,modisIN%nColumns), & + modisRetrievedCloudTopPressure(modisIN%nSunlit,modisIN%nColumns)) + if ((Lisccp_subcolumn .or. Lmodis_subcolumn) .and. (cospIN % cospswathsIN(1) % N_inst_swaths .gt. 0)) then ! If ISCCP is swathed must run ICARUS separately for MODIS + allocate(modisLEVMATCH(modisIN%Npoints,modisIN%Ncolumns), & + modis_boxptop(modisIN%Npoints,modisIN%Ncolumns), & + modis_boxttop(modisIN%Npoints,modisIN%Ncolumns), & + modis_boxtau(modisIN%Npoints,modisIN%Ncolumns), & + modis_meantbclr(modisIN%Npoints)) + if (.not. allocated(MODIS_SWATH_MASK)) then ! Allows to run when there is no swathing + allocate(MODIS_SWATH_MASK(Npoints)) + MODIS_SWATH_MASK(:) = .true. + end if + call icarus_subcolumn(modisIN%npoints,modisIN%ncolumns,modisIN%nlevels, & + int(MERGE(1,0,MASK=(cospgridIN%sunlit > 0) .and. MODIS_SWATH_MASK)), & + modisIN%tau,cospIN%emiss_11,cospgridIN%skt, & + cospIN%emsfc_lw,cospgridIN%qv,cospgridIN%at,cospgridIN%pfull, & + modisIN%pres,cospIN%frac_out,modisLEVMATCH, & + modis_boxtau(:,:),modis_boxptop(:,:), & + modis_boxttop(:,:),modis_meantbclr(:)) + deallocate(modis_boxtau,modis_boxttop,modis_meantbclr,modisLEVMATCH) + else ! If ISCCP runs fully, just use the cospOUT field indexed appropriately + allocate(modis_boxptop(modisIN%Npoints,modisIN%Ncolumns)) + modis_boxptop = cospOUT%isccp_boxptop(ij:ik,:) + end if + ! Call simulator one column at a time on sunlit columns + do i = 1, modisIN%nSunlit ! Just run on the sunlit columns, even though the modisIN DDT includes everything orbit swathed + call modis_subcolumn(modisIN%Ncolumns,modisIN%Nlevels, & + modisIN%pres(int(modisIN%sunlit(i)),:), & + modisIN%tau(int(modisIN%sunlit(i)),:,:), & + modisIN%liqFrac(int(modisIN%sunlit(i)),:,:), & + modisIN%g(int(modisIN%sunlit(i)),:,:), & + modisIN%w0(int(modisIN%sunlit(i)),:,:), & + modis_boxptop(int(modisIN%sunlit(i)),:), & + modisRetrievedPhase(i,:), & + modisRetrievedCloudTopPressure(i,:), & + modisRetrievedTau(i,:),modisRetrievedSize(i,:)) + end do + deallocate(modis_boxptop) + endif + endif + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! 5) Call column simulators + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + ! ISCCP + if (Lisccp_column) then + ! Check to see which outputs are requested. If not requested, use a local dummy array + if(.not. associated(cospOUT%isccp_meanalbedocld)) then + allocate(out1D_1(Npoints)) + cospOUT%isccp_meanalbedocld(ij:ik) => out1D_1 + endif + if(.not. associated(cospOUT%isccp_meanptop)) then + allocate(out1D_2(Npoints)) + cospOUT%isccp_meanptop(ij:ik) => out1D_2 + endif + if(.not. associated(cospOUT%isccp_meantaucld)) then + allocate(out1D_3(Npoints)) + cospOUT%isccp_meantaucld(ij:ik) => out1D_3 + endif + if(.not. associated(cospOUT%isccp_totalcldarea)) then + allocate(out1D_4(Npoints)) + cospOUT%isccp_totalcldarea(ij:ik) => out1D_4 + endif + if(.not. associated(cospOUT%isccp_meantb)) then + allocate(out1D_5(Npoints)) + cospOUT%isccp_meantb(ij:ik) => out1D_5 + endif + if(.not. associated(cospOUT%isccp_fq)) then + allocate(out1D_6(Npoints*numISCCPTauBins*numISCCPPresBins)) + cospOUT%isccp_fq(ij:ik,1:numISCCPTauBins,1:numISCCPPresBins) => out1D_6 + endif + + ! Call simulator + if (isccpIN%Npoints .gt. 0) then + allocate(temp_isccp_fq(isccpIN%Npoints,numISCCPTauBins,numISCCPPresBins), & + temp_isccp_meanalbedocld(isccpIN%Npoints), & + temp_isccp_meanptop(isccpIN%Npoints), & + temp_isccp_meantaucld(isccpIN%Npoints), & + temp_isccp_totalcldarea(isccpIN%Npoints), & + temp_isccp_meantb(isccpIN%Npoints)) + call icarus_column(isccpIN%npoints, isccpIN%ncolumns,isccp_boxtau(:,:), & + isccp_boxptop(:,:)/100._wp,isccpIN%sunlit,isccp_boxttop(:,:), & + temp_isccp_fq, & + temp_isccp_meanalbedocld, & + temp_isccp_meanptop,temp_isccp_meantaucld, & + temp_isccp_totalcldarea,temp_isccp_meantb) + if (cospIN % cospswathsIN(1) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + ! Decode back to the cospOUT shapes + cospOUT%isccp_fq(ij:ik,:,:) = R_UNDEF + cospOUT%isccp_meanalbedocld(ij:ik) = R_UNDEF + cospOUT%isccp_meanptop(ij:ik) = R_UNDEF + cospOUT%isccp_meantaucld(ij:ik) = R_UNDEF + cospOUT%isccp_totalcldarea(ij:ik) = R_UNDEF + cospOUT%isccp_meantb(ij:ik) = R_UNDEF + if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(ij+int(ISCCP_MASK_INDICES)-1,:,:) = temp_isccp_fq(:,:,:) + if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(ij+int(ISCCP_MASK_INDICES)-1) = temp_isccp_meanalbedocld(:) + if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(ij+int(ISCCP_MASK_INDICES)-1) = temp_isccp_meanptop(:) + if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(ij+int(ISCCP_MASK_INDICES)-1) = temp_isccp_meantaucld(:) + if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(ij+int(ISCCP_MASK_INDICES)-1) = temp_isccp_totalcldarea(:) + if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(ij+int(ISCCP_MASK_INDICES)-1) = temp_isccp_meantb(:) + else + if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(ij:ik,:,:) = temp_isccp_fq(:,:,:) + if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(ij:ik) = temp_isccp_meanalbedocld(:) + if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(ij:ik) = temp_isccp_meanptop(:) + if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(ij:ik) = temp_isccp_meantaucld(:) + if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(ij:ik) = temp_isccp_totalcldarea(:) + if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(ij:ik) = temp_isccp_meantb(:) + end if + deallocate(temp_isccp_fq,temp_isccp_meanalbedocld,temp_isccp_meanptop,temp_isccp_meantaucld,temp_isccp_totalcldarea,temp_isccp_meantb) + else + cospOUT%isccp_fq(ij:ik,:,:) = R_UNDEF + cospOUT%isccp_meanalbedocld(ij:ik) = R_UNDEF + cospOUT%isccp_meanptop(ij:ik) = R_UNDEF + cospOUT%isccp_meantaucld(ij:ik) = R_UNDEF + cospOUT%isccp_totalcldarea(ij:ik) = R_UNDEF + cospOUT%isccp_meantb(ij:ik) = R_UNDEF + end if + cospOUT%isccp_fq(ij:ik,:,:) = cospOUT%isccp_fq(ij:ik,:,7:1:-1) + + ! Check if there is any value slightly greater than 1 + where ((cospOUT%isccp_totalcldarea > 1.0-1.e-5) .and. & + (cospOUT%isccp_totalcldarea < 1.0+1.e-5)) + cospOUT%isccp_totalcldarea = 1.0 + endwhere + + ! Clear up memory (if necessary) + if (allocated(isccp_boxttop)) deallocate(isccp_boxttop) + if (allocated(isccp_boxptop)) deallocate(isccp_boxptop) + if (allocated(isccp_boxtau)) deallocate(isccp_boxtau) + if (allocated(isccp_meantbclr)) deallocate(isccp_meantbclr) + if (allocated(isccpLEVMATCH)) deallocate(isccpLEVMATCH) + if (allocated(ISCCP_MASK_INDICES)) deallocate(ISCCP_MASK_INDICES) + if (allocated(out1D_1)) then + deallocate(out1D_1) + nullify(cospOUT%isccp_meanalbedocld) + endif + if (allocated(out1D_2)) then + deallocate(out1D_2) + nullify(cospOUT%isccp_meanptop) + endif + if (allocated(out1D_3)) then + deallocate(out1D_3) + nullify(cospOUT%isccp_meantaucld) + endif + if (allocated(out1D_4)) then + deallocate(out1D_4) + nullify(cospOUT%isccp_totalcldarea) + endif + if (allocated(out1D_5)) then + deallocate(out1D_5) + nullify(cospOUT%isccp_meantb) + endif + if (allocated(out1D_6)) then + deallocate(out1D_6) + nullify(cospOUT%isccp_fq) + endif + endif + + ! MISR + if (Lmisr_column) then + ! Check to see which outputs are requested. If not requested, use a local dummy array + if (.not. associated(cospOUT%misr_cldarea)) then + allocate(out1D_1(Npoints)) + cospOUT%misr_cldarea(ij:ik) => out1D_1 + endif + if (.not. associated(cospOUT%misr_meanztop)) then + allocate(out1D_2(Npoints)) + cospOUT%misr_meanztop(ij:ik) => out1D_2 + endif + if (.not. associated(cospOUT%misr_fq)) then + allocate(out1D_3(Npoints*numMISRTauBins*numMISRHgtBins)) + cospOUT%misr_fq(ij:ik,1:numMISRTauBins,1:numMISRHgtBins) => out1D_3 + endif + + ! Call simulator + if (cospIN % cospswathsIN(2) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + if (misrIN%Npoints .gt. 0) then + ! Operate at the masked format. + allocate(temp_misr_cldarea(misrIN%Npoints), & + temp_misr_meanztop(misrIN%Npoints), & + temp_misr_fq(misrIN%Npoints,numMISRTauBins,numMISRHgtBins)) + call misr_column(misrIN%Npoints,misrIN%Ncolumns,misr_boxztop,misrIN%sunlit, & + misr_boxtau,temp_misr_cldarea(:), & + temp_misr_meanztop(:),temp_misr_fq(:,:,:)) + ! Decode back to the cospOUT shapes + cospOUT%misr_cldarea(ij:ik) = R_UNDEF + cospOUT%misr_meanztop(ij:ik) = R_UNDEF + cospOUT%misr_fq(ij:ik,:,:) = R_UNDEF + if (associated(cospOUT%misr_cldarea)) cospOUT%misr_cldarea(ij+int(MISR_MASK_INDICES)-1) = temp_misr_cldarea(:) + if (associated(cospOUT%misr_meanztop)) cospOUT%misr_meanztop(ij+int(MISR_MASK_INDICES)-1) = temp_misr_meanztop(:) + if (associated(cospOUT%misr_fq)) cospOUT%misr_fq(ij+int(MISR_MASK_INDICES)-1,:,:) = temp_misr_fq(:,:,:) + deallocate(temp_misr_cldarea,temp_misr_meanztop,temp_misr_fq) + else + cospOUT%misr_cldarea(ij:ik) = R_UNDEF + cospOUT%misr_meanztop(ij:ik) = R_UNDEF + cospOUT%misr_fq(ij:ik,:,:) = R_UNDEF + endif + else + call misr_column(misrIN%Npoints,misrIN%Ncolumns,misr_boxztop,misrIN%sunlit,& + misr_boxtau,cospOUT%misr_cldarea(ij:ik), & + cospOUT%misr_meanztop(ij:ik),cospOUT%misr_fq(ij:ik,:,:)) + endif + ! Clear up memory + if (allocated(misr_boxtau)) deallocate(misr_boxtau) + if (allocated(misr_boxztop)) deallocate(misr_boxztop) + if (allocated(misr_dist_model_layertops)) deallocate(misr_dist_model_layertops) + if (allocated(MISR_MASK_INDICES)) deallocate(MISR_MASK_INDICES) + if (allocated(out1D_1)) then + deallocate(out1D_1) + nullify(cospOUT%misr_cldarea) + endif + if (allocated(out1D_2)) then + deallocate(out1D_2) + nullify(cospOUT%misr_meanztop) + endif + if (allocated(out1D_3)) then + deallocate(out1D_3) + nullify(cospOUT%misr_fq) + endif + endif + + ! CALIPSO LIDAR Simulator + if (Lcalipso_column) then + ! Check to see which outputs are requested. If not requested, use a local dummy array + if (.not. associated(cospOUT%calipso_cfad_sr)) then + allocate(out1D_1(Npoints*SR_BINS*Nlvgrid)) + cospOUT%calipso_cfad_sr(ij:ik,1:SR_BINS,1:Nlvgrid) => out1D_1 + endif + if (.not. associated(cospOUT%calipso_lidarcld)) then + allocate(out1D_2(Npoints*Nlvgrid)) + cospOUT%calipso_lidarcld(ij:ik,1:Nlvgrid) => out1D_2 + endif + if (.not. associated(cospOUT%calipso_lidarcldphase)) then + allocate(out1D_3(Npoints*Nlvgrid*6)) + cospOUT%calipso_lidarcldphase(ij:ik,1:Nlvgrid,1:6) => out1D_3 + endif + if (.not. associated(cospOUT%calipso_cldlayer)) then + allocate(out1D_4(Npoints*LIDAR_NCAT)) + cospOUT%calipso_cldlayer(ij:ik,1:LIDAR_NCAT) => out1D_4 + endif + if (.not. associated(cospOUT%calipso_cldlayerphase)) then + allocate(out1D_5(Npoints*LIDAR_NCAT*6)) + cospOUT%calipso_cldlayerphase(ij:ik,1:LIDAR_NCAT,1:6) => out1D_5 + endif + if (.not. associated(cospOUT%calipso_lidarcldtmp)) then + allocate(out1D_6(Npoints*40*5)) + cospOUT%calipso_lidarcldtmp(ij:ik,1:40,1:5) => out1D_6 + endif + if (.not. associated(cospOUT%calipso_lidarcldtype)) then + allocate(out1D_7(Npoints*Nlvgrid*4)) + cospOUT%calipso_lidarcldtype(ij:ik,1:Nlvgrid,1:4) => out1D_7 + endif + if (.not. associated(cospOUT%calipso_cldtype)) then + allocate(out1D_8(Npoints*LIDAR_NTYPE)) + cospOUT%calipso_cldtype(ij:ik,1:LIDAR_NTYPE) => out1D_8 + endif + if (.not. associated(cospOUT%calipso_cldtypetemp)) then + allocate(out1D_9(Npoints*LIDAR_NTYPE)) + cospOUT%calipso_cldtypetemp(ij:ik,1:LIDAR_NTYPE) => out1D_9 + endif + if (.not. associated(cospOUT%calipso_cldtypemeanz)) then + allocate(out1D_10(Npoints*2)) + cospOUT%calipso_cldtypemeanz(ij:ik,1:2) => out1D_10 + endif + if (.not. associated(cospOUT%calipso_cldtypemeanzse)) then + allocate(out1D_12(Npoints*3)) + cospOUT%calipso_cldtypemeanzse(ij:ik,1:3) => out1D_12 + endif + if (.not. associated(cospOUT%calipso_cldthinemis)) then + allocate(out1D_11(Npoints)) + cospOUT%calipso_cldthinemis(ij:ik) => out1D_11 + endif + + ! Call simulator + if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + ! Operate at the masked format. + if (calipsoIN%Npoints .gt. 0) then + allocate(temp_calipso_cfad_sr(calipsoIN%Npoints,SR_BINS,Nlvgrid), & + temp_calipso_lidarcld(calipsoIN%Npoints,Nlvgrid), & + temp_calipso_cldlayer(calipsoIN%Npoints,LIDAR_NCAT), & + temp_calipso_lidarcldphase(calipsoIN%Npoints,Nlvgrid,6), & + temp_calipso_lidarcldtype(calipsoIN%Npoints,Nlvgrid,LIDAR_NTYPE+1), & + temp_calipso_cldtype(calipsoIN%Npoints,LIDAR_NTYPE), & + temp_calipso_cldtypetemp(calipsoIN%Npoints,LIDAR_NTYPE), & + temp_calipso_cldtypemeanz(calipsoIN%Npoints,2), & + temp_calipso_cldtypemeanzse(calipsoIN%Npoints,3), & + temp_calipso_cldthinemis(calipsoIN%Npoints), & + temp_calipso_cldlayerphase(calipsoIN%Npoints,LIDAR_NCAT,6), & + temp_calipso_lidarcldtmp(calipsoIN%Npoints,LIDAR_NTEMP,5)) + ok_lidar_cfad=.true. + call lidar_column(calipsoIN%Npoints, calipsoIN%Ncolumns, calipsoIN%Nlevels, & + Nlvgrid, SR_BINS, LIDAR_NTYPE, 'calipso',calipso_beta_tot(:,:,:), calipso_beta_mol(:,:), & + cospgridIN%phalf(int(CSCAL_MASK_INDICES),2:calipsoIN%Nlevels+1), & + cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES),:), & + cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES),:), vgrid_z(:), ok_lidar_cfad, LIDAR_NCAT, & + temp_calipso_cfad_sr(:,:,:), temp_calipso_lidarcld(:,:), temp_calipso_cldlayer(:,:), & + cospgridIN%at(int(CSCAL_MASK_INDICES),:), calipso_betaperp_tot(:,:,:), & + cospgridIN%surfelev(int(CSCAL_MASK_INDICES)), & + temp_calipso_lidarcldphase(:,:,:), & + temp_calipso_lidarcldtype(:,:,:), temp_calipso_cldtype(:,:), & + temp_calipso_cldtypetemp(:,:), temp_calipso_cldtypemeanz(:,:), & + temp_calipso_cldtypemeanzse(:,:), temp_calipso_cldthinemis(:), & + temp_calipso_cldlayerphase(:,:,:), temp_calipso_lidarcldtmp(:,:,:)) + ! Decode back to the cospOUT shapes + cospOUT%calipso_cfad_sr(ij:ik,:,:) = R_UNDEF + cospOUT%calipso_lidarcld(ij:ik,:) = R_UNDEF + cospOUT%calipso_cldlayer(ij:ik,:) = R_UNDEF + cospOUT%calipso_lidarcldphase(ij:ik,:,:) = R_UNDEF + cospOUT%calipso_lidarcldtype(ij:ik,:,:) = R_UNDEF + cospOUT%calipso_cldtype(ij:ik,:) = R_UNDEF + cospOUT%calipso_cldtypetemp(ij:ik,:) = R_UNDEF + cospOUT%calipso_cldtypemeanz(ij:ik,:) = R_UNDEF + cospOUT%calipso_cldtypemeanzse(ij:ik,:) = R_UNDEF + cospOUT%calipso_cldthinemis(ij:ik) = R_UNDEF + cospOUT%calipso_cldlayerphase(ij:ik,:,:) = R_UNDEF + cospOUT%calipso_lidarcldtmp(ij:ik,:,:) = R_UNDEF + ! Note: The active simulators use R_UNDEF to indicate unretrieved and clear-sky values. + ! Decisions on how to treat these values are delegeate to the host user, and fields + ! are often set to zero. + ! Using R_UNDEF in this way is incompatible with the swath approach, where R_UNDEF means + ! that a field should not be used in statistically averaging, etc. + ! To avoid this error, when swathing we set R_UNDEF value to zero here. + where (temp_calipso_cfad_sr(:,:,:) == R_UNDEF) temp_calipso_cfad_sr(:,:,:) = 0._wp + where (temp_calipso_lidarcldphase(:,:,:) == R_UNDEF) temp_calipso_lidarcldphase(:,:,:) = 0._wp + where (temp_calipso_lidarcld(:,:) == R_UNDEF) temp_calipso_lidarcld(:,:) = 0._wp + ! Unpack into the full lat-lon structure + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(ij+int(CSCAL_MASK_INDICES)-1,:,:) = temp_calipso_cfad_sr(:,:,:) + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_calipso_lidarcld(:,:) + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_calipso_cldlayer(:,:) + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(ij+int(CSCAL_MASK_INDICES)-1,:,:) = temp_calipso_lidarcldphase(:,:,:) + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(ij+int(CSCAL_MASK_INDICES)-1,:,:) = temp_calipso_lidarcldtype(:,:,:) + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_calipso_cldtype(:,:) + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_calipso_cldtypetemp(:,:) + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_calipso_cldtypemeanz(:,:) + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_calipso_cldtypemeanzse(:,:) + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(ij+int(CSCAL_MASK_INDICES)-1) = temp_calipso_cldthinemis(:) + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(ij+int(CSCAL_MASK_INDICES)-1,:,:) = temp_calipso_cldlayerphase(:,:,:) + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(ij+int(CSCAL_MASK_INDICES)-1,:,:) = temp_calipso_lidarcldtmp(:,:,:) + deallocate(temp_calipso_cfad_sr,temp_calipso_lidarcld,temp_calipso_cldlayer,temp_calipso_lidarcldphase, & + temp_calipso_lidarcldtype,temp_calipso_cldtype,temp_calipso_cldtypetemp,temp_calipso_cldtypemeanz, & + temp_calipso_cldtypemeanzse,temp_calipso_cldthinemis,temp_calipso_cldlayerphase,temp_calipso_lidarcldtmp) + else + cospOUT%calipso_cfad_sr(ij:ik,:,:) = R_UNDEF + cospOUT%calipso_lidarcld(ij:ik,:) = R_UNDEF + cospOUT%calipso_cldlayer(ij:ik,:) = R_UNDEF + cospOUT%calipso_lidarcldphase(ij:ik,:,:) = R_UNDEF + cospOUT%calipso_lidarcldtype(ij:ik,:,:) = R_UNDEF + cospOUT%calipso_cldtype(ij:ik,:) = R_UNDEF + cospOUT%calipso_cldtypetemp(ij:ik,:) = R_UNDEF + cospOUT%calipso_cldtypemeanz(ij:ik,:) = R_UNDEF + cospOUT%calipso_cldtypemeanzse(ij:ik,:) = R_UNDEF + cospOUT%calipso_cldthinemis(ij:ik) = R_UNDEF + cospOUT%calipso_cldlayerphase(ij:ik,:,:) = R_UNDEF + cospOUT%calipso_lidarcldtmp(ij:ik,:,:) = R_UNDEF + endif + else + ok_lidar_cfad=.true. + call lidar_column(calipsoIN%Npoints, calipsoIN%Ncolumns, calipsoIN%Nlevels, & + Nlvgrid, SR_BINS, LIDAR_NTYPE, 'calipso',calipso_beta_tot(:,:,:), calipso_beta_mol(:,:),& + cospgridIN%phalf(:,2:calipsoIN%Nlevels+1),cospgridIN%hgt_matrix, & + cospgridIN%hgt_matrix_half, vgrid_z(:), ok_lidar_cfad, LIDAR_NCAT, & + cospOUT%calipso_cfad_sr(ij:ik,:,:), cospOUT%calipso_lidarcld(ij:ik,:), & + cospOUT%calipso_cldlayer(ij:ik,:), & + cospgridIN%at(:,:), calipso_betaperp_tot(:,:,:), cospgridIN%surfelev, & + cospOUT%calipso_lidarcldphase(ij:ik,:,:), & + cospOUT%calipso_lidarcldtype(ij:ik,:,:), cospOUT%calipso_cldtype(ij:ik,:), & + cospOUT%calipso_cldtypetemp(ij:ik,:), cospOUT%calipso_cldtypemeanz(ij:ik,:), & + cospOUT%calipso_cldtypemeanzse(ij:ik,:), cospOUT%calipso_cldthinemis(ij:ik), & + cospOUT%calipso_cldlayerphase(ij:ik,:,:), cospOUT%calipso_lidarcldtmp(ij:ik,:,:)) + endif + + if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval = calipso_histBsct + + ! Free up memory (if necessary) + if (allocated(out1D_1)) then + deallocate(out1D_1) + nullify(cospOUT%calipso_cfad_sr) + endif + if (allocated(out1D_2)) then + deallocate(out1D_2) + nullify(cospOUT%calipso_lidarcld) + endif + if (allocated(out1D_3)) then + deallocate(out1D_3) + nullify(cospOUT%calipso_lidarcldphase) + endif + if (allocated(out1D_4)) then + deallocate(out1D_4) + nullify(cospOUT%calipso_cldlayer) + endif + if (allocated(out1D_5)) then + deallocate(out1D_5) + nullify(cospOUT%calipso_cldlayerphase) + endif + if (allocated(out1D_6)) then + deallocate(out1D_6) + nullify(cospOUT%calipso_lidarcldtmp) + endif + if (allocated(out1D_7)) then + deallocate(out1D_7) + nullify(cospOUT%calipso_lidarcldtype) + endif + if (allocated(out1D_8)) then + deallocate(out1D_8) + nullify(cospOUT%calipso_cldtype) + endif + if (allocated(out1D_9)) then + deallocate(out1D_9) + nullify(cospOUT%calipso_cldtypetemp) + endif + if (allocated(out1D_10)) then + deallocate(out1D_10) + nullify(cospOUT%calipso_cldtypemeanz) + endif + if (allocated(out1D_12)) then + deallocate(out1D_12) + nullify(cospOUT%calipso_cldtypemeanzse) + endif + if (allocated(out1D_11)) then + deallocate(out1D_11) + nullify(cospOUT%calipso_cldthinemis) + endif + + endif + + ! GROUND LIDAR Simulator + if (LgrLidar532_column) then + ! Check to see which outputs are requested. If not requested, use a local dummy array + if (.not. associated(cospOUT%grLidar532_cfad_sr)) then + allocate(out1D_1(Npoints*SR_BINS*Nlvgrid)) + cospOUT%grLidar532_cfad_sr(ij:ik,1:SR_BINS,1:Nlvgrid) => out1D_1 + endif + if (.not. associated(cospOUT%grLidar532_lidarcld)) then + allocate(out1D_2(Npoints*Nlvgrid)) + cospOUT%grLidar532_lidarcld(ij:ik,1:Nlvgrid) => out1D_2 + endif + if (.not. associated(cospOUT%grLidar532_cldlayer)) then + allocate(out1D_3(Npoints*LIDAR_NCAT)) + cospOUT%grLidar532_cldlayer(ij:ik,1:LIDAR_NCAT) => out1D_3 + endif + + ! Call simulator + ok_lidar_cfad_grLidar532=.true. + call lidar_column(grLidar532IN%Npoints, grLidar532IN%Ncolumns, grLidar532IN%Nlevels, & + Nlvgrid, SR_BINS, LIDAR_NTYPE, 'grlidar532',grLidar532_beta_tot(:,:,:), grLidar532_beta_mol(:,:),& + cospgridIN%phalf(:,2:grLidar532IN%Nlevels+1),cospgridIN%hgt_matrix, & + cospgridIN%hgt_matrix_half, vgrid_z(:), ok_lidar_cfad_grLidar532, LIDAR_NCAT, & + cospOUT%grLidar532_cfad_sr(ij:ik,:,:), cospOUT%grLidar532_lidarcld(ij:ik,:), & + cospOUT%grLidar532_cldlayer(ij:ik,:)) + + if (associated(cospOUT%grLidar532_srbval)) cospOUT%grLidar532_srbval = grLidar532_histBsct + + ! Free up memory (if necessary) + if (allocated(out1D_1)) then + deallocate(out1D_1) + nullify(cospOUT%grLidar532_cfad_sr) + endif + if (allocated(out1D_2)) then + deallocate(out1D_2) + nullify(cospOUT%grLidar532_lidarcld) + endif + if (allocated(out1D_3)) then + deallocate(out1D_3) + nullify(cospOUT%grLidar532_cldlayer) + endif + + endif + + ! ATLID Simulator + if (Latlid_column) then + ! Check to see which outputs are requested. If not requested, use a local dummy array + if (.not. associated(cospOUT%atlid_cfad_sr)) then + allocate(out1D_1(Npoints*SR_BINS*Nlvgrid)) + cospOUT%atlid_cfad_sr(ij:ik,1:SR_BINS,1:Nlvgrid) => out1D_1 + endif + if (.not. associated(cospOUT%atlid_lidarcld)) then + allocate(out1D_2(Npoints*Nlvgrid)) + cospOUT%atlid_lidarcld(ij:ik,1:Nlvgrid) => out1D_2 + endif + if (.not. associated(cospOUT%atlid_cldlayer)) then + allocate(out1D_3(Npoints*LIDAR_NCAT)) + cospOUT%atlid_cldlayer(ij:ik,1:LIDAR_NCAT) => out1D_3 + endif + ! Call simulator + ok_lidar_cfad_atlid=.true. + if (cospIN % cospswathsIN(4) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + if (atlidIN%Npoints .gt. 0) then + allocate(temp_atlid_cfad_sr(atlidIN%Npoints,SR_BINS,Nlvgrid), & + temp_atlid_lidarcld(atlidIN%Npoints,Nlvgrid), & + temp_atlid_cldlayer(atlidIN%Npoints,LIDAR_NCAT)) + call lidar_column(atlidIN%Npoints, atlidIN%Ncolumns, atlidIN%Nlevels, & + Nlvgrid, SR_BINS, LIDAR_NTYPE, 'atlid',atlid_beta_tot(:,:,:), & + atlid_beta_mol(:,:), cospgridIN%phalf(int(ATLID_MASK_INDICES),2:atlidIN%Nlevels+1), & + cospgridIN%hgt_matrix(int(ATLID_MASK_INDICES),:), & + cospgridIN%hgt_matrix_half(int(ATLID_MASK_INDICES),:), vgrid_z(:), & + ok_lidar_cfad_atlid, LIDAR_NCAT, temp_atlid_cfad_sr(:,:,:), & + temp_atlid_lidarcld(:,:), temp_atlid_cldlayer(:,:)) + ! Decode back to the cospOUT shapes + cospOUT%atlid_cfad_sr(ij:ik,:,:) = R_UNDEF + cospOUT%atlid_lidarcld(ij:ik,:) = R_UNDEF + cospOUT%atlid_cldlayer(ij:ik,:) = R_UNDEF + if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(ij+int(ATLID_MASK_INDICES)-1,:,:) = temp_atlid_cfad_sr(:,:,:) + if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(ij+int(ATLID_MASK_INDICES)-1,:) = temp_atlid_lidarcld(:,:) + if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(ij+int(ATLID_MASK_INDICES)-1,:) = temp_atlid_cldlayer(:,:) + deallocate(temp_atlid_cfad_sr,temp_atlid_lidarcld,temp_atlid_cldlayer) + else + cospOUT%atlid_cfad_sr(ij:ik,:,:) = R_UNDEF + cospOUT%atlid_lidarcld(ij:ik,:) = R_UNDEF + cospOUT%atlid_cldlayer(ij:ik,:) = R_UNDEF + endif + else + call lidar_column(atlidIN%Npoints, atlidIN%Ncolumns, atlidIN%Nlevels, & + Nlvgrid, SR_BINS, LIDAR_NTYPE, 'atlid',atlid_beta_tot(:,:,:), & + atlid_beta_mol(:,:), cospgridIN%phalf(:,2:atlidIN%Nlevels+1), & + cospgridIN%hgt_matrix, cospgridIN%hgt_matrix_half, vgrid_z(:), & + ok_lidar_cfad_atlid, LIDAR_NCAT, cospOUT%atlid_cfad_sr(ij:ik,:,:), & + cospOUT%atlid_lidarcld(ij:ik,:), cospOUT%atlid_cldlayer(ij:ik,:)) + endif + if (associated(cospOUT%atlid_srbval)) cospOUT%atlid_srbval = atlid_histBsct + + ! Free up memory (if necessary) + if (allocated(ATLID_MASK_INDICES)) deallocate(ATLID_MASK_INDICES) + if (allocated(out1D_1)) then + deallocate(out1D_1) + nullify(cospOUT%atlid_cfad_sr) + endif + if (allocated(out1D_2)) then + deallocate(out1D_2) + nullify(cospOUT%atlid_lidarcld) + endif + if (allocated(out1D_3)) then + deallocate(out1D_3) + nullify(cospOUT%atlid_cldlayer) + endif + + endif + + ! PARASOL + if (Lparasol_column) then + if (cospIN % cospswathsIN(5) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + if (parasolIN%Npoints .gt. 0) then + allocate(temp_parasolGrid_refl(parasolIN%Npoints,PARASOL_NREFL)) + call parasol_column(parasolIN%Npoints,PARASOL_NREFL,parasolIN%Ncolumns, & + cospgridIN%land(int(PARASOL_MASK_INDICES)),parasolPix_refl(:,:,:), & + temp_parasolGrid_refl(:,:)) + ! Decode back to the cospOUT shapes + cospOUT%parasolGrid_refl(ij:ik,:) = R_UNDEF + ! Note: The active simulators use R_UNDEF to indicate unretrieved and clear-sky values. + ! Decisions on how to treat these values are delegeate to the host user, and fields + ! are often set to zero. + ! Using R_UNDEF in this way is incompatible with the swath approach, where R_UNDEF means + ! that a field should not be used in statistically averaging, etc. + ! To avoid this error, when swathing we set R_UNDEF value to zero here. + where (temp_parasolGrid_refl(:,:) == R_UNDEF) temp_parasolGrid_refl(:,:) = 0._wp + if (associated(cospOUT%parasolGrid_refl)) cospOUT%parasolGrid_refl(ij+int(PARASOL_MASK_INDICES)-1,:) = temp_parasolGrid_refl(:,:) + deallocate(temp_parasolGrid_refl) + else + cospOUT%parasolGrid_refl(ij:ik,:) = R_UNDEF + endif + else + call parasol_column(parasolIN%Npoints,PARASOL_NREFL,parasolIN%Ncolumns, & + cospgridIN%land(:),parasolPix_refl(:,:,:), & + cospOUT%parasolGrid_refl(ij:ik,:)) + ! print*,'cospOUT%parasolGrid_refl: ',cospOUT%parasolGrid_refl ! Values not zeroed here. + endif + if (allocated(parasolPix_refl)) deallocate(parasolPix_refl) + if (allocated(PARASOL_MASK_INDICES)) deallocate(PARASOL_MASK_INDICES) + endif + + ! CLOUDSAT + if (Lcloudsat_column) then + ! Check to see which outputs are requested. If not requested, use a local dummy array + if (.not. associated(cospOUT%cloudsat_cfad_ze)) then + allocate(out1D_1(Npoints*cloudsat_DBZE_BINS*Nlvgrid)) + cospOUT%cloudsat_cfad_ze(ij:ik,1:cloudsat_DBZE_BINS,1:Nlvgrid) => out1D_1 + endif + + if (.not. associated(cospOUT%cloudsat_pia)) then + allocate(out1D_2(Npoints)) + cospOUT%cloudsat_pia(ij:ik) => out1D_2 + endif + if (.not. associated(cospOUT%cloudsat_precip_cover)) then + allocate(out1D_3(Npoints*nCloudsatPrecipClass)) + cospOUT%cloudsat_precip_cover(ij:ik,1:nCloudsatPrecipClass) => out1D_3 + endif + + ! Call simulator + if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + if (cloudsatIN%Npoints .gt. 0) then + allocate(temp_cloudsat_cfad_ze(cloudsatIN%Npoints,cloudsat_DBZE_BINS,Nlvgrid), & + temp_cloudsat_precip_cover(cloudsatIN%Npoints,cloudsat_DBZE_BINS), & + temp_cloudsat_pia(cloudsatIN%Npoints)) + call quickbeam_column(cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels, & + Nlvgrid, cloudsat_DBZE_BINS, 'cloudsat', cloudsatDBZe, cloudsatZe_non, & + cospgridIN%land(int(CSCAL_MASK_INDICES)), cospgridIN%surfelev(int(CSCAL_MASK_INDICES)), & + cospgridIN%at(int(CSCAL_MASK_INDICES),cospIN%Nlevels), cospIN%fracPrecipIce(int(CSCAL_MASK_INDICES),:), & + cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES),:), cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES),:), & + temp_cloudsat_cfad_ze(:,:,:), temp_cloudsat_precip_cover(:,:), temp_cloudsat_pia(:)) + ! Decode back to the cospOUT shapes + cospOUT%cloudsat_cfad_ze(ij:ik,:,:) = R_UNDEF + cospOUT%cloudsat_precip_cover(ij:ik,:) = R_UNDEF + cospOUT%cloudsat_pia(ij:ik) = R_UNDEF + ! Note: The active simulators use R_UNDEF to indicate unretrieved and clear-sky values. + ! Decisions on how to treat these values are delegeate to the host user, and fields + ! are often set to zero. + ! Using R_UNDEF in this way is incompatible with the swath approach, where R_UNDEF means + ! that a field should not be used in statistically averaging, etc. + ! To avoid this error, when swathing we set R_UNDEF value to zero here. + where (temp_cloudsat_cfad_ze(:,:,:) == R_UNDEF) temp_cloudsat_cfad_ze(:,:,:) = 0._wp + if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(ij+int(CSCAL_MASK_INDICES)-1,:,:) = temp_cloudsat_cfad_ze(:,:,:) + if (associated(cospOUT%cloudsat_precip_cover)) cospOUT%cloudsat_precip_cover(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_cloudsat_precip_cover(:,:) + if (associated(cospOUT%cloudsat_pia)) cospOUT%cloudsat_pia(ij+int(CSCAL_MASK_INDICES)-1) = temp_cloudsat_pia(:) + deallocate(temp_cloudsat_cfad_ze,temp_cloudsat_precip_cover,temp_cloudsat_pia) + if (allocated(CSCAL_SWATH_MASK)) deallocate(CSCAL_SWATH_MASK) + else + cospOUT%cloudsat_cfad_ze(ij:ik,:,:) = R_UNDEF + cospOUT%cloudsat_precip_cover(ij:ik,:) = R_UNDEF + cospOUT%cloudsat_pia(ij:ik) = R_UNDEF + endif + else + call quickbeam_column(cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels,& + Nlvgrid, cloudsat_DBZE_BINS, 'cloudsat', cloudsatDBZe, cloudsatZe_non, & + cospgridIN%land(:), cospgridIN%surfelev(:), cospgridIN%at(:,cospIN%Nlevels), & + cospIN%fracPrecipIce, cospgridIN%hgt_matrix, cospgridIN%hgt_matrix_half, & + cospOUT%cloudsat_cfad_ze(ij:ik,:,:), cospOUT%cloudsat_precip_cover(ij:ik,:), & + cospOUT%cloudsat_pia(ij:ik)) + endif + ! Free up memory (if necessary) + if (allocated(out1D_1)) then + deallocate(out1D_1) + nullify(cospOUT%cloudsat_cfad_ze) + endif + if (allocated(out1D_2)) then + deallocate(out1D_2) + nullify(cospOUT%cloudsat_pia) + endif + if (allocated(out1D_3)) then + deallocate(out1D_3) + nullify(cospOUT%cloudsat_precip_cover) + endif + endif + + ! MODIS + if (Lmodis_column) then + if (modisIN%nSunlit > 0) then + ! Allocate space for local variables + allocate(modisCftotal(modisIN%nSunlit), modisCfLiquid(modisIN%nSunlit), & + modisCfIce(modisIN%nSunlit),modisCfHigh(modisIN%nSunlit), & + modisCfMid(modisIN%nSunlit),modisCfLow(modisIN%nSunlit), & + modisMeanTauTotal(modisIN%nSunlit), & + modisMeanTauLiquid(modisIN%nSunlit),modisMeanTauIce(modisIN%nSunlit), & + modisMeanLogTauTotal(modisIN%nSunlit), & + modisMeanLogTauLiquid(modisIN%nSunlit), & + modisMeanLogTauIce(modisIN%nSunlit), & + modisMeanSizeLiquid(modisIN%nSunlit), & + modisMeanSizeIce(modisIN%nSunlit), & + modisMeanCloudTopPressure(modisIN%nSunlit), & + modisMeanLiquidWaterPath(modisIN%nSunlit), & + modisMeanIceWaterPath(modisIN%nSunlit), & + modisJointHistogram(modisIN%nSunlit,numMODISTauBins,numMODISPresBins),& + modisJointHistogramIce(modisIN%nSunlit,numModisTauBins,numMODISReffIceBins),& + modisJointHistogramLiq(modisIN%nSunlit,numModisTauBins,numMODISReffLiqBins),& + modisJointHistogram_CtpCodLiq(modisIN%nSunlit,numMODISTauBins,numMODISPresBins),& + modisJointHistogram_CtpCodIce(modisIN%nSunlit,numMODISTauBins,numMODISPresBins),& + modisJointHistogram_LwpRefLiq(modisIN%nSunlit,numMODISLWPBins,numMODISReffLiqBins), & + modisJointHistogram_IwpRefIce(modisIN%nSunlit,numMODISIWPBins,numMODISReffIceBins) & + ) + ! Call simulator + call modis_column(modisIN%nSunlit, modisIN%Ncolumns,modisRetrievedPhase, & + modisRetrievedCloudTopPressure,modisRetrievedTau, & + modisRetrievedSize, modisCfTotal, modisCfLiquid, modisCfIce,& + modisCfHigh, modisCfMid, modisCfLow, modisMeanTauTotal, & + modisMeanTauLiquid, modisMeanTauIce, modisMeanLogTauTotal, & + modisMeanLogTauLiquid, modisMeanLogTauIce, & + modisMeanSizeLiquid, modisMeanSizeIce, & + modisMeanCloudTopPressure, modisMeanLiquidWaterPath, & + modisMeanIceWaterPath, modisJointHistogram, & + modisJointHistogramIce,modisJointHistogramLiq, & + modisJointHistogram_CtpCodLiq, & + modisJointHistogram_CtpCodIce, & + modisJointHistogram_LwpRefLiq, & + modisJointHistogram_IwpRefIce & + ) + ! Store data (if requested) + if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) then + cospOUT%modis_Cloud_Fraction_Total_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisCfTotal + endif + if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) then + cospOUT%modis_Cloud_Fraction_Water_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisCfLiquid + endif + if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) then + cospOUT%modis_Cloud_Fraction_Ice_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisCfIce + endif + if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) then + cospOUT%modis_Cloud_Fraction_High_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisCfHigh + endif + if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) then + cospOUT%modis_Cloud_Fraction_Mid_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisCfMid + endif + if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) then + cospOUT%modis_Cloud_Fraction_Low_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisCfLow + endif + if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) then + cospOUT%modis_Optical_Thickness_Total_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisMeanTauTotal + endif + if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) then + cospOUT%modis_Optical_Thickness_Water_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisMeanTauLiquid + endif + if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) then + cospOUT%modis_Optical_Thickness_Ice_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisMeanTauIce + endif + if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) then + cospOUT%modis_Optical_Thickness_Total_LogMean(ij+int(modisIN%sunlit(:))-1)= & + modisMeanLogTauTotal + endif + if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) then + cospOUT%modis_Optical_Thickness_Water_LogMean(ij+int(modisIN%sunlit(:))-1) = & + modisMeanLogTauLiquid + endif + if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) then + cospOUT%modis_Optical_Thickness_Ice_LogMean(ij+int(modisIN%sunlit(:))-1) = & + modisMeanLogTauIce + endif + if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) then + cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisMeanSizeLiquid + endif + if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) then + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisMeanSizeIce + endif + if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) then + cospOUT%modis_Cloud_Top_Pressure_Total_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisMeanCloudTopPressure + endif + if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) then + cospOUT%modis_Liquid_Water_Path_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisMeanLiquidWaterPath + endif + if (associated(cospOUT%modis_Ice_Water_Path_Mean)) then + cospOUT%modis_Ice_Water_Path_Mean(ij+int(modisIN%sunlit(:))-1) = & + modisMeanIceWaterPath + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) then + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(ij+ & + int(modisIN%sunlit(:))-1, 1:numModisTauBins, :) = modisJointHistogram(:, :, :) + ! Reorder pressure bins in joint histogram to go from surface to TOA + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(ij:ik,:,:) = & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(ij:ik,:,numMODISPresBins:1:-1) + endif + + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) then + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(ij+ & + int(modisIN%sunlit(:))-1, 1:numModisTauBins, :) = modisJointHistogram_CtpCodLiq(:, :, :) + ! Reorder pressure bins in joint histogram to go from surface to TOA + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(ij:ik,:,:) = & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(ij:ik,:,numMODISPresBins:1:-1) + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) then + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(ij+ & + int(modisIN%sunlit(:))-1, 1:numModisTauBins, :) = modisJointHistogram_CtpCodIce(:, :, :) + ! Reorder pressure bins in joint histogram to go from surface to TOA + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(ij:ik,:,:) = & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(ij:ik,:,numMODISPresBins:1:-1) + endif + if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) then + cospOUT%modis_LWP_vs_ReffLIQ(ij+int(modisIN%sunlit(:))-1, 1:numMODISLWPBins,:) = & + modisJointHistogram_LwpRefLiq(:,:,:) + endif + if (associated(cospOUT%modis_IWP_vs_ReffICE)) then + cospOUT%modis_IWP_vs_ReffICE(ij+int(modisIN%sunlit(:))-1, 1:numMODISIWPBins,:) = & + modisJointHistogram_IwpRefIce(:,:,:) + endif + + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffIce)) then + cospOUT%modis_Optical_Thickness_vs_ReffIce(ij:ik,1:numMODISTauBins,:) = 0.0 + cospOUT%modis_Optical_Thickness_vs_ReffIce(ij+int(modisIN%sunlit(:))-1, 1:numMODISTauBins,:) = & + modisJointHistogramIce(:,:,:) + endif + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLiq)) then + cospOUT%modis_Optical_Thickness_vs_ReffLiq(ij:ik,:,:) = 0.0 + cospOUT%modis_Optical_Thickness_vs_ReffLiq(ij+int(modisIN%sunlit(:))-1, 1:numMODISTauBins,:) = & + modisJointHistogramLiq(:,:,:) + endif + + if(modisIN%nSunlit < modisIN%Npoints) then + ! Where it's night and we haven't done the retrievals the values are undefined + if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & + cospOUT%modis_Cloud_Fraction_Total_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & + cospOUT%modis_Cloud_Fraction_Water_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & + cospOUT%modis_Cloud_Fraction_Ice_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & + cospOUT%modis_Cloud_Fraction_High_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & + cospOUT%modis_Cloud_Fraction_Mid_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & + cospOUT%modis_Cloud_Fraction_Low_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & + cospOUT%modis_Optical_Thickness_Total_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & + cospOUT%modis_Optical_Thickness_Water_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & + cospOUT%modis_Optical_Thickness_Ice_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & + cospOUT%modis_Optical_Thickness_Total_LogMean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & + cospOUT%modis_Optical_Thickness_Water_LogMean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & + cospOUT%modis_Optical_Thickness_Ice_LogMean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & + cospOUT%modis_Cloud_Top_Pressure_Total_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & + cospOUT%modis_Liquid_Water_Path_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & + cospOUT%modis_Ice_Water_Path_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(ij+int(modisIN%notSunlit(:))-1, :, :) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(ij+int(modisIN%notSunlit(:))-1, :, :) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(ij+int(modisIN%notSunlit(:))-1, :, :) = R_UNDEF + end if + else + ! It's nightime everywhere - everything is undefined + if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & + cospOUT%modis_Cloud_Fraction_Total_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & + cospOUT%modis_Cloud_Fraction_Water_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & + cospOUT%modis_Cloud_Fraction_Ice_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & + cospOUT%modis_Cloud_Fraction_High_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & + cospOUT%modis_Cloud_Fraction_Mid_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & + cospOUT%modis_Cloud_Fraction_Low_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & + cospOUT%modis_Optical_Thickness_Total_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & + cospOUT%modis_Optical_Thickness_Water_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & + cospOUT%modis_Optical_Thickness_Ice_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & + cospOUT%modis_Optical_Thickness_Total_LogMean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & + cospOUT%modis_Optical_Thickness_Water_LogMean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & + cospOUT%modis_Optical_Thickness_Ice_LogMean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & + cospOUT%modis_Cloud_Top_Pressure_Total_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & + cospOUT%modis_Liquid_Water_Path_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & + cospOUT%modis_Ice_Water_Path_Mean(ij:ik) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(ij:ik, :, :) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(ij+int(modisIN%notSunlit(:))-1, :, :) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(ij+int(modisIN%notSunlit(:))-1, :, :) = R_UNDEF + endif + ! Free up memory (if necessary) + if (allocated(modisRetrievedTau)) deallocate(modisRetrievedTau) + if (allocated(modisRetrievedSize)) deallocate(modisRetrievedSize) + if (allocated(modisRetrievedPhase)) deallocate(modisRetrievedPhase) + if (allocated(modisRetrievedCloudTopPressure)) deallocate(modisRetrievedCloudTopPressure) + if (allocated(modisCftotal)) deallocate(modisCftotal) + if (allocated(modisCfLiquid)) deallocate(modisCfLiquid) + if (allocated(modisCfIce)) deallocate(modisCfIce) + if (allocated(modisCfHigh)) deallocate(modisCfHigh) + if (allocated(modisCfMid)) deallocate(modisCfMid) + if (allocated(modisCfLow)) deallocate(modisCfLow) + if (allocated(modisMeanTauTotal)) deallocate(modisMeanTauTotal) + if (allocated(modisMeanTauLiquid)) deallocate(modisMeanTauLiquid) + if (allocated(modisMeanTauIce)) deallocate(modisMeanTauIce) + if (allocated(modisMeanLogTauTotal)) deallocate(modisMeanLogTauTotal) + if (allocated(modisMeanLogTauLiquid)) deallocate(modisMeanLogTauLiquid) + if (allocated(modisMeanLogTauIce)) deallocate(modisMeanLogTauIce) + if (allocated(modisMeanSizeLiquid)) deallocate(modisMeanSizeLiquid) + if (allocated(modisMeanSizeIce)) deallocate(modisMeanSizeIce) + if (allocated(modisMeanCloudTopPressure)) deallocate(modisMeanCloudTopPressure) + if (allocated(modisMeanLiquidWaterPath)) deallocate(modisMeanLiquidWaterPath) + if (allocated(modisMeanIceWaterPath)) deallocate(modisMeanIceWaterPath) + if (allocated(modisJointHistogram)) deallocate(modisJointHistogram) + if (allocated(modisJointHistogram_CtpCodLiq)) deallocate(modisJointHistogram_CtpCodLiq) + if (allocated(modisJointHistogram_CtpCodIce)) deallocate(modisJointHistogram_CtpCodIce) + if (allocated(modisJointHistogram_LwpRefLiq)) deallocate(modisJointHistogram_LwpRefLiq) + if (allocated(modisJointHistogram_IwpRefIce)) deallocate(modisJointHistogram_IwpRefIce) + if (allocated(modisJointHistogramIce)) deallocate(modisJointHistogramIce) + if (allocated(modisJointHistogramLiq)) deallocate(modisJointHistogramLiq) + if (allocated(isccp_boxttop)) deallocate(isccp_boxttop) + if (allocated(isccp_boxptop)) deallocate(isccp_boxptop) + if (allocated(isccp_boxtau)) deallocate(isccp_boxtau) + if (allocated(isccp_meantbclr)) deallocate(isccp_meantbclr) + if (allocated(isccpLEVMATCH)) deallocate(isccpLEVMATCH) + if (allocated(MODIS_SWATH_MASK)) deallocate(MODIS_SWATH_MASK) + endif + + ! RTTOV multi-instrument + if (Lrttov_column) then + do i=1,cospIN%Ninst_rttov + ! Allocate memory for the outputs - I won't need all of these in every situation. + ! Only allocate clear-sky memory when PC-RTTOV is run. + if (cospIN % cfg_rttov(i) % Lrttov_pc) then + allocate(rttov_bt_clear(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! all-sky brightness temp + allocate(rttov_rad_clear(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! all-sky radiance + rttov_bt_clear(:,:) = R_UNDEF + rttov_rad_clear(:,:) = R_UNDEF + ! Run simulator + call cosp_rttov_simulate(rttovIN,cospIN%cfg_rttov(i), & ! Inputs + cosp_simulator(nError+1), & ! Error message holder + bt_clear=rttov_bt_clear, & ! Clear-sky BT + rad_clear=rttov_rad_clear) ! Clear-sky radiance + else + allocate(rttov_bt_total(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! all-sky brightness temp + allocate(rttov_bt_clear(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! clear-sky brightness temp + allocate(rttov_rad_total(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! all-sky brightness temp + allocate(rttov_rad_clear(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! clear-sky brightness temp + allocate(rttov_rad_cloudy(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! cloudy-sky brightness temp + allocate(rttov_refl_total(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! all-sky Bi-directional reflectance factor + allocate(rttov_refl_clear(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! clear-sky Bi-directional reflectance factor + ! Init to R_UNDEF + rttov_bt_total(:,:) = R_UNDEF + rttov_bt_clear(:,:) = R_UNDEF + rttov_rad_total(:,:) = R_UNDEF + rttov_rad_clear(:,:) = R_UNDEF + rttov_rad_cloudy(:,:) = R_UNDEF + rttov_refl_total(:,:) = R_UNDEF + rttov_refl_clear(:,:) = R_UNDEF + ! Run simulator + call cosp_rttov_simulate(rttovIN,cospIN%cfg_rttov(i), & ! Inputs + cosp_simulator(nError+1), & ! Error message holder + bt_total=rttov_bt_total, & ! Brightness Temp Outputs + bt_clear=rttov_bt_clear, & + rad_total=rttov_rad_total, & ! Radiance Outputs + rad_clear=rttov_rad_clear, & + rad_cloudy=rttov_rad_cloudy, & + refl_total=rttov_refl_total, & ! Reflectance Outputs + refl_clear=rttov_refl_clear, & + debug=verbose) + endif + + ! Write to cospOUT + if (associated(cospOUT % rttov_outputs(i) % channel_indices)) & + cospOUT % rttov_outputs(i) % channel_indices(:) = cospIN % cfg_rttov(i) % iChannel + if (cospIN % cfg_rttov(i) % Lrttov_pc) then + if (associated(cospOUT % rttov_outputs(i) % bt_total_pc)) & + cospOUT % rttov_outputs(i) % bt_total_pc(ij:ik,:) = rttov_bt_clear + if (associated(cospOUT % rttov_outputs(i) % rad_total_pc)) & + cospOUT % rttov_outputs(i) % rad_total_pc(ij:ik,:) = rttov_rad_clear + else + if (associated(cospOUT % rttov_outputs(i) % bt_total)) & + cospOUT % rttov_outputs(i) % bt_total(ij:ik,:) = rttov_bt_total + if (associated(cospOUT % rttov_outputs(i) % bt_clear)) & + cospOUT % rttov_outputs(i) % bt_clear(ij:ik,:) = rttov_bt_clear + if (associated(cospOUT % rttov_outputs(i) % rad_total)) & + cospOUT % rttov_outputs(i) % rad_total(ij:ik,:) = rttov_rad_total + if (associated(cospOUT % rttov_outputs(i) % rad_clear)) & + cospOUT % rttov_outputs(i) % rad_clear(ij:ik,:) = rttov_rad_clear + if (associated(cospOUT % rttov_outputs(i) % rad_cloudy)) & + cospOUT % rttov_outputs(i) % rad_cloudy(ij:ik,:) = rttov_rad_cloudy + if (associated(cospOUT % rttov_outputs(i) % refl_total)) & + cospOUT % rttov_outputs(i) % refl_total(ij:ik,:) = rttov_refl_total + if (associated(cospOUT % rttov_outputs(i) % refl_clear)) & + cospOUT % rttov_outputs(i) % refl_clear(ij:ik,:) = rttov_refl_clear + endif + + ! Free up memory from output (if necessary) + if (allocated(rttov_bt_total)) deallocate(rttov_bt_total) + if (allocated(rttov_bt_clear)) deallocate(rttov_bt_clear) + if (allocated(rttov_rad_total)) deallocate(rttov_rad_total) + if (allocated(rttov_rad_clear)) deallocate(rttov_rad_clear) + if (allocated(rttov_rad_cloudy)) deallocate(rttov_rad_cloudy) + if (allocated(rttov_refl_total)) deallocate(rttov_refl_total) + if (allocated(rttov_refl_clear)) deallocate(rttov_refl_clear) + + end do + + endif + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! 6) Compute multi-instrument products + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + ! CLOUDSAT/CALIPSO products + if (Lradar_lidar_tcc .or. Llidar_only_freq_cloud .or. Lcloudsat_tcc .or. Lcloudsat_tcc2) then + if (calipsoIN%Npoints .gt. 0) then + if (use_vgrid) then + allocate(lidar_only_freq_cloud(cloudsatIN%Npoints,Nlvgrid), & + radar_lidar_tcc(cloudsatIN%Npoints), cloudsat_tcc(cloudsatIN%Npoints), & + cloudsat_tcc2(cloudsatIN%Npoints)) + allocate(betamol_in(cloudsatIN%Npoints,1,cloudsatIN%Nlevels), & + betamolI(cloudsatIN%Npoints,1,Nlvgrid), & + pnormI(cloudsatIN%Npoints,cloudsatIN%Ncolumns,Nlvgrid), & + Ze_totI(cloudsatIN%Npoints,cloudsatIN%Ncolumns,Nlvgrid)) + + ! Regrid in the vertical (*NOTE* This routine requires SFC-2-TOA ordering, so flip + ! inputs and outputs to maintain TOA-2-SFC ordering convention in COSP2.) + ! Use CLOUDSAT masking array here (it is the same as calipso) + if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + betamol_in(:,1,:) = calipso_beta_mol(:,cloudsatIN%Nlevels:1:-1) + call cosp_change_vertical_grid(cloudsatIN%Npoints,1,cloudsatIN%Nlevels, & + cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & + cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1),betamol_in, & + Nlvgrid,vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1), & + betamolI(:,1,Nlvgrid:1:-1)) + call cosp_change_vertical_grid(cloudsatIN%Npoints,cloudsatIN%Ncolumns, & + cloudsatIN%Nlevels,cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & + cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & + calipso_beta_tot(:,:,cloudsatIN%Nlevels:1:-1),Nlvgrid, & + vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1),pnormI(:,:,Nlvgrid:1:-1)) + call cosp_change_vertical_grid(cloudsatIN%Npoints,cloudsatIN%Ncolumns, & + cloudsatIN%Nlevels,cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & + cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & + cloudsatDBZe(:,:,cloudsatIN%Nlevels:1:-1),Nlvgrid,vgrid_zl(Nlvgrid:1:-1), & + vgrid_zu(Nlvgrid:1:-1),Ze_totI(:,:,Nlvgrid:1:-1),log_units=.true.) + else + betamol_in(:,1,:) = calipso_beta_mol(:,cloudsatIN%Nlevels:1:-1) + call cosp_change_vertical_grid(cloudsatIN%Npoints,1,cloudsatIN%Nlevels, & + cospgridIN%hgt_matrix(:,cloudsatIN%Nlevels:1:-1), & + cospgridIN%hgt_matrix_half(:,cloudsatIN%Nlevels:1:-1),betamol_in, & + Nlvgrid,vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1), & + betamolI(:,1,Nlvgrid:1:-1)) + + call cosp_change_vertical_grid(cloudsatIN%Npoints,cloudsatIN%Ncolumns, & + cloudsatIN%Nlevels,cospgridIN%hgt_matrix(:,cloudsatIN%Nlevels:1:-1), & + cospgridIN%hgt_matrix_half(:,cloudsatIN%Nlevels:1:-1), & + calipso_beta_tot(:,:,cloudsatIN%Nlevels:1:-1),Nlvgrid, & + vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1),pnormI(:,:,Nlvgrid:1:-1)) + + call cosp_change_vertical_grid(cloudsatIN%Npoints,cloudsatIN%Ncolumns, & + cloudsatIN%Nlevels,cospgridIN%hgt_matrix(:,cloudsatIN%Nlevels:1:-1), & + cospgridIN%hgt_matrix_half(:,cloudsatIN%Nlevels:1:-1), & + cloudsatDBZe(:,:,cloudsatIN%Nlevels:1:-1),Nlvgrid,vgrid_zl(Nlvgrid:1:-1), & + vgrid_zu(Nlvgrid:1:-1),Ze_totI(:,:,Nlvgrid:1:-1),log_units=.true.) + end if + call cosp_lidar_only_cloud(cloudsatIN%Npoints, cloudsatIN%Ncolumns, Nlvgrid, & + pnormI, betamolI, Ze_totI, lidar_only_freq_cloud, radar_lidar_tcc, & + cloudsat_tcc, cloudsat_tcc2) + deallocate(betamol_in,betamolI,pnormI,ze_totI) + else + allocate(lidar_only_freq_cloud(cloudsatIN%Npoints,cloudsatIN%Nlevels), & + radar_lidar_tcc(cloudsatIN%Npoints), cloudsat_tcc(cloudsatIN%Npoints), & + cloudsat_tcc2(cloudsatIN%Npoints)) + call cosp_lidar_only_cloud(cloudsatIN%Npoints,cloudsatIN%Ncolumns, & + cospIN%Nlevels,calipso_beta_tot(:,:,cloudsatIN%Nlevels:1:-1), & + calipso_beta_mol(:,cloudsatIN%Nlevels:1:-1), & + cloudsatDBZe(:,:,cloudsatIN%Nlevels:1:-1),lidar_only_freq_cloud, & + radar_lidar_tcc, cloudsat_tcc, cloudsat_tcc2) + endif + endif + + ! Store, when necessary + if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + if (associated(cospOUT%lidar_only_freq_cloud)) then + cospOUT%lidar_only_freq_cloud(ij:ik,:) = R_UNDEF + cospOUT%lidar_only_freq_cloud(ij+int(CSCAL_MASK_INDICES(:))-1,:) = lidar_only_freq_cloud(:,:) + endif + if (associated(cospOUT%radar_lidar_tcc)) then + cospOUT%radar_lidar_tcc(ij:ik) = R_UNDEF + cospOUT%radar_lidar_tcc(ij+int(CSCAL_MASK_INDICES(:))-1) = radar_lidar_tcc(:) + endif + if (associated(cospOUT%cloudsat_tcc)) then + cospOUT%cloudsat_tcc(ij:ik) = R_UNDEF + cospOUT%cloudsat_tcc(ij+int(CSCAL_MASK_INDICES(:))-1) = cloudsat_tcc(:) + endif + if (associated(cospOUT%cloudsat_tcc2)) then + cospOUT%cloudsat_tcc2(ij:ik) = R_UNDEF + cospOUT%cloudsat_tcc2(ij+int(CSCAL_MASK_INDICES(:))-1) = cloudsat_tcc2(:) + endif + else + if (associated(cospOUT%lidar_only_freq_cloud)) then + cospOUT%lidar_only_freq_cloud(ij:ik,:) = lidar_only_freq_cloud + endif + if (associated(cospOUT%radar_lidar_tcc)) then + cospOUT%radar_lidar_tcc(ij:ik) = radar_lidar_tcc + endif + if (associated(cospOUT%cloudsat_tcc)) then + cospOUT%cloudsat_tcc(ij:ik) = cloudsat_tcc + endif + if (associated(cospOUT%cloudsat_tcc2)) then + cospOUT%cloudsat_tcc2(ij:ik) = cloudsat_tcc2 + endif + endif + endif + + ! CloudSat/MODIS joint products (CFODDs and Occurrence Frequency of Warm Clouds) + if (Lcloudsat_modis_wr) then + if (cloudsatIN%Npoints .gt. 0) then + allocate( cfodd_ntotal(cloudsatIN%Npoints, CFODD_NDBZE, CFODD_NICOD, CFODD_NCLASS) ) + allocate( wr_occfreq_ntotal(cloudsatIN%Npoints, WR_NREGIME) ) + + if ( use_vgrid ) then + !! interporation for fixed vertical grid: + allocate( zlev(cloudsatIN%Npoints,Nlvgrid), & + t_in(cloudsatIN%Npoints,1,cloudsatIN%Nlevels), & + tempI(cloudsatIN%Npoints,1,Nlvgrid), & + Ze_totI(cloudsatIN%Npoints,cloudsatIN%Ncolumns,Nlvgrid), & + frac_outI(cloudsatIN%Npoints,cloudsatIN%Ncolumns,Nlvgrid) ) + do k = 1, Nlvgrid + zlev(:,k) = vgrid_zu(k) + enddo + ! Use CLOUDSAT masking array here (it is the same as calipso) + if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + t_in(:,1,:) = cospgridIN%at(int(CSCAL_MASK_INDICES(:)),:) + call cosp_change_vertical_grid ( & + cloudsatIN%Npoints, 1, cloudsatIN%Nlevels, & + cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & + cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & + t_in(:,:,cloudsatIN%Nlevels:1:-1), Nlvgrid, & + vgrid_zl(Nlvgrid:1:-1), vgrid_zu(Nlvgrid:1:-1), & + tempI(:,:,Nlvgrid:1:-1) ) + call cosp_change_vertical_grid ( & + cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels, & + cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & + cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & + cloudsatDBZe(:,:,cloudsatIN%Nlevels:1:-1), Nlvgrid, & + vgrid_zl(Nlvgrid:1:-1), vgrid_zu(Nlvgrid:1:-1), & + Ze_totI(:,:,Nlvgrid:1:-1), log_units=.true. ) + call cosp_change_vertical_grid ( & + cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels, & + cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & + cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & + cospIN%frac_out(int(CSCAL_MASK_INDICES(:)),:,cloudsatIN%Nlevels:1:-1), Nlvgrid, & + vgrid_zl(Nlvgrid:1:-1), vgrid_zu(Nlvgrid:1:-1), & + frac_outI(:,:,Nlvgrid:1:-1) ) + call cosp_diag_warmrain( & + cloudsatIN%Npoints, cloudsatIN%Ncolumns, Nlvgrid, & !! in + tempI, zlev, & !! in + cospOUT%modis_Liquid_Water_Path_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Optical_Thickness_Water_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Cloud_Fraction_Water_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Ice_Water_Path_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Optical_Thickness_Ice_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Cloud_Fraction_Ice_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + frac_outI, & !! in + Ze_totI, & !! in + cfodd_ntotal, wr_occfreq_ntotal ) !! inout + else + t_in(:,1,:) = cospgridIN%at(:,:) + call cosp_change_vertical_grid ( & + cloudsatIN%Npoints, 1, cloudsatIN%Nlevels, & + cospgridIN%hgt_matrix(:,cloudsatIN%Nlevels:1:-1), & + cospgridIN%hgt_matrix_half(:,cloudsatIN%Nlevels:1:-1), & + t_in(:,:,cloudsatIN%Nlevels:1:-1), Nlvgrid, & + vgrid_zl(Nlvgrid:1:-1), vgrid_zu(Nlvgrid:1:-1), & + tempI(:,:,Nlvgrid:1:-1) ) + call cosp_change_vertical_grid ( & + cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels, & + cospgridIN%hgt_matrix(:,cloudsatIN%Nlevels:1:-1), & + cospgridIN%hgt_matrix_half(:,cloudsatIN%Nlevels:1:-1), & + cloudsatDBZe(:,:,cloudsatIN%Nlevels:1:-1), Nlvgrid, & + vgrid_zl(Nlvgrid:1:-1), vgrid_zu(Nlvgrid:1:-1), & + Ze_totI(:,:,Nlvgrid:1:-1), log_units=.true. ) + call cosp_change_vertical_grid ( & + cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels, & + cospgridIN%hgt_matrix(:,cloudsatIN%Nlevels:1:-1), & + cospgridIN%hgt_matrix_half(:,cloudsatIN%Nlevels:1:-1), & + cospIN%frac_out(:,:,cloudsatIN%Nlevels:1:-1), Nlvgrid, & + vgrid_zl(Nlvgrid:1:-1), vgrid_zu(Nlvgrid:1:-1), & + frac_outI(:,:,Nlvgrid:1:-1) ) + call cosp_diag_warmrain( & + cloudsatIN%Npoints, cloudsatIN%Ncolumns, Nlvgrid, & !! in + tempI, zlev, & !! in + cospOUT%modis_Liquid_Water_Path_Mean(ij:ik), & !! in + cospOUT%modis_Optical_Thickness_Water_Mean(ij:ik), & !! in + cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij:ik), & !! in + cospOUT%modis_Cloud_Fraction_Water_Mean(ij:ik), & !! in + cospOUT%modis_Ice_Water_Path_Mean(ij:ik), & !! in + cospOUT%modis_Optical_Thickness_Ice_Mean(ij:ik), & !! in + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij:ik), & !! in + cospOUT%modis_Cloud_Fraction_Ice_Mean(ij:ik), & !! in + frac_outI, & !! in + Ze_totI, & !! in + cfodd_ntotal, wr_occfreq_ntotal ) !! inout + endif + deallocate( zlev, t_in, tempI, frac_outI, Ze_totI ) + else ! do not use vgrid interporation ---------------------------------------! + !! original model grid + if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + call cosp_diag_warmrain( & + cloudsatIN%Npoints, cloudsatIN%Ncolumns, cospIN%Nlevels, & !! in + cospgridIN%at(int(CSCAL_MASK_INDICES(:)),:), & !! in + cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),:), & !! in + cospOUT%modis_Liquid_Water_Path_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Optical_Thickness_Water_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Cloud_Fraction_Water_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Ice_Water_Path_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Optical_Thickness_Ice_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospOUT%modis_Cloud_Fraction_Ice_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in + cospIN%frac_out(int(CSCAL_MASK_INDICES(:)),:,:), & !! in + cloudsatDBZe, & !! in + cfodd_ntotal, wr_occfreq_ntotal ) !! inout + else + call cosp_diag_warmrain( & + cloudsatIN%Npoints, cloudsatIN%Ncolumns, cospIN%Nlevels, & !! in + cospgridIN%at, cospgridIN%hgt_matrix, & !! in + cospOUT%modis_Liquid_Water_Path_Mean(ij:ik), & !! in + cospOUT%modis_Optical_Thickness_Water_Mean(ij:ik), & !! in + cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij:ik), & !! in + cospOUT%modis_Cloud_Fraction_Water_Mean(ij:ik), & !! in + cospOUT%modis_Ice_Water_Path_Mean(ij:ik), & !! in + cospOUT%modis_Optical_Thickness_Ice_Mean(ij:ik), & !! in + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij:ik), & !! in + cospOUT%modis_Cloud_Fraction_Ice_Mean(ij:ik), & !! in + cospIN%frac_out, & !! in + cloudsatDBZe, & !! in + cfodd_ntotal, wr_occfreq_ntotal ) !! inout + endif + endif !! use_vgrid or not + + ! Store, when necessary + if (associated(cospOUT%lidar_only_freq_cloud)) then + if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays + cospOUT%lidar_only_freq_cloud(ij+int(CSCAL_MASK_INDICES(:))-1,:) = lidar_only_freq_cloud(:,:) + else + cospOUT%lidar_only_freq_cloud(ij:ik,:) = lidar_only_freq_cloud + endif + endif + + if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays for CSCAL + if (cospIN % cospswathsIN(6) % N_inst_swaths .gt. 0) then ! If MODIS is also swathed then use the joint mask MODIS_CSCAL_MASK_INDICES for setting R_UNDEF + if ( associated(cospOUT%cfodd_ntotal) ) then + cospOUT%cfodd_ntotal(ij+int(CSCAL_MASK_INDICES(:))-1,:,:,:) = cfodd_ntotal + cospOUT%cfodd_ntotal(ij+int(MODIS_CSCAL_MASK_INDICES(:))-1,:,:,:) = R_UNDEF + endif + if ( associated(cospOUT%wr_occfreq_ntotal) ) then + cospOUT%wr_occfreq_ntotal(ij+int(CSCAL_MASK_INDICES(:))-1,:) = wr_occfreq_ntotal + cospOUT%wr_occfreq_ntotal(ij+int(MODIS_CSCAL_MASK_INDICES(:))-1,:) = R_UNDEF + endif + else + if ( associated(cospOUT%cfodd_ntotal) ) then + cospOUT%cfodd_ntotal(ij:ik,:,:,:) = R_UNDEF + cospOUT%cfodd_ntotal(ij+int(CSCAL_MASK_INDICES(:))-1,:,:,:) = cfodd_ntotal + endif + if ( associated(cospOUT%wr_occfreq_ntotal) ) then + cospOUT%wr_occfreq_ntotal(ij:ik,:) = R_UNDEF + cospOUT%wr_occfreq_ntotal(ij+int(CSCAL_MASK_INDICES(:))-1,:) = wr_occfreq_ntotal + endif + endif + else + if ( associated(cospOUT%cfodd_ntotal) ) then + cospOUT%cfodd_ntotal(ij:ik,:,:,:) = cfodd_ntotal + endif + if ( associated(cospOUT%wr_occfreq_ntotal) ) then + cospOUT%wr_occfreq_ntotal(ij:ik,:) = wr_occfreq_ntotal + endif + endif + else + if ( associated(cospOUT%cfodd_ntotal) ) cospOUT%cfodd_ntotal(ij:ik,:,:,:) = R_UNDEF + if ( associated(cospOUT%wr_occfreq_ntotal) ) cospOUT%wr_occfreq_ntotal(ij:ik,:) = R_UNDEF + endif + endif + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! 7) Cleanup + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (Lisccp_subcolumn .or. Lmodis_subcolumn) then + nullify(isccpIN%Ncolumns,isccpIN%Nlevels,isccpIN%emsfc_lw, & + isccpIN%skt,isccpIN%qv,isccpIN%at,isccpIN%frac_out,isccpIN%dtau, & + isccpIN%dem,isccpIN%phalf,isccpIN%sunlit,isccpIN%pfull) + call COSP_ASSIGN_isccpIN_CLEAN() + endif + + if (Lmisr_subcolumn) then + nullify(misrIN%Ncolumns,misrIN%Nlevels,misrIN%dtau,misrIN%sunlit, & + misrIN%zfull,misrIN%at) + call COSP_ASSIGN_misrIN_CLEAN() + endif + + if (Lcalipso_subcolumn) then + nullify(calipsoIN%Ncolumns,calipsoIN%Nlevels,calipsoIN%beta_mol,& + calipsoIN%betatot,calipsoIN%betatot_liq,calipsoIN%betatot_ice, & + calipsoIN%tau_mol,calipsoIN%tautot,calipsoIN%tautot_liq,calipsoIN%tautot_ice) + if (allocated(CSCAL_MASK_INDICES)) deallocate(CSCAL_MASK_INDICES) + if (allocated(CSCAL_SWATH_MASK)) deallocate(CSCAL_SWATH_MASK) + call COSP_ASSIGN_calipsoIN_CLEAN() + endif + + if (LgrLidar532_subcolumn) then + nullify(grLidar532IN%Npoints,grLidar532IN%Ncolumns,grLidar532IN%Nlevels,grLidar532IN%beta_mol, & + grLidar532IN%betatot,grLidar532IN%tau_mol,grLidar532IN%tautot) + endif + + if (Latlid_subcolumn) then + nullify(atlidIN%Ncolumns,atlidIN%Nlevels,atlidIN%beta_mol_atlid, & + atlidIN%betatot_atlid,atlidIN%tau_mol_atlid,atlidIN%tautot_atlid) + call COSP_ASSIGN_atlidIN_CLEAN() + endif + + if (Lparasol_subcolumn) then + nullify(parasolIN%Nlevels,parasolIN%Ncolumns,parasolIN%Nrefl, & + parasolIN%tautot_S_liq,parasolIN%tautot_S_ice) + call COSP_ASSIGN_parasolIN_CLEAN() + endif + + if (Lcloudsat_subcolumn) then + nullify(cloudsatIN%Nlevels,cloudsatIN%Ncolumns,cloudsatIN%rcfg,& + cloudsatIN%kr_vol,cloudsatIN%g_vol,cloudsatIN%z_vol,cloudsatIN%hgt_matrix) + call COSP_ASSIGN_cloudsatIN_CLEAN() + if (allocated(CSCAL_MASK_INDICES)) deallocate(CSCAL_MASK_INDICES) + if (allocated(CSCAL_SWATH_MASK)) deallocate(CSCAL_SWATH_MASK) + endif + + if (Lmodis_subcolumn) then + nullify(modisIN%Npoints,modisIN%Ncolumns,modisIN%Nlevels,modisIN%tau,modisIN%g, & + modisIN%liqFrac,modisIN%w0) + if (allocated(modisIN%sunlit)) deallocate(modisIN%sunlit) + if (allocated(modisIN%notSunlit)) deallocate(modisIN%notSunlit) + if (allocated(modisIN%pres)) deallocate(modisIN%pres) + if (allocated(MODIS_CSCAL_MASK_INDICES)) deallocate(MODIS_CSCAL_MASK_INDICES) + endif + + if (Lrttov_column) then + nullify(rttovIN%nPoints,rttovIN%nLevels,rttovIN%nSubCols,rttovIN%co2,rttovIN%ch4, & + rttovIN%n2o,rttovIN%co,rttovIN%h_surf,rttovIN%u_surf,rttovIN%v_surf, & + rttovIN%t_skin,rttovIN%p_surf,rttovIN%sfcmask,rttovIN%latitude, & + rttovIN%longitude,rttovIN%p,rttovIN%ph,rttovIN%q2m,rttovIN%t2m,rttovIN%t, & + rttovIN%q,rttovIN%o3,rttovIN%rttov_date,rttovIN%rttov_time,rttovIN%tca, & + rttovIN%cldLiq,rttovIN%cldIce,rttovIN%DeffLiq,rttovIN%DeffIce, & + rttovIN%fl_rain,rttovIN%fl_snow) + endif + + if (allocated(calipso_beta_tot)) deallocate(calipso_beta_tot) + if (allocated(grLidar532_beta_tot)) deallocate(grLidar532_beta_tot) + if (allocated(atlid_beta_tot)) deallocate(atlid_beta_tot) + if (allocated(calipso_beta_mol)) deallocate(calipso_beta_mol) + if (allocated(grLidar532_beta_mol)) deallocate(grLidar532_beta_mol) + if (allocated(atlid_beta_mol)) deallocate(atlid_beta_mol) + if (allocated(calipso_betaperp_tot)) deallocate(calipso_betaperp_tot) + if (allocated(cloudsatDBZe)) deallocate(cloudsatDBZe) + if (allocated(lidar_only_freq_cloud)) deallocate(lidar_only_freq_cloud) + if (allocated(radar_lidar_tcc)) deallocate(radar_lidar_tcc) + if (allocated(cloudsat_tcc)) deallocate(cloudsat_tcc) + if (allocated(cloudsat_tcc2)) deallocate(cloudsat_tcc2) + if (allocated(cfodd_ntotal)) deallocate(cfodd_ntotal) + if (allocated(wr_occfreq_ntotal)) deallocate(wr_occfreq_ntotal) + + end function COSP_SIMULATOR + ! ###################################################################################### + ! SUBROUTINE cosp_init + ! ###################################################################################### + SUBROUTINE COSP_INIT(Lisccp, Lmodis, Lmisr, Lcloudsat, Lcalipso, LgrLidar532, Latlid, Lparasol, Lrttov, & + cloudsat_radar_freq, cloudsat_k2, cloudsat_use_gas_abs, cloudsat_do_ray, & + isccp_top_height, isccp_top_height_direction, surface_radar, rcfg, lusevgrid, & + luseCSATvgrid, Nvgrid, Nlevels, cloudsat_micro_scheme, & + rttov_Ninstruments, rttov_instrument_namelists,rttov_configs,unitn,debug) + + ! INPUTS + logical,intent(in) :: Lisccp,Lmodis,Lmisr,Lcloudsat,Lcalipso,LgrLidar532,Latlid,Lparasol + logical,intent(inout) :: Lrttov + integer,intent(in) :: & + cloudsat_use_gas_abs, & ! + cloudsat_do_ray, & ! + isccp_top_height, & ! + isccp_top_height_direction, & ! + Nlevels, & ! + Nvgrid, & ! Number of levels for new L3 grid + surface_radar, & ! + rttov_Ninstruments + real(wp),intent(in) :: & + cloudsat_radar_freq, & ! + cloudsat_k2 ! + logical,intent(in) :: & + lusevgrid, & ! Switch to use different vertical grid + luseCSATvgrid ! Switch to use CLOUDSAT grid spacing for new + ! vertical grid + character(len=64),intent(in) :: & + cloudsat_micro_scheme ! Microphysical scheme used by CLOUDSAT + + type(character(len=256)), dimension(rttov_Ninstruments) :: & + rttov_instrument_namelists ! Array of paths to RTTOV instrument namelists + + ! OUTPUTS + type(radar_cfg) :: rcfg + type(rttov_cfg), dimension(:), allocatable,intent(inout) :: rttov_configs + + ! Optional args + integer,intent(in),Optional :: unitn ! Used for io limits + logical,intent(in),Optional :: debug + logical :: verbose = .false. + + ! Local variables + integer :: i + real(wp) :: zstep + + ! Init debug print statements: + if (present(debug)) verbose = debug + + ! Initialize MODIS optical-depth bin boundaries for joint-histogram. (defined in cosp_config.F90) + if (.not. allocated(modis_histTau)) then + allocate(modis_histTau(ntau+1),modis_histTauEdges(2,ntau),modis_histTauCenters(ntau)) + numMODISTauBins = ntau + modis_histTau = tau_binBounds + modis_histTauEdges = tau_binEdges + modis_histTauCenters = tau_binCenters + endif + + ! Set up vertical grid used by CALIPSO and CLOUDSAT L3 + use_vgrid = lusevgrid + + if (use_vgrid) then + Nlvgrid = Nvgrid + allocate(vgrid_zl(Nlvgrid),vgrid_zu(Nlvgrid),vgrid_z(Nlvgrid),dz(Nlvgrid)) + ! CloudSat grid requested + if (luseCSATvgrid) zstep = 480._wp + ! Other grid requested. Constant vertical spacing with top at 20 km + if (.not. luseCSATvgrid) zstep = 20000._wp/Nvgrid + do i=1,Nvgrid + vgrid_zl(Nlvgrid-i+1) = (i-1)*zstep + vgrid_zu(Nlvgrid-i+1) = i*zstep + enddo + vgrid_z = (vgrid_zl+vgrid_zu)/2._wp + dz = zstep + else + Nlvgrid = Nlevels + allocate(vgrid_zl(Nlvgrid),vgrid_zu(Nlvgrid),vgrid_z(Nlvgrid),dz(Nlvgrid)) + vgrid_zl = 0._wp + vgrid_zu = 0._wp + vgrid_z = 0._wp + dz = 0._wp + endif + + ! Initialize simulators + if (Lisccp) call cosp_isccp_init(isccp_top_height,isccp_top_height_direction) + if (Lmodis) call cosp_modis_init() + if (Lmisr) call cosp_misr_init() + + if (Lrttov) then + if (present(unitn)) then + call cosp_rttov_init(Lrttov,Nlevels,rttov_Ninstruments, & + rttov_instrument_namelists, & + rttov_configs,unitn=unitn, & + debug=verbose) + else + call cosp_rttov_init(Lrttov,Nlevels,rttov_Ninstruments, & + rttov_instrument_namelists, & + rttov_configs,debug=verbose) + end if + endif + + if (Lcloudsat) call cosp_cloudsat_init(cloudsat_radar_freq,cloudsat_k2, & + cloudsat_use_gas_abs,cloudsat_do_ray,R_UNDEF,N_HYDRO, surface_radar, & + rcfg,cloudsat_micro_scheme) + if (Lcalipso) call cosp_calipso_init() + if (LgrLidar532) call cosp_grLidar532_init() + if (Latlid) call cosp_atlid_init() + if (Lparasol) call cosp_parasol_init() + + linitialization = .FALSE. + END SUBROUTINE COSP_INIT + + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE cosp_errorCheck + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + subroutine cosp_errorCheck(cospgridIN, cospIN, Lisccp_subcolumn, Lisccp_column, & + Lmisr_subcolumn, Lmisr_column, Lmodis_subcolumn, Lmodis_column, Lcloudsat_subcolumn, & + Lcloudsat_column, Lcalipso_subcolumn, Lcalipso_column, Latlid_subcolumn, & + Latlid_column, LgrLidar532_subcolumn, LgrLidar532_column, & + Lrttov_column, Lparasol_subcolumn, Lparasol_column, Lradar_lidar_tcc, & + Llidar_only_freq_cloud, Lcloudsat_tcc, Lcloudsat_tcc2, Lcloudsat_modis_wr, & + cospOUT, errorMessage, nError) + + ! Inputs + type(cosp_column_inputs),intent(in) :: & + cospgridIN ! Model grid inputs to COSP + type(cosp_optical_inputs),intent(in) :: & + cospIN ! Derived (optical) input to COSP + + ! Outputs + logical,intent(inout) :: & + Lisccp_subcolumn, & ! ISCCP subcolumn simulator on/off switch + Lisccp_column, & ! ISCCP column simulator on/off switch + Lmisr_subcolumn, & ! MISR subcolumn simulator on/off switch + Lmisr_column, & ! MISR column simulator on/off switch + Lmodis_subcolumn, & ! MODIS subcolumn simulator on/off switch + Lmodis_column, & ! MODIS column simulator on/off switch + Lcloudsat_subcolumn, & ! CLOUDSAT subcolumn simulator on/off switch + Lcloudsat_column, & ! CLOUDSAT column simulator on/off switch + Lcalipso_subcolumn, & ! CALIPSO subcolumn simulator on/off switch + Lcalipso_column, & ! CALIPSO column simulator on/off switch + Latlid_subcolumn, & ! EarthCare subcolumn simulator on/off switch + Latlid_column, & ! EarthCare column simulator on/off switch + LgrLidar532_subcolumn, & ! Ground Lidar subcolumn simulator on/off switch + LgrLidar532_column, & ! Ground Lidar column simulator on/off switch + Lparasol_subcolumn, & ! PARASOL subcolumn simulator on/off switch + Lparasol_column, & ! PARASOL column simulator on/off switch + Lrttov_column, & ! RTTOV column simulator on/off switch + Lcloudsat_tcc, & ! + Lcloudsat_tcc2, & ! + Lradar_lidar_tcc, & ! On/Off switch for joint Calipso/Cloudsat product + Llidar_only_freq_cloud, & ! On/Off switch for joint Calipso/Cloudsat product + Lcloudsat_modis_wr ! On/Off switch for joint CloudSat/MODIS warm rain product + type(cosp_outputs),intent(inout) :: & + cospOUT ! COSP Outputs + character(len=256),dimension(100) :: errorMessage + integer,intent(out) :: nError + + ! Local variables + logical :: alloc_status + integer :: i + + nError = 0 + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! PART 0: Ensure that the inputs needed by the requested simulators are allocated. + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! ISCCP simulator + if (Lisccp_subcolumn .or. Lisccp_column) then + alloc_status = .true. + if (.not. allocated(cospgridIN%skt)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospgridIN%skt has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%qv)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospgridIN%qv has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%at)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospgridIN%at has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%frac_out)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospIN%frac_out has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%tau_067)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospIN%tau_067 has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%emiss_11)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospIN%emiss_11 has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%phalf)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospgridIN%phalf has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%sunlit)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospgridIN%sunlit has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%pfull)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospgridIN%pfull has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + Lisccp_subcolumn = .false. + Lisccp_column = .false. + if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF + if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF + if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF + if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF + if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF + if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF + if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF + if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF + if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF + endif + endif + + ! MISR simulator + if (Lmisr_subcolumn .or. Lmisr_column) then + alloc_status = .true. + if (.not. allocated(cospIN%tau_067)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (MISR simulator): cospIN%tau_067 has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%sunlit)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (MISR simulator): cospgridIN%sunlit has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%hgt_matrix)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (MISR simulator): cospgridIN%hgt_matrix has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%at)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (MISR simulator): cospgridIN%at has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + Lmisr_subcolumn = .false. + Lmisr_column = .false. + if (associated(cospOUT%misr_fq)) cospOUT%misr_fq(:,:,:) = R_UNDEF + if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(:,:) = R_UNDEF + if (associated(cospOUT%misr_meanztop)) cospOUT%misr_meanztop(:) = R_UNDEF + if (associated(cospOUT%misr_cldarea)) cospOUT%misr_cldarea(:) = R_UNDEF + endif + endif + + ! EarthCare Lidar simulator. + if (Latlid_subcolumn .or. Latlid_column) then + alloc_status = .true. + if (.not. allocated(cospIN%beta_mol_atlid)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospIN%beta_mol_atlid has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%betatot_atlid)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospIN%betatot_atlid has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%tau_mol_atlid)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospIN%tau_mol_atlid has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%tautot_atlid)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospIN%tautot_atlid has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + Latlid_subcolumn = .false. + Latlid_column = .false. + if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%atlid_beta_mol)) cospOUT%atlid_beta_mol(:,:) = R_UNDEF + if (associated(cospOUT%atlid_beta_tot)) cospOUT%atlid_beta_tot(:,:,:) = R_UNDEF + endif + + ! EarthCare column simulator requires additional inputs not required by the subcolumn simulator. + alloc_status = .true. + if (.not. allocated(cospgridIN%hgt_matrix)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospgridIN%hgt_matrix has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%hgt_matrix_half)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospgridIN%hgt_matrix_half has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%phalf)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospgridIN%phalf has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + Latlid_column = .false. + if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF + endif + endif + + ! Ground Lidar simulator. + if (LgrLidar532_subcolumn .or. LgrLidar532_column) then + alloc_status = .true. + if (.not. allocated(cospIN%beta_mol_grLidar532)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospIN%beta_mol_grLidar532 has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%betatot_grLidar532)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospIN%betatot_grLidar532 has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%tau_mol_grLidar532)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospIN%tau_mol_grLidar532 has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%tautot_grLidar532)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospIN%tautot_grLidar532 has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + LgrLidar532_subcolumn = .false. + LgrLidar532_column = .false. + if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_beta_mol)) cospOUT%grLidar532_beta_mol(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_beta_tot)) cospOUT%grLidar532_beta_tot(:,:,:) = R_UNDEF + endif + + ! Ground Lidar column simulator requires additional inputs not required by the subcolumn simulator. + alloc_status = .true. + if (.not. allocated(cospgridIN%hgt_matrix)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospgridIN%hgt_matrix has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%hgt_matrix_half)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospgridIN%hgt_matrix_half has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%phalf)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospgridIN%phalf has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + LgrLidar532_column = .false. + if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF + endif + endif + + ! Calipso Lidar simulator + if (Lcalipso_subcolumn .or. Lcalipso_column) then + alloc_status = .true. + if (.not. allocated(cospIN%beta_mol_calipso)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospIN%beta_mol_calipso has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%betatot_calipso)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospIN%betatot_calipso has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%betatot_liq_calipso)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator):'//& + ' cospIN%betatot_liq_calipso has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%betatot_ice_calipso)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator):'//& + ' cospIN%betatot_ice_calipso has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%tau_mol_calipso)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospIN%tau_mol_calipso has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%tautot_calipso)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospIN%tautot_calipso has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%tautot_liq_calipso)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator):'//& + ' cospIN%tautot_liq has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%tautot_ice_calipso)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator):'//& + ' cospIN%tautot_ice has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + Lcalipso_subcolumn = .false. + Lcalipso_column = .false. + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_beta_mol)) cospOUT%calipso_beta_mol(:,:) = R_UNDEF + if (associated(cospOUT%calipso_beta_tot)) cospOUT%calipso_beta_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_betaperp_tot)) cospOUT%calipso_betaperp_tot(:,:,:) = R_UNDEF + ! Also, turn-off joint-products + if (Lradar_lidar_tcc) then + Lradar_lidar_tcc = .false. + if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF + endif + if (Lcloudsat_tcc) then + Lcloudsat_tcc = .false. + if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF + endif + if (Lcloudsat_tcc2) then + Lcloudsat_tcc2 = .false. + if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF + endif + if (Llidar_only_freq_cloud) then + Llidar_only_freq_cloud = .false. + if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF + endif + endif + + ! Calipso column simulator requires additional inputs not required by the subcolumn simulator. + alloc_status = .true. + if (.not. allocated(cospgridIN%hgt_matrix)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator):'//& + ' cospgridIN%hgt_matrix has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%hgt_matrix_half)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator):'//& + ' cospgridIN%hgt_matrix_half has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%at)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospgridIN%at has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%surfelev)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospgridIN%surfelev has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%phalf)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospgridIN%phalf has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + Lcalipso_column = .false. + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (Lcloudsat_tcc) then + Lcloudsat_tcc = .false. + if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF + endif + if (Lcloudsat_tcc2) then + Lcloudsat_tcc2 = .false. + if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF + endif + ! Also, turn-off joint-products + if (Lradar_lidar_tcc) then + Lradar_lidar_tcc = .false. + if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF + endif + if (Llidar_only_freq_cloud) then + Llidar_only_freq_cloud = .false. + if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF + endif + endif + endif + + ! PARASOL simulator + if (Lparasol_subcolumn .or. Lparasol_column) then + alloc_status = .true. + if (.not. allocated(cospIN%tautot_S_liq)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (PARASOL simulator): cospIN%tautot_S_liq has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%tautot_S_ice)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (PARASOL simulator): cospIN%tautot_S_ice has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + Lparasol_subcolumn = .false. + Lparasol_column = .false. + if (associated(cospOUT%parasolPix_refl)) cospOUT%parasolPix_refl(:,:,:) = R_UNDEF + if (associated(cospOUT%parasolGrid_refl)) cospOUT%parasolGrid_refl(:,:) = R_UNDEF + endif + + ! PARASOL column simulator requires additional inputs not required by the subcolumn simulator. + alloc_status = .true. + if (.not. allocated(cospgridIN%land)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (PARASOL simulator): cospgridIN%land has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + Lparasol_column = .false. + if (associated(cospOUT%parasolGrid_refl)) cospOUT%parasolGrid_refl(:,:) = R_UNDEF + endif + endif + + ! Cloudsat radar simulator + if (Lcloudsat_subcolumn .or. Lcloudsat_column) then + alloc_status = .true. + if (.not. allocated(cospIN%z_vol_cloudsat)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Cloudsat radar simulator):'//& + ' cospIN%z_vol_cloudsat has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%kr_vol_cloudsat)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Cloudsat radar simulator):'//& + ' cospIN%kr_vol_cloudsat has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%g_vol_cloudsat)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Cloudsat radar simulator):'//& + ' cospIN%g_vol_cloudsat has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%hgt_matrix)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Cloudsat radar simulator):'//& + ' cospgridIN%hgt_matrix has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%surfelev)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Cloudsat radar simulator):'//& + ' cospgridIN%surfelev has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + Lcloudsat_subcolumn = .false. + Lcloudsat_column = .false. + if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF + if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(:,:,:) = R_UNDEF + if (Lcloudsat_tcc) then + Lcloudsat_tcc = .false. + if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF + endif + if (Lcloudsat_tcc2) then + Lcloudsat_tcc2 = .false. + if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF + endif + ! Also, turn-off joint-products + if (Lradar_lidar_tcc) then + Lradar_lidar_tcc = .false. + if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF + endif + if (Llidar_only_freq_cloud) then + Llidar_only_freq_cloud = .false. + if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF + endif + if (Lcloudsat_modis_wr) then + Lcloudsat_modis_wr = .false. + if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF + if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF + endif + endif + + ! Cloudsat column simulator requires additional inputs not required by the subcolumn simulator. + alloc_status = .true. + if (.not. allocated(cospgridIN%hgt_matrix_half)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (Cloudsat radar simulator):'//& + ' cospgridIN%hgt_matrix_half has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + Lcloudsat_column = .false. + if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF + if (Lcloudsat_tcc) then + Lcloudsat_tcc = .false. + if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF + endif + if (Lcloudsat_tcc2) then + Lcloudsat_tcc2 = .false. + if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF + endif + ! Also, turn-off joint-products + if (Lradar_lidar_tcc) then + Lradar_lidar_tcc = .false. + if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF + endif + if (Llidar_only_freq_cloud) then + Llidar_only_freq_cloud = .false. + if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF + endif + if (Lcloudsat_modis_wr) then + Lcloudsat_modis_wr = .false. + if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF + if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF + endif + endif + endif + + ! MODIS simulator + if (Lmodis_subcolumn .or. Lmodis_column) then + alloc_status = .true. + if (.not. allocated(cospIN%fracLiq)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (MODIS simulator): cospIN%fracLiq has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%tau_067)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (MODIS simulator): cospIN%tau_067 has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%asym)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (MODIS simulator): cospIN%asym has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospIN%ss_alb)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (MODIS simulator): cospIN%ss_alb has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%sunlit)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (MODIS simulator): cospgridIN%sunlit has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + Lmodis_subcolumn = .false. + Lmodis_column = .false. + if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & + cospOUT%modis_Cloud_Fraction_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & + cospOUT%modis_Cloud_Fraction_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & + cospOUT%modis_Cloud_Fraction_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & + cospOUT%modis_Cloud_Fraction_High_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & + cospOUT%modis_Cloud_Fraction_Mid_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & + cospOUT%modis_Cloud_Fraction_Low_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & + cospOUT%modis_Optical_Thickness_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & + cospOUT%modis_Optical_Thickness_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & + cospOUT%modis_Optical_Thickness_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & + cospOUT%modis_Optical_Thickness_Total_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & + cospOUT%modis_Optical_Thickness_Water_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & + cospOUT%modis_Optical_Thickness_Ice_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & + cospOUT%modis_Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & + cospOUT%modis_Liquid_Water_Path_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & + cospOUT%modis_Ice_Water_Path_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) & + cospOUT%modis_LWP_vs_ReffLIQ(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_IWP_vs_ReffICE)) & + cospOUT%modis_IWP_vs_ReffICE(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) & + cospOUT%modis_Optical_Thickness_vs_ReffICE(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) & + cospOUT%modis_Optical_Thickness_vs_ReffLIQ(:,:,:) = R_UNDEF + ! Also, turn-off joint-products + if (Lcloudsat_modis_wr) then + Lcloudsat_modis_wr = .false. + if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF + if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF + endif + endif + endif + + ! RTTOV + if (Lrttov_column) then + alloc_status = .true. +! if (.not. allocated(cospgridIN%emis_in)) then +! nError=nError+1 +! errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%emis_in has not been allocated' +! alloc_status = .false. +! endif +! if (.not. allocated(cospgridIN%refl_in)) then +! nError=nError+1 +! errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%refl_in has not been allocated' +! alloc_status = .false. +! endif + if (.not. allocated(cospgridIN%hgt_matrix_half)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%hgt_matrix_half has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%u_sfc)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%u_sfc has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%v_sfc)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%v_sfc has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%skt)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%skt has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%phalf)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%phalf has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%qv)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%qv has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%at)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%at has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%rttov_sfcmask)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV simulator): cospgridIN%rttov_sfcmask has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%lat)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%lat has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%lon)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%lon has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%pfull)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%pfull has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%phalf)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%phalf has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%at)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%at has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%qv)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%qv has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%o3)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%o3 has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%tca)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%tca has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%sza)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%sza has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%cloudIce)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%cloudIce has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%cloudLiq)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%cloudLiq has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%fl_rain)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%fl_rain has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%fl_snow)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%fl_snow has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%rttov_date)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%rttov_date has not been allocated' + alloc_status = .false. + endif + if (.not. allocated(cospgridIN%rttov_time)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%rttov_time has not been allocated' + alloc_status = .false. + endif + if (.not. alloc_status) then + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + endif + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! PART 1: Check input array values for out-of-bounds values. When an out-of-bound value + ! is encountered, COSP outputs that are dependent on that input are filled with + ! an undefined value (set in cosp_config.f90) and if necessary, that simulator + ! is turned off. + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + if (any([Lisccp_subcolumn, Lisccp_column, Lmisr_subcolumn, Lmisr_column, & + Lmodis_subcolumn, Lmodis_column, Lcloudsat_modis_wr])) then + if (any(cospgridIN%sunlit .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%sunlit contains values out of range (0 or 1)' + Lisccp_subcolumn = .false. + Lisccp_column = .false. + Lmisr_subcolumn = .false. + Lmisr_column = .false. + Lmodis_subcolumn = .false. + Lmodis_column = .false. + Lcloudsat_modis_wr = .false. + if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF + if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF + if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF + if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF + if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF + if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF + if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF + if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF + if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF + if (associated(cospOUT%misr_fq)) cospOUT%misr_fq(:,:,:) = R_UNDEF + if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(:,:) = R_UNDEF + if (associated(cospOUT%misr_meanztop)) cospOUT%misr_meanztop(:) = R_UNDEF + if (associated(cospOUT%misr_cldarea)) cospOUT%misr_cldarea(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & + cospOUT%modis_Cloud_Fraction_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & + cospOUT%modis_Cloud_Fraction_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & + cospOUT%modis_Cloud_Fraction_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & + cospOUT%modis_Cloud_Fraction_High_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & + cospOUT%modis_Cloud_Fraction_Mid_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & + cospOUT%modis_Cloud_Fraction_Low_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & + cospOUT%modis_Optical_Thickness_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & + cospOUT%modis_Optical_Thickness_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & + cospOUT%modis_Optical_Thickness_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & + cospOUT%modis_Optical_Thickness_Total_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & + cospOUT%modis_Optical_Thickness_Water_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & + cospOUT%modis_Optical_Thickness_Ice_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & + cospOUT%modis_Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & + cospOUT%modis_Liquid_Water_Path_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & + cospOUT%modis_Ice_Water_Path_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) & + cospOUT%modis_LWP_vs_ReffLIQ(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_IWP_vs_ReffICE)) & + cospOUT%modis_IWP_vs_ReffICE(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) & + cospOUT%modis_Optical_Thickness_vs_ReffICE(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) & + cospOUT%modis_Optical_Thickness_vs_ReffLIQ(:,:,:) = R_UNDEF + if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF + if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF + endif + endif + + if (any([Lisccp_subcolumn, Lisccp_column, Lmisr_subcolumn, Lmisr_column, Lrttov_column,& + Lcalipso_column, Lcloudsat_column, Lradar_lidar_tcc,Llidar_only_freq_cloud, & + Lcloudsat_tcc, Lcloudsat_tcc2, Lcloudsat_modis_wr])) then + if (any(cospgridIN%at .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%at contains values out of range (at<0), expected units (K)' + Lisccp_subcolumn = .false. + Lisccp_column = .false. + Lmisr_subcolumn = .false. + Lmisr_column = .false. + Lrttov_column = .false. + Lcalipso_column = .false. + Lcloudsat_column = .false. + Lradar_lidar_tcc = .false. + Llidar_only_freq_cloud = .false. + Lcloudsat_tcc = .false. + Lcloudsat_tcc2 = .false. + Lcloudsat_modis_wr = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF + if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF + if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF + if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF + if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF + if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF + if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF + if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF + if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF + if (associated(cospOUT%misr_fq)) cospOUT%misr_fq(:,:,:) = R_UNDEF + if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(:,:) = R_UNDEF + if (associated(cospOUT%misr_meanztop)) cospOUT%misr_meanztop(:) = R_UNDEF + if (associated(cospOUT%misr_cldarea)) cospOUT%misr_cldarea(:) = R_UNDEF + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF + if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF + if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF + if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF + if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF + endif + endif + if (any([Lisccp_subcolumn, Lisccp_column, Lrttov_column])) then + if (any(cospgridIN%pfull .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%pfull contains values out of range' + Lisccp_subcolumn = .false. + Lisccp_column = .false. + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF + if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF + if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF + if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF + if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF + if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF + if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF + if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF + if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF + endif + endif + if (any([Lisccp_subcolumn,Lisccp_column,Lmodis_subcolumn,Lmodis_column,Lcalipso_column,Lrttov_column,& + LgrLidar532_column,Latlid_column])) then + if (any(cospgridIN%phalf .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%phalf contains values out of range' + Lisccp_subcolumn = .false. + Lisccp_column = .false. + Lmodis_subcolumn = .false. + Lmodis_column = .false. + Lcalipso_column = .false. + Lrttov_column = .false. + Latlid_column = .false. + LgrLidar532_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF + if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF + if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF + if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF + if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF + if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF + if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF + if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF + if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & + cospOUT%modis_Cloud_Fraction_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & + cospOUT%modis_Cloud_Fraction_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & + cospOUT%modis_Cloud_Fraction_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & + cospOUT%modis_Cloud_Fraction_High_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & + cospOUT%modis_Cloud_Fraction_Mid_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & + cospOUT%modis_Cloud_Fraction_Low_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & + cospOUT%modis_Optical_Thickness_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & + cospOUT%modis_Optical_Thickness_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & + cospOUT%modis_Optical_Thickness_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & + cospOUT%modis_Optical_Thickness_Total_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & + cospOUT%modis_Optical_Thickness_Water_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & + cospOUT%modis_Optical_Thickness_Ice_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & + cospOUT%modis_Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & + cospOUT%modis_Liquid_Water_Path_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & + cospOUT%modis_Ice_Water_Path_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) & + cospOUT%modis_LWP_vs_ReffLIQ(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_IWP_vs_ReffICE)) & + cospOUT%modis_IWP_vs_ReffICE(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) & + cospOUT%modis_Optical_Thickness_vs_ReffICE(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) & + cospOUT%modis_Optical_Thickness_vs_ReffLIQ(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + endif + endif + if (any([Lisccp_subcolumn,Lisccp_column,Lrttov_column])) then + if (any(cospgridIN%qv .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%qv contains values out of range' + Lisccp_subcolumn = .false. + Lisccp_column = .false. + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF + if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF + if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF + if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF + if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF + if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF + if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF + if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF + if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF + endif + endif + if (any([Lmisr_subcolumn,Lmisr_column,Lcloudsat_subcolumn,Lcloudsat_column,Lcalipso_column,Lradar_lidar_tcc,& + Llidar_only_freq_cloud,LgrLidar532_column,Latlid_column,Lcloudsat_tcc, Lcloudsat_tcc2, & + Lcloudsat_modis_wr])) then + if (any(cospgridIN%hgt_matrix .lt. -300)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%hgt_matrix contains values out of range' + Lmisr_subcolumn = .false. + Lmisr_column = .false. + Lcloudsat_subcolumn = .false. + Lcloudsat_column = .false. + Lcalipso_column = .false. + Lradar_lidar_tcc = .false. + Llidar_only_freq_cloud = .false. + Lcloudsat_tcc = .false. + Lcloudsat_tcc2 = .false. + Latlid_column = .false. + LgrLidar532_column = .false. + Lcloudsat_modis_wr = .false. + if (associated(cospOUT%misr_fq)) cospOUT%misr_fq(:,:,:) = R_UNDEF + if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(:,:) = R_UNDEF + if (associated(cospOUT%misr_meanztop)) cospOUT%misr_meanztop(:) = R_UNDEF + if (associated(cospOUT%misr_cldarea)) cospOUT%misr_cldarea(:) = R_UNDEF + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF + if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF + if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF + if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF + if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF + endif + endif + if (any([Lrttov_column,Lcloudsat_column,Lcalipso_column,Lradar_lidar_tcc,Llidar_only_freq_cloud, & + LgrLidar532_column, Latlid_column, Lcloudsat_tcc, Lcloudsat_tcc2, Lcloudsat_modis_wr])) then + if (any(cospgridIN%hgt_matrix_half .lt. -300)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%hgt_matrix_half contains values out of range' + Lrttov_column = .false. + Lcloudsat_column = .false. + Lcalipso_column = .false. + Lradar_lidar_tcc = .false. + Llidar_only_freq_cloud = .false. + Lcloudsat_tcc = .false. + Lcloudsat_tcc2 = .false. + Latlid_column = .false. + LgrLidar532_column = .false. + Lcloudsat_modis_wr = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF + if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF + if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF + if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF + if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF + endif + endif + if (any([Lrttov_column,Lcalipso_column,Lparasol_column])) then + if (any(cospgridIN%land .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%land contains values out of range' + Lrttov_column = .false. + Lcalipso_column = .false. + Lparasol_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + if (associated(cospOUT%parasolGrid_refl)) cospOUT%parasolGrid_refl(:,:) = R_UNDEF + endif + endif + if (any([Lisccp_subcolumn,Lisccp_column,Lrttov_column])) then + if (any(cospgridIN%skt .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%skt contains values out of range' + Lisccp_subcolumn = .false. + Lisccp_column = .false. + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF + if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF + if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF + if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF + if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF + if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF + if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF + if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF + if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF + endif + endif + + ! RTTOV Inputs + if (Lrttov_column) then + if (any(cospgridIN%co2 .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%co2 contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%ch4 .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%ch4 contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%n2o .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%n2o contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%co.lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%co contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%o3 .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%o3 contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif +! if (any(cospgridIN%emis_in .lt. 0. .OR. cospgridIN%emis_in .gt. 1)) then +! nError=nError+1 +! errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%emis_in contains values out of range' +! Lrttov_column = .false. +! if (allocated(cospOUT%rttov_outputs)) then +! do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument +! if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 +! if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF +! end do +! end if +! endif +! if (any(cospgridIN%refl_in .lt. 0. .OR. cospgridIN%refl_in .gt. 1)) then +! nError=nError+1 +! errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%refl_in contains values out of range' +! Lrttov_column = .false. +! if (allocated(cospOUT%rttov_outputs)) then +! do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument +! if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 +! if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF +! if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF +! end do +! end if +! endif + if (any(cospgridIN%rttov_sfcmask .lt. 0 .or. cospgridIN%rttov_sfcmask .gt. 2)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%rttov_sfcmask contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%u_sfc .lt. -100. .OR. cospgridIN%u_sfc .gt. 100.)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%u_sfc contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%v_sfc .lt. -100. .OR. cospgridIN%v_sfc .gt. 100.)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%v_sfc contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%lat .lt. -90 .OR. cospgridIN%lat .gt. 90)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%lat contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%lon .lt. -180 .OR. cospgridIN%lon .gt. 360)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%lon contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%tca .lt. 0 .OR. cospgridIN%tca .gt. 1)) then ! tca on [0,1] + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tca contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%rttov_time(:,1) .lt. 0 .OR. cospgridIN%rttov_time(:,1) .gt. 24)) then ! rttov_time(1), hour on [0,24] + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%rttov_time(1) contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%rttov_time(:,2) .lt. 0 .OR. cospgridIN%rttov_time(:,2) .gt. 60)) then ! rttov_time(2), minute on [0,60] + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%rttov_time(2) contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%rttov_time(:,3) .lt. 0 .OR. cospgridIN%rttov_time(:,3) .gt. 60)) then ! rttov_time(3), second on [0,60] + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%rttov_time(3) contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%rttov_date(:,1) .lt. 0)) then ! rttov_date(1), year on [0,inf] + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%rttov_date(1) contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%rttov_date(:,2) .lt. 0 .OR. cospgridIN%rttov_date(:,2) .gt. 12)) then ! rttov_date(2), month on [0,12] + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%rttov_date(2) contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + if (any(cospgridIN%rttov_date(:,3) .lt. 1 .OR. cospgridIN%rttov_date(:,3) .gt. 31)) then ! rttov_date(3), day on [1,31] + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%rttov_date(3) contains values out of range' + Lrttov_column = .false. + if (allocated(cospOUT%rttov_outputs)) then + do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument + if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 + if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF + if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF + end do + end if + endif + endif + + ! COSP_INPUTS + if (any([Lisccp_subcolumn,Lisccp_column])) then + if (cospIN%emsfc_lw .lt. 0. .OR. cospIN%emsfc_lw .gt. 1.) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%emsfc_lw contains values out of range' + Lisccp_subcolumn = .false. + Lisccp_column = .false. + if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF + if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF + if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF + if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF + if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF + if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF + if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF + if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF + if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF + endif + endif + if (any([Lisccp_subcolumn,Lisccp_column,Lmisr_subcolumn,Lmisr_column,Lmodis_subcolumn,Lmodis_column])) then + if (any(cospIN%tau_067 .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tau_067 contains values out of range' + Lisccp_subcolumn = .false. + Lisccp_column = .false. + Lmisr_subcolumn = .false. + Lmisr_column = .false. + Lmodis_subcolumn = .false. + Lmodis_column = .false. + if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF + if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF + if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF + if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF + if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF + if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF + if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF + if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF + if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF + if (associated(cospOUT%misr_fq)) cospOUT%misr_fq(:,:,:) = R_UNDEF + if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(:,:) = R_UNDEF + if (associated(cospOUT%misr_meanztop)) cospOUT%misr_meanztop(:) = R_UNDEF + if (associated(cospOUT%misr_cldarea)) cospOUT%misr_cldarea(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & + cospOUT%modis_Cloud_Fraction_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & + cospOUT%modis_Cloud_Fraction_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & + cospOUT%modis_Cloud_Fraction_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & + cospOUT%modis_Cloud_Fraction_High_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & + cospOUT%modis_Cloud_Fraction_Mid_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & + cospOUT%modis_Cloud_Fraction_Low_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & + cospOUT%modis_Optical_Thickness_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & + cospOUT%modis_Optical_Thickness_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & + cospOUT%modis_Optical_Thickness_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & + cospOUT%modis_Optical_Thickness_Total_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & + cospOUT%modis_Optical_Thickness_Water_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & + cospOUT%modis_Optical_Thickness_Ice_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & + cospOUT%modis_Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & + cospOUT%modis_Liquid_Water_Path_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & + cospOUT%modis_Ice_Water_Path_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) & + cospOUT%modis_LWP_vs_ReffLIQ(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_IWP_vs_ReffICE)) & + cospOUT%modis_IWP_vs_ReffICE(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) & + cospOUT%modis_Optical_Thickness_vs_ReffICE(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) & + cospOUT%modis_Optical_Thickness_vs_ReffLIQ(:,:,:) = R_UNDEF + endif + endif + if (any([Lisccp_subcolumn,Lisccp_column])) then + if (any(cospIN%emiss_11 .lt. 0. .OR. cospIN%emiss_11 .gt. 1)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%emiss_11 contains values out of range' + Lisccp_subcolumn = .false. + Lisccp_column = .false. + if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF + if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF + if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF + if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF + if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF + if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF + if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF + if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF + if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF + endif + endif + if (any([Lmodis_subcolumn,Lmodis_column])) then + if (any(cospIN%asym .lt. -1. .OR. cospIN%asym .gt. 1)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%asym contains values out of range' + Lmodis_subcolumn = .false. + Lmodis_column = .false. + if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & + cospOUT%modis_Cloud_Fraction_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & + cospOUT%modis_Cloud_Fraction_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & + cospOUT%modis_Cloud_Fraction_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & + cospOUT%modis_Cloud_Fraction_High_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & + cospOUT%modis_Cloud_Fraction_Mid_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & + cospOUT%modis_Cloud_Fraction_Low_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & + cospOUT%modis_Optical_Thickness_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & + cospOUT%modis_Optical_Thickness_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & + cospOUT%modis_Optical_Thickness_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & + cospOUT%modis_Optical_Thickness_Total_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & + cospOUT%modis_Optical_Thickness_Water_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & + cospOUT%modis_Optical_Thickness_Ice_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & + cospOUT%modis_Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & + cospOUT%modis_Liquid_Water_Path_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & + cospOUT%modis_Ice_Water_Path_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) & + cospOUT%modis_LWP_vs_ReffLIQ(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_IWP_vs_ReffICE)) & + cospOUT%modis_IWP_vs_ReffICE(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) & + cospOUT%modis_Optical_Thickness_vs_ReffICE(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) & + cospOUT%modis_Optical_Thickness_vs_ReffLIQ(:,:,:) = R_UNDEF + endif + if (any(cospIN%ss_alb .lt. 0 .OR. cospIN%ss_alb .gt. 1)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%ss_alb contains values out of range' + Lmodis_subcolumn = .false. + Lmodis_column = .false. + if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & + cospOUT%modis_Cloud_Fraction_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & + cospOUT%modis_Cloud_Fraction_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & + cospOUT%modis_Cloud_Fraction_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & + cospOUT%modis_Cloud_Fraction_High_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & + cospOUT%modis_Cloud_Fraction_Mid_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & + cospOUT%modis_Cloud_Fraction_Low_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & + cospOUT%modis_Optical_Thickness_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & + cospOUT%modis_Optical_Thickness_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & + cospOUT%modis_Optical_Thickness_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & + cospOUT%modis_Optical_Thickness_Total_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & + cospOUT%modis_Optical_Thickness_Water_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & + cospOUT%modis_Optical_Thickness_Ice_LogMean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Water_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & + cospOUT%modis_Cloud_Particle_Size_Ice_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & + cospOUT%modis_Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & + cospOUT%modis_Liquid_Water_Path_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & + cospOUT%modis_Ice_Water_Path_Mean(:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & + cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) & + cospOUT%modis_LWP_vs_ReffLIQ(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_IWP_vs_ReffICE)) & + cospOUT%modis_IWP_vs_ReffICE(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) & + cospOUT%modis_Optical_Thickness_vs_ReffICE(:,:,:) = R_UNDEF + if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) & + cospOUT%modis_Optical_Thickness_vs_ReffLIQ(:,:,:) = R_UNDEF + endif + endif + if (any([Latlid_subcolumn,Latlid_column])) then + if (any(cospIN%betatot_atlid .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%betatot_atlid contains values out of range' + Latlid_subcolumn = .false. + Latlid_column = .false. + if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%atlid_beta_tot)) cospOUT%atlid_beta_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_beta_mol)) cospOUT%atlid_beta_mol(:,:) = R_UNDEF + endif + if (any(cospIN%beta_mol_atlid .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%beta_mol_atlid contains values out of range' + Latlid_subcolumn = .false. + Latlid_column = .false. + if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%atlid_beta_tot)) cospOUT%atlid_beta_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_beta_mol)) cospOUT%atlid_beta_mol(:,:) = R_UNDEF + endif + if (any(cospIN%tautot_atlid .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tautot_atlid contains values out of range' + Latlid_subcolumn = .false. + Latlid_column = .false. + if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%atlid_beta_tot)) cospOUT%atlid_beta_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_beta_mol)) cospOUT%atlid_beta_mol(:,:) = R_UNDEF + endif + if (any(cospIN%tau_mol_atlid .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tau_mol_atlid contains values out of range' + Latlid_subcolumn = .false. + Latlid_column = .false. + if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%atlid_beta_tot)) cospOUT%atlid_beta_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%atlid_beta_mol)) cospOUT%atlid_beta_mol(:,:) = R_UNDEF + endif + endif + + if (any([LgrLidar532_subcolumn,LgrLidar532_column])) then + if (any(cospIN%betatot_grLidar532 .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%betatot_grLidar532 contains values out of range' + LgrLidar532_subcolumn = .false. + LgrLidar532_column = .false. + if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_beta_tot)) cospOUT%grLidar532_beta_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_beta_mol)) cospOUT%grLidar532_beta_mol(:,:) = R_UNDEF + endif + if (any(cospIN%beta_mol_grLidar532 .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%beta_mol_grLidar532 contains values out of range' + LgrLidar532_subcolumn = .false. + LgrLidar532_column = .false. + if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_beta_tot)) cospOUT%grLidar532_beta_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_beta_mol)) cospOUT%grLidar532_beta_mol(:,:) = R_UNDEF + endif + if (any(cospIN%tautot_grLidar532 .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tautot_grLidar532 contains values out of range' + LgrLidar532_subcolumn = .false. + LgrLidar532_column = .false. + if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_beta_tot)) cospOUT%grLidar532_beta_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_beta_mol)) cospOUT%grLidar532_beta_mol(:,:) = R_UNDEF + endif + if (any(cospIN%tau_mol_grLidar532 .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tau_mol_grLidar532 contains values out of range' + LgrLidar532_subcolumn = .false. + LgrLidar532_column = .false. + if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_beta_tot)) cospOUT%grLidar532_beta_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%grLidar532_beta_mol)) cospOUT%grLidar532_beta_mol(:,:) = R_UNDEF + endif + endif + + if (any([Lcalipso_subcolumn,Lcalipso_column])) then + if (any(cospIN%betatot_calipso .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%betatot_calipso contains values out of range' + Lcalipso_subcolumn = .false. + Lcalipso_column = .false. + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + endif + if (any(cospIN%betatot_liq_calipso .lt. 0)) then + nError=nError+1 + errorMessage(nError) = ('ERROR: COSP input variable: cospIN%betatot_liq_calipso contains values out of range') + Lcalipso_subcolumn = .false. + Lcalipso_column = .false. + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + endif + if (any(cospIN%betatot_ice_calipso .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%betatot_ice_calipso contains values out of range' + Lcalipso_subcolumn = .false. + Lcalipso_column = .false. + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + endif + if (any(cospIN%tautot_calipso .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tautot_calipso contains values out of range' + Lcalipso_subcolumn = .false. + Lcalipso_column = .false. + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + endif + if (any(cospIN%tautot_liq_calipso .lt. 0)) then + nError=nError+1 + errorMessage(nError) = ('ERROR: COSP input variable: cospIN%tautot_liq_calipso contains values out of range') + Lcalipso_subcolumn = .false. + Lcalipso_column = .false. + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + endif + if (any(cospIN%tautot_ice_calipso .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tautot_ice_calipso contains values out of range' + Lcalipso_subcolumn = .false. + Lcalipso_column = .false. + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + endif + if (any(cospIN%tau_mol_calipso .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tau_mol_calipso contains values out of range' + Lcalipso_subcolumn = .false. + Lcalipso_column = .false. + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + endif + endif + if (any([Lcalipso_subcolumn,Lcalipso_column,Lcloudsat_column,Lradar_lidar_tcc, & + Llidar_only_freq_cloud, Lcloudsat_tcc, Lcloudsat_tcc2])) then + if (any(cospIN%beta_mol_calipso .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%beta_mol_calipso contains values out of range' + Lcalipso_subcolumn = .false. + Lcalipso_column = .false. + Lcloudsat_column = .false. + Lradar_lidar_tcc = .false. + Llidar_only_freq_cloud = .false. + Lcloudsat_tcc = .false. + Lcloudsat_tcc2 = .false. + if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF + if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF + if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF + if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF + if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF + if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF + endif + endif + if (any([Lparasol_subcolumn,Lparasol_column])) then + if (any(cospIN%tautot_S_liq .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tautot_S_liq contains values out of range' + Lparasol_subcolumn = .false. + Lparasol_column = .false. + if (associated(cospOUT%parasolPix_refl)) cospOUT%parasolPix_refl(:,:,:) = R_UNDEF + if (associated(cospOUT%parasolGrid_refl)) cospOUT%parasolGrid_refl(:,:) = R_UNDEF + endif + if (any(cospIN%tautot_S_ice .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tautot_S_ice contains values out of range' + Lparasol_subcolumn = .false. + Lparasol_column = .false. + if (associated(cospOUT%parasolPix_refl)) cospOUT%parasolPix_refl(:,:,:) = R_UNDEF + if (associated(cospOUT%parasolGrid_refl)) cospOUT%parasolGrid_refl(:,:) = R_UNDEF + endif + endif + if (any([Lcloudsat_subcolumn,Lcloudsat_column,Lradar_lidar_tcc,Llidar_only_freq_cloud, & + Lcloudsat_tcc, Lcloudsat_tcc2, Lcloudsat_modis_wr])) then + if (any(cospIN%z_vol_cloudsat .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%z_vol_cloudsat contains values out of range' + Lcloudsat_subcolumn = .false. + Lcloudsat_column = .false. + Lradar_lidar_tcc = .false. + Llidar_only_freq_cloud = .false. + Lcloudsat_tcc = .false. + Lcloudsat_tcc2 = .false. + Lcloudsat_modis_wr = .false. + if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF + if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF + if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF + if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF + if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF + endif + if (any(cospIN%kr_vol_cloudsat .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%kr_vol_cloudsat contains values out of range' + Lcloudsat_subcolumn = .false. + Lcloudsat_column = .false. + Lradar_lidar_tcc = .false. + Llidar_only_freq_cloud = .false. + Lcloudsat_tcc = .false. + Lcloudsat_tcc2 = .false. + Lcloudsat_modis_wr = .false. + if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF + if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF + if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF + if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF + if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF + endif + if (any(cospIN%g_vol_cloudsat .lt. 0)) then + nError=nError+1 + errorMessage(nError) = 'ERROR: COSP input variable: cospIN%g_vol_cloudsat contains values out of range' + Lcloudsat_subcolumn = .false. + Lcloudsat_column = .false. + Lradar_lidar_tcc = .false. + Llidar_only_freq_cloud = .false. + Lcloudsat_tcc = .false. + Lcloudsat_tcc2 = .false. + Lcloudsat_modis_wr = .false. + if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF + if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(:,:,:) = R_UNDEF + if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF + if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF + if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF + if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF + if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF + endif + endif + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! Part 2: Check input fields array size for consistency. This needs to be done for each + ! simulator + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! ISCCP + if (Lisccp_subcolumn .or. Lisccp_column) then + if (size(cospIN%frac_out,1) .ne. cospIN%Npoints .OR. & + size(cospIN%tau_067,1) .ne. cospIN%Npoints .OR. & + size(cospIN%emiss_11,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%skt) .ne. cospIN%Npoints .OR. & + size(cospgridIN%qv,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%at,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%phalf,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%sunlit) .ne. cospIN%Npoints .OR. & + size(cospgridIN%pfull,1) .ne. cospIN%Npoints) then + Lisccp_subcolumn = .false. + Lisccp_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(isccp_simulator): The number of points in the input fields are inconsistent' + endif + if (size(cospIN%frac_out,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%tau_067,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%emiss_11,2) .ne. cospIN%Ncolumns) then + Lisccp_subcolumn = .false. + Lisccp_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(isccp_simulator): The number of sub-columns in the input fields are inconsistent' + endif + if (size(cospIN%frac_out,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%tau_067,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%emiss_11,3) .ne. cospIN%Nlevels .OR. & + size(cospgridIN%qv,2) .ne. cospIN%Nlevels .OR. & + size(cospgridIN%at,2) .ne. cospIN%Nlevels .OR. & + size(cospgridIN%pfull,2) .ne. cospIN%Nlevels .OR. & + size(cospgridIN%phalf,2) .ne. cospIN%Nlevels+1) then + Lisccp_subcolumn = .false. + Lisccp_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(isccp_simulator): The number of levels in the input fields are inconsistent' + endif + endif + + ! MISR + if (Lmisr_subcolumn .or. Lmisr_column) then + if (size(cospIN%tau_067,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%sunlit) .ne. cospIN%Npoints .OR. & + size(cospgridIN%hgt_matrix,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%at,1) .ne. cospIN%Npoints) then + Lmisr_subcolumn = .false. + Lmisr_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(misr_simulator): The number of points in the input fields are inconsistent' + endif + if (size(cospIN%tau_067,2) .ne. cospIN%Ncolumns) then + Lmisr_subcolumn = .false. + Lmisr_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(misr_simulator): The number of sub-columns in the input fields are inconsistent' + endif + if (size(cospIN%tau_067,3) .ne. cospIN%Nlevels .OR. & + size(cospgridIN%hgt_matrix,2) .ne. cospIN%Nlevels .OR. & + size(cospgridIN%at,2) .ne. cospIN%Nlevels) then + Lmisr_subcolumn = .false. + Lmisr_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(misr_simulator): The number of levels in the input fields are inconsistent' + endif + endif + + ! MODIS + if (Lmodis_subcolumn .or. Lmodis_column) then + if (size(cospIN%fracLiq,1) .ne. cospIN%Npoints .OR. & + size(cospIN%tau_067,1) .ne. cospIN%Npoints .OR. & + size(cospIN%asym,1) .ne. cospIN%Npoints .OR. & + size(cospIN%ss_alb,1) .ne. cospIN%Npoints) then + Lmodis_subcolumn = .false. + Lmodis_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(modis_simulator): The number of points in the input fields are inconsistent' + endif + if (size(cospIN%fracLiq,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%tau_067,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%asym,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%ss_alb,2) .ne. cospIN%Ncolumns) then + Lmodis_subcolumn = .false. + Lmodis_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(modis_simulator): The number of sub-columns in the input fields are inconsistent' + endif + if (size(cospIN%fracLiq,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%tau_067,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%asym,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%ss_alb,3) .ne. cospIN%Nlevels) then + Lmodis_subcolumn = .false. + Lmodis_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(modis_simulator): The number of levels in the input fields are inconsistent' + endif + endif + + ! CLOUDSAT + if (Lcloudsat_subcolumn .or. Lcloudsat_column) then + if (size(cospIN%z_vol_cloudsat,1) .ne. cospIN%Npoints .OR. & + size(cospIN%kr_vol_cloudsat,1) .ne. cospIN%Npoints .OR. & + size(cospIN%g_vol_cloudsat,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%hgt_matrix,1) .ne. cospIN%Npoints) then + Lcloudsat_subcolumn = .false. + Lcloudsat_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(cloudsat_simulator): The number of points in the input fields are inconsistent' + endif + if (size(cospIN%z_vol_cloudsat,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%kr_vol_cloudsat,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%g_vol_cloudsat,2) .ne. cospIN%Ncolumns) then + Lcloudsat_subcolumn = .false. + Lcloudsat_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(cloudsat_simulator): The number of sub-columns in the input fields are inconsistent' + endif + if (size(cospIN%z_vol_cloudsat,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%kr_vol_cloudsat,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%g_vol_cloudsat,3) .ne. cospIN%Nlevels .OR. & + size(cospgridIN%hgt_matrix,2) .ne. cospIN%Nlevels) then + Lcloudsat_subcolumn = .false. + Lcloudsat_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(cloudsat_simulator): The number of levels in the input fields are inconsistent' + endif + endif + + ! GROUND LIDAR @ 532nm + if (LgrLidar532_subcolumn .or. LgrLidar532_column) then + if (size(cospIN%beta_mol_grLidar532,1) .ne. cospIN%Npoints .OR. & + size(cospIN%betatot_grLidar532,1) .ne. cospIN%Npoints .OR. & + size(cospIN%tau_mol_grLidar532,1) .ne. cospIN%Npoints .OR. & + size(cospIN%tautot_grLidar532,1) .ne. cospIN%Npoints) then + LgrLidar532_subcolumn = .false. + LgrLidar532_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(grLidar532_simulator): The number of points in the input fields are inconsistent' + endif + if (size(cospIN%betatot_grLidar532,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%tautot_grLidar532,2) .ne. cospIN%Ncolumns) then + LgrLidar532_subcolumn = .false. + LgrLidar532_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(grLidar532_simulator): The number of sub-columns in the input fields are inconsistent' + endif + if (size(cospIN%beta_mol_grLidar532,2) .ne. cospIN%Nlevels .OR. & + size(cospIN%betatot_grLidar532,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%tau_mol_grLidar532,2) .ne. cospIN%Nlevels .OR. & + size(cospIN%tautot_grLidar532,3) .ne. cospIN%Nlevels) then + LgrLidar532_subcolumn = .false. + LgrLidar532_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(grLidar532_simulator): The number of levels in the input fields are inconsistent' + endif + endif + + ! ATLID + if (Latlid_subcolumn .or. Latlid_column) then + if (size(cospIN%beta_mol_atlid,1) .ne. cospIN%Npoints .OR. & + size(cospIN%betatot_atlid,1) .ne. cospIN%Npoints .OR. & + size(cospIN%tau_mol_atlid,1) .ne. cospIN%Npoints .OR. & + size(cospIN%tautot_atlid,1) .ne. cospIN%Npoints) then + Latlid_subcolumn = .false. + Latlid_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(atlid_simulator): The number of points in the input fields are inconsistent' + endif + if (size(cospIN%betatot_atlid,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%tautot_atlid,2) .ne. cospIN%Ncolumns) then + Latlid_subcolumn = .false. + Latlid_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(atlid_simulator): The number of sub-columns in the input fields are inconsistent' + endif + if (size(cospIN%beta_mol_atlid,2) .ne. cospIN%Nlevels .OR. & + size(cospIN%betatot_atlid,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%tau_mol_atlid,2) .ne. cospIN%Nlevels .OR. & + size(cospIN%tautot_atlid,3) .ne. cospIN%Nlevels) then + Latlid_subcolumn = .false. + Latlid_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(atlid_simulator): The number of levels in the input fields are inconsistent' + endif + endif + + ! CALIPSO + if (Lcalipso_subcolumn .or. Lcalipso_column) then + if (size(cospIN%beta_mol_calipso,1) .ne. cospIN%Npoints .OR. & + size(cospIN%betatot_calipso,1) .ne. cospIN%Npoints .OR. & + size(cospIN%betatot_liq_calipso,1) .ne. cospIN%Npoints .OR. & + size(cospIN%betatot_ice_calipso,1) .ne. cospIN%Npoints .OR. & + size(cospIN%tau_mol_calipso,1) .ne. cospIN%Npoints .OR. & + size(cospIN%tautot_calipso,1) .ne. cospIN%Npoints .OR. & + size(cospIN%tautot_liq_calipso,1) .ne. cospIN%Npoints .OR. & + size(cospIN%tautot_ice_calipso,1) .ne. cospIN%Npoints) then + Lcalipso_subcolumn = .false. + Lcalipso_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(calipso_simulator): The number of points in the input fields are inconsistent' + endif + if (size(cospIN%betatot_calipso,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%betatot_liq_calipso,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%betatot_ice_calipso,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%tautot_calipso,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%tautot_liq_calipso,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%tautot_ice_calipso,2) .ne. cospIN%Ncolumns) then + Lcalipso_subcolumn = .false. + Lcalipso_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(calipso_simulator): The number of sub-columns in the input fields are inconsistent' + endif + if (size(cospIN%beta_mol_calipso,2) .ne. cospIN%Nlevels .OR. & + size(cospIN%betatot_calipso,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%betatot_liq_calipso,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%betatot_ice_calipso,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%tau_mol_calipso,2) .ne. cospIN%Nlevels .OR. & + size(cospIN%tautot_calipso,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%tautot_liq_calipso,3) .ne. cospIN%Nlevels .OR. & + size(cospIN%tautot_ice_calipso,3) .ne. cospIN%Nlevels) then + Lcalipso_subcolumn = .false. + Lcalipso_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(calipso_simulator): The number of levels in the input fields are inconsistent' + endif + endif + + ! PARASOL + if (Lparasol_subcolumn .or. Lparasol_column) then + if (size(cospIN%tautot_S_liq,1) .ne. cospIN%Npoints .OR. & + size(cospIN%tautot_S_ice,1) .ne. cospIN%Npoints) then + Lparasol_subcolumn = .false. + Lparasol_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(parasol_simulator): The number of points in the input fields are inconsistent' + endif + if (size(cospIN%tautot_S_liq,2) .ne. cospIN%Ncolumns .OR. & + size(cospIN%tautot_S_ice,2) .ne. cospIN%Ncolumns) then + Lparasol_subcolumn = .false. + Lparasol_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(parasol_simulator): The number of levels in the input fields are inconsistent' + endif + endif + + ! RTTOV + if (Lrttov_column) then + if (size(cospgridIN%pfull,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%at,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%qv,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%hgt_matrix_half,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%u_sfc) .ne. cospIN%Npoints .OR. & + size(cospgridIN%v_sfc) .ne. cospIN%Npoints .OR. & + size(cospgridIN%skt) .ne. cospIN%Npoints .OR. & + size(cospgridIN%phalf,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%cloudIce,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%cloudLiq,1) .ne. cospIN%Npoints .OR. & + size(cospgridIN%rttov_sfcmask) .ne. cospIN%Npoints .OR. & + size(cospgridIN%lon) .ne. cospIN%Npoints .OR. & + size(cospgridIN%lat) .ne. cospIN%Npoints) then + Lrttov_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(rttov_simulator): The number of points in the input fields are inconsistent' + endif + if (size(cospgridIN%pfull,2) .ne. cospIN%Nlevels .OR. & + size(cospgridIN%at,2) .ne. cospIN%Nlevels .OR. & + size(cospgridIN%qv,2) .ne. cospIN%Nlevels .OR. & + size(cospgridIN%hgt_matrix_half,2) .ne. cospIN%Nlevels .OR. & + size(cospgridIN%phalf,2) .ne. cospIN%Nlevels+1) then + Lrttov_column = .false. + nError=nError+1 + errorMessage(nError) = 'ERROR(rttov_simulator): The number of levels in the input fields are inconsistent' + endif + endif + end subroutine cosp_errorCheck + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! END MODULE + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +END MODULE MOD_COSP diff --git a/src/cosp_config.F90 b/src/cosp_config.F90 index d100e1f7da..79a57f9b5e 100755 --- a/src/cosp_config.F90 +++ b/src/cosp_config.F90 @@ -358,6 +358,35 @@ MODULE MOD_COSP_CONFIG integer, parameter :: & cloudsat_preclvl = 39 + ! for DPLRW simulator + real(wp),parameter :: & + trbl_LS = 0.5, & + trbl_CU = 1.0 + real(wp),parameter :: & + lvtemp_MIN = -80., & + lvtemp_MAX = 30., & + lvtemp_WID = 2., & + lvdBZe_MIN = -40., & + lvdBZe_MAX = 30., & + lvdBZe_WID = 2., & + lvdplr_MIN = -6.0, & + lvdplr_MAX = 6.0, & + lvdplr_WID = 0.2, & + lvspwd_MIN = 0.0, & + lvspwd_MAX = 5.0, & + lvspwd_WID = 0.1 + integer,parameter :: & + Nlvtemp = nint( (lvtemp_MAX-lvtemp_MIN)/lvtemp_WID ), & + NlvdBZe = nint( (lvdBZe_MAX-lvdBZe_MIN)/lvdBZe_WID ), & + Nlvdplr = nint( (lvdplr_MAX-lvdplr_MIN)/lvdplr_WID ), & + Nlvspwd = nint( (lvspwd_MAX-lvspwd_MIN)/lvspwd_WID ) + + real(wp),parameter :: & + lvtemp_grid(Nlvtemp) = (/( lvtemp_MIN+lvtemp_WID*(i-0.5), i=1,Nlvtemp )/), & + lvdBZe_grid(NlvdBZe) = (/( lvdBZe_MIN+lvdBZe_WID*(i-0.5), i=1,NlvdBZe )/), & + lvdplr_grid(Nlvdplr) = (/( lvdplr_MIN+lvdplr_WID*(i-0.5), i=1,Nlvdplr )/), & + lvspwd_grid(Nlvspwd) = (/( lvspwd_MIN+lvspwd_WID*(i-0.5), i=1,Nlvspwd )/) + ! #################################################################################### ! CLOUDSAT and MODIS joint product information (2018.11.22) ! #################################################################################### diff --git a/src/cosp_config.F90.bak b/src/cosp_config.F90.bak new file mode 100755 index 0000000000..d100e1f7da --- /dev/null +++ b/src/cosp_config.F90.bak @@ -0,0 +1,500 @@ +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +! Copyright (c) 2015, Regents of the University of Colorado +! All rights reserved. +! +! Redistribution and use in source and binary forms, with or without modification, are +! permitted provided that the following conditions are met: +! +! 1. Redistributions of source code must retain the above copyright notice, this list of +! conditions and the following disclaimer. +! +! 2. Redistributions in binary form must reproduce the above copyright notice, this list +! of conditions and the following disclaimer in the documentation and/or other +! materials provided with the distribution. +! +! 3. Neither the name of the copyright holder nor the names of its contributors may be +! used to endorse or promote products derived from this software without specific prior +! written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +! +! History: +! Jul 2007 - A. Bodas-Salcedo - Initial version +! Jul 2008 - A. Bodas-Salcedo - Added definitions of ISCCP axes +! Oct 2008 - H. Chepfer - Added PARASOL_NREFL +! Jun 2010 - R. Marchand - Modified to support quickbeam V3, added ifdef for +! hydrometeor definitions +! May 2015 - D. Swales - Tidied up. Set up appropriate fields during initialization. +! June 2015- D. Swales - Moved hydrometeor class variables to hydro_class_init in +! the module quickbeam_optics. +! Mar 2016 - D. Swales - Added scops_ccfrac. Was previously hardcoded in prec_scops.f90. +! Mar 2018 - R. Guzman - Added LIDAR_NTYPE for the OPAQ diagnostics +! Apr 2018 - R. Guzman - Added parameters for GROUND LIDAR and ATLID simulators +! Nov 2018 - T. Michibata - Added CloudSat+MODIS Warmrain Diagnostics +! Mar 2024 - C. Wall - Added MODIS joint-histogram diagnostics +! +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +MODULE MOD_COSP_CONFIG + USE COSP_KINDS, ONLY: wp,dp + IMPLICIT NONE + + ! ##################################################################################### + ! Common COSP information + ! ##################################################################################### + character(len=32) :: & + COSP_VERSION ! COSP Version ID (set in cosp_interface_init) + real(wp),parameter :: & + R_UNDEF = -1.0E30, & ! Missing value + R_GROUND = -1.0E20, & ! Flag for below ground results + scops_ccfrac = 0.05 ! Fraction of column (or subcolumn) covered with convective + ! precipitation (default is 5%). *NOTE* This quantity may vary + ! between modeling centers. + logical :: & + use_vgrid ! True=Use new grid for L3 CLOUDAT and CALIPSO + integer,parameter :: & + SR_BINS = 15, & ! Number of bins (backscattering coefficient) in CALOPSO LIDAR simulator. + N_HYDRO = 9 ! Number of hydrometeor classes used by quickbeam radar simulator. + + ! #################################################################################### + ! Joint histogram bin-boundaries + ! tau is used by ISCCP and MISR + ! pres is used by ISCCP + ! hgt is used by MISR + ! ReffLiq is used by MODIS + ! ReffIce is used by MODIS + ! *NOTE* ALL JOINT-HISTOGRAM BIN BOUNDARIES ARE DECLARED AND DEFINED HERE IN + ! COSP_CONFIG, WITH THE EXCEPTION OF THE TAU AXIS USED BY THE MODIS SIMULATOR, + ! WHICH IS SET DURING INITIALIZATION IN COSP_INTERFACE_INIT. + ! #################################################################################### + ! Optical depth bin axis + integer,parameter :: & + ntau=7 + real(wp),parameter,dimension(ntau+1) :: & + tau_binBounds = (/0.0, 0.3, 1.3, 3.6, 9.4, 23., 60., 10000./) + real(wp),parameter,dimension(ntau) :: & + tau_binCenters = (/0.15, 0.80, 2.45, 6.5, 16.2, 41.5, 100.0/) + real(wp),parameter,dimension(2,ntau) :: & + tau_binEdges = reshape(source=(/0.0, 0.3, 0.3, 1.3, 1.3, 3.6, 3.6, & + 9.4, 9.4, 23.0, 23.0, 60.0, 60.0, 100000.0/), & + shape=(/2,ntau/)) + + ! Optical depth bin axes (ONLY USED BY MODIS SIMULATOR IN v1.4) + integer :: l,k + integer,parameter :: & + ntauV1p4 = 6 + real(wp),parameter,dimension(ntauV1p4+1) :: & + tau_binBoundsV1p4 = (/0.3, 1.3, 3.6, 9.4, 23., 60., 10000./) + real(wp),parameter,dimension(2,ntauV1p4) :: & + tau_binEdgesV1p4 = reshape(source =(/tau_binBoundsV1p4(1),((tau_binBoundsV1p4(k),l=1,2), & + k=2,ntauV1p4),100000._wp/),shape = (/2,ntauV1p4/)) + real(wp),parameter,dimension(ntauV1p4) :: & + tau_binCentersV1p4 = (tau_binEdgesV1p4(1,:)+tau_binEdgesV1p4(2,:))/2._wp + + ! Cloud-top height pressure bin axis + integer,parameter :: & + npres = 7 + real(wp),parameter,dimension(npres+1) :: & + pres_binBounds = (/0., 180., 310., 440., 560., 680., 800., 10000./) + real(wp),parameter,dimension(npres) :: & + pres_binCenters = (/90000., 74000., 62000., 50000., 37500., 24500., 9000./) + real(wp),parameter,dimension(2,npres) :: & + pres_binEdges = reshape(source=(/100000.0, 80000.0, 80000.0, 68000.0, 68000.0, & + 56000.0, 56000.0, 44000.0, 44000.0, 31000.0, & + 31000.0, 18000.0, 18000.0, 0.0/), & + shape=(/2,npres/)) + + ! Cloud-top height bin axis #1 + integer,parameter :: & + nhgt = 16 + real(wp),parameter,dimension(nhgt+1) :: & + hgt_binBounds = (/-.99,0.,0.5,1.,1.5,2.,2.5,3.,4.,5.,7.,9.,11.,13.,15.,17.,99./) + real(wp),parameter,dimension(nhgt) :: & + hgt_binCenters = 1000*(/0.,0.25,0.75,1.25,1.75,2.25,2.75,3.5,4.5,6.,8.,10.,12., & + 14.5,16.,18./) + real(wp),parameter,dimension(2,nhgt) :: & + hgt_binEdges = 1000.0*reshape(source=(/-99.0, 0.0, 0.0, 0.5, 0.5, 1.0, 1.0, 1.5, & + 1.5, 2.0, 2.0, 2.5, 2.5, 3.0, 3.0, 4.0, & + 4.0, 5.0, 5.0, 7.0, 7.0, 9.0, 9.0,11.0, & + 11.0,13.0,13.0,15.0,15.0,17.0,17.0,99.0/),& + shape=(/2,nhgt/)) + + ! Liquid and Ice particle bins for MODIS joint histogram of optical-depth and particle + ! size + ! Bin edges match Pincus et al. 2023 observational data (doi:10.5194/essd-15-2483-2023) + ! Additional Re bins to capture all simulated clouds + integer :: i,j + integer,parameter :: & + nReffLiq = 8, & ! Number of ReffLiq bins for tau/ReffLiq and LWP/ReffLiq joint-histogram + nReffIce = 8 ! Number of ReffIce bins for tau/ReffICE and IWP/ReffIce joint-histogram + real(wp),parameter,dimension(nReffLiq+1) :: & + reffLIQ_binBounds = (/0.0, 4.0e-6, 8e-6, 1.0e-5, 1.25e-5, 1.5e-5, 2.0e-5, 3.0e-5, 1.0e-2/) + real(wp),parameter,dimension(nReffIce+1) :: & + reffICE_binBounds = (/0.0,5.0e-6, 1.0e-5, 2.0e-5, 3.0e-5, 4.0e-5, 5.0e-5, 6.0e-5, 1.0e-2/) + real(wp),parameter,dimension(2,nReffICE) :: & + reffICE_binEdges = reshape(source=(/reffICE_binBounds(1),((reffICE_binBounds(k), & + l=1,2),k=2,nReffICE),reffICE_binBounds(nReffICE+1)/), & + shape = (/2,nReffICE/)) + real(wp),parameter,dimension(2,nReffLIQ) :: & + reffLIQ_binEdges = reshape(source=(/reffLIQ_binBounds(1),((reffLIQ_binBounds(k), & + l=1,2),k=2,nReffLIQ),reffLIQ_binBounds(nReffLIQ+1)/), & + shape = (/2,nReffLIQ/)) + real(wp),parameter,dimension(nReffICE) :: & + reffICE_binCenters = (reffICE_binEdges(1,:)+reffICE_binEdges(2,:))/2._wp + real(wp),parameter,dimension(nReffLIQ) :: & + reffLIQ_binCenters = (reffLIQ_binEdges(1,:)+reffLIQ_binEdges(2,:))/2._wp + + ! LWP and IWP bins for MODIS joint histogram of (1) LWP and droplet size + ! and (2) IWP and particle size + integer, parameter :: & + nLWP = 7, & ! Number of bins for LWP/ReffLiq joint-histogram + nIWP = 7 ! Number of bins for IWP/ReffIce joint-histogram + real(wp),parameter,dimension(nLWP+1) :: & + LWP_binBounds = (/0., 0.01, 0.03, 0.06, 0.10, 0.15, 0.25, 20.0/) ! kg/m2 + real(wp),parameter,dimension(nIWP+1) :: & + IWP_binBounds = (/0., 0.02, 0.05, 0.10, 0.20, 0.40, 1.00, 20.0/) ! kg/m2 + real(wp),parameter,dimension(2,nLWP) :: & + LWP_binEdges = reshape(source=(/LWP_binBounds(1),((LWP_binBounds(k), & + l=1,2),k=2,nLWP),LWP_binBounds(nLWP+1)/), & + shape = (/2,nLWP/)) + real(wp),parameter,dimension(2,nIWP) :: & + IWP_binEdges = reshape(source=(/IWP_binBounds(1),((IWP_binBounds(k), & + l=1,2),k=2,nIWP),IWP_binBounds(nIWP+1)/), & + shape = (/2,nIWP/)) + real(wp),parameter,dimension(nLWP) :: & + LWP_binCenters = (LWP_binEdges(1,:)+LWP_binEdges(2,:))/2._wp + real(wp),parameter,dimension(nIWP) :: & + IWP_binCenters = (IWP_binEdges(1,:)+IWP_binEdges(2,:))/2._wp + ! #################################################################################### + ! Constants used by RTTOV. + ! #################################################################################### + ! None + ! #################################################################################### + ! Constants used by the PARASOL simulator. + ! #################################################################################### + integer,parameter :: & + PARASOL_NREFL = 5, & ! Number of angles in LUT + PARASOL_NTAU = 7 ! Number of optical depths in LUT + real(wp),parameter,dimension(PARASOL_NREFL) :: & + PARASOL_SZA = (/0.0, 20.0, 40.0, 60.0, 80.0/) + REAL(WP),parameter,dimension(PARASOL_NTAU) :: & + PARASOL_TAU = (/0., 1., 5., 10., 20., 50., 100./) + + ! LUTs + REAL(WP),parameter,dimension(PARASOL_NREFL,PARASOL_NTAU) :: & + ! LUT for liquid particles + rlumA = reshape(source=(/ 0.03, 0.03, 0.03, 0.03, 0.03, & + 0.090886, 0.072185, 0.058410, 0.052498, 0.034730, & + 0.283965, 0.252596, 0.224707, 0.175844, 0.064488, & + 0.480587, 0.436401, 0.367451, 0.252916, 0.081667, & + 0.695235, 0.631352, 0.509180, 0.326551, 0.098215, & + 0.908229, 0.823924, 0.648152, 0.398581, 0.114411, & + 1.0, 0.909013, 0.709554, 0.430405, 0.121567/), & + shape=(/PARASOL_NREFL,PARASOL_NTAU/)), & + ! LUT for ice particles + rlumB = reshape(source=(/ 0.03, 0.03, 0.03, 0.03, 0.03, & + 0.092170, 0.087082, 0.083325, 0.084935, 0.054157, & + 0.311941, 0.304293, 0.285193, 0.233450, 0.089911, & + 0.511298, 0.490879, 0.430266, 0.312280, 0.107854, & + 0.712079, 0.673565, 0.563747, 0.382376, 0.124127, & + 0.898243, 0.842026, 0.685773, 0.446371, 0.139004, & + 0.976646, 0.912966, 0.737154, 0.473317, 0.145269/), & + shape=(/PARASOL_NREFL,PARASOL_NTAU/)) + + ! #################################################################################### + ! ISCCP simulator tau/CTP joint histogram information + ! #################################################################################### + integer,parameter :: & + numISCCPTauBins = ntau, & ! Number of optical depth bins + numISCCPPresBins = npres ! Number of pressure bins + real(wp),parameter,dimension(ntau+1) :: & + isccp_histTau = tau_binBounds ! Joint-histogram boundaries (optical depth) + real(wp),parameter,dimension(npres+1) :: & + isccp_histPres = pres_binBounds ! Joint-histogram boundaries (cloud pressure) + real(wp),parameter,dimension(ntau) :: & + isccp_histTauCenters = tau_binCenters ! Joint histogram bin centers (optical depth) + real(wp),parameter,dimension(npres) :: & + isccp_histPresCenters = pres_binCenters ! Joint histogram bin centers (cloud pressure) + real(wp),parameter,dimension(2,ntau) :: & + isccp_histTauEdges = tau_binEdges ! Joint histogram bin edges (optical depth) + real(wp),parameter,dimension(2,npres) :: & + isccp_histPresEdges = pres_binEdges ! Joint histogram bin edges (cloud pressure) + + ! #################################################################################### + ! MISR simulator tau/CTH joint histogram information + ! #################################################################################### + integer,parameter :: & + numMISRHgtBins = nhgt, & ! Number of cloud-top height bins + numMISRTauBins = ntau ! Number of optical depth bins + ! Joint histogram boundaries + real(wp),parameter,dimension(numMISRHgtBins+1) :: & + misr_histHgt = hgt_binBounds ! Joint-histogram boundaries (cloud height) + real(wp),parameter,dimension(numMISRTauBins+1) :: & + misr_histTau = tau_binBounds ! Joint-histogram boundaries (optical-depth) + real(wp),parameter,dimension(numMISRHgtBins) :: & + misr_histHgtCenters = hgt_binCenters ! Joint-histogram bin centers (cloud height) + real(wp),parameter,dimension(2,numMISRHgtBins) :: & + misr_histHgtEdges = hgt_BinEdges ! Joint-histogram bin edges (cloud height) + + ! #################################################################################### + ! MODIS simulator tau/CTP joint histogram information + ! #################################################################################### + integer,parameter :: & + numMODISPresBins = npres ! Number of pressure bins for joint-histogram + real(wp),parameter,dimension(numMODISPresBins + 1) :: & + modis_histPres = 100*pres_binBounds ! Joint-histogram boundaries (cloud pressure) + real(wp),parameter,dimension(2, numMODISPresBins) :: & + modis_histPresEdges = 100*pres_binEdges ! Joint-histogram bin edges (cloud pressure) + real(wp),parameter,dimension(numMODISPresBins) :: & + modis_histPresCenters = 100*pres_binCenters ! Joint-histogram bin centers (cloud pressure) + + ! For the MODIS simulator we want to preserve the ability for cospV1.4.0 to use the + ! old histogram bin boundaries for optical depth, so these are set up in initialization. + integer :: & + numMODISTauBins ! Number of tau bins for joint-histogram + real(wp),allocatable,dimension(:) :: & + modis_histTau ! Joint-histogram boundaries (optical depth) + real(wp),allocatable,dimension(:,:) :: & + modis_histTauEdges ! Joint-histogram bin edges (optical depth) + real(wp),allocatable,dimension(:) :: & + modis_histTauCenters ! Joint-histogram bin centers (optical depth) + + ! #################################################################################### + ! MODIS simulator tau/ReffICE and tau/ReffLIQ joint-histogram information + ! #################################################################################### + ! Ice + integer,parameter :: & + numMODISReffIceBins = nReffIce ! Number of bins for joint-histogram + real(wp),parameter,dimension(nReffIce+1) :: & + modis_histReffIce = reffICE_binBounds ! Effective radius bin boundaries + real(wp),parameter,dimension(nReffIce) :: & + modis_histReffIceCenters = reffICE_binCenters ! Effective radius bin centers + real(wp),parameter,dimension(2,nReffICE) :: & + modis_histReffIceEdges = reffICE_binEdges ! Effective radius bin edges + + ! Liquid + integer,parameter :: & + numMODISReffLiqBins = nReffLiq ! Number of bins for joint-histogram + real(wp),parameter,dimension(nReffLiq+1) :: & + modis_histReffLiq = reffLIQ_binBounds ! Effective radius bin boundaries + real(wp),parameter,dimension(nReffLiq) :: & + modis_histReffLiqCenters = reffLIQ_binCenters ! Effective radius bin centers + real(wp),parameter,dimension(2,nReffLiq) :: & + modis_histReffLiqEdges = reffLIQ_binEdges ! Effective radius bin edges + ! #################################################################################### + ! MODIS simulator LWP/ReffLIQ and IWP/ReffIce joint-histogram information + ! #################################################################################### + ! Liquid + integer,parameter :: & + numMODISLWPBins = nLWP ! Number of bins for joint-histogram + real(wp),parameter,dimension(nLWP+1) :: & + modis_histLWP = LWP_binBounds ! LWP bin boundaries + real(wp),parameter,dimension(nLWP) :: & + modis_histLWPCenters = LWP_binCenters ! LWP bin centers + real(wp),parameter,dimension(2,nLWP) :: & + modis_histLWPEdges = LWP_binEdges ! LWP bin edges + + ! Ice + integer,parameter :: & + numMODISIWPBins = nIWP ! Number of bins for joint-histogram + real(wp),parameter,dimension(nIWP+1) :: & + modis_histIWP = IWP_binBounds ! IWP bin boundaries + real(wp),parameter,dimension(nIWP) :: & + modis_histIWPCenters = IWP_binCenters ! IWP bin centers + real(wp),parameter,dimension(2,nIWP) :: & + modis_histIWPEdges = IWP_binEdges ! IWP bin edges + + ! #################################################################################### + ! CLOUDSAT reflectivity histogram information + ! #################################################################################### + integer,parameter :: & + CLOUDSAT_DBZE_BINS = 15, & ! Number of dBZe bins in histogram (cfad) + CLOUDSAT_DBZE_MIN = -100, & ! Minimum value for radar reflectivity + CLOUDSAT_DBZE_MAX = 80, & ! Maximum value for radar reflectivity + CLOUDSAT_CFAD_ZE_MIN = -50, & ! Lower value of the first CFAD Ze bin + CLOUDSAT_CFAD_ZE_WIDTH = 5 ! Bin width (dBZe) + + real(wp),parameter,dimension(CLOUDSAT_DBZE_BINS+1) :: & + cloudsat_histRef = (/CLOUDSAT_DBZE_MIN,(/(i, i=int(CLOUDSAT_CFAD_ZE_MIN+CLOUDSAT_CFAD_ZE_WIDTH),& + int(CLOUDSAT_CFAD_ZE_MIN+(CLOUDSAT_DBZE_BINS-1)*CLOUDSAT_CFAD_ZE_WIDTH), & + int(CLOUDSAT_CFAD_ZE_WIDTH))/),CLOUDSAT_DBZE_MAX/) + real(wp),parameter,dimension(2,CLOUDSAT_DBZE_BINS) :: & + cloudsat_binEdges = reshape(source=(/cloudsat_histRef(1),((cloudsat_histRef(k), & + l=1,2),k=2,CLOUDSAT_DBZE_BINS),cloudsat_histRef(CLOUDSAT_DBZE_BINS+1)/),& + shape = (/2,CLOUDSAT_DBZE_BINS/)) + real(wp),parameter,dimension(CLOUDSAT_DBZE_BINS) :: & + cloudsat_binCenters = (cloudsat_binEdges(1,:)+cloudsat_binEdges(2,:))/2._wp + + ! Parameters for Cloudsat near-surface precipitation diagnostics. + ! Precipitation classes. + integer, parameter :: & + nCloudsatPrecipClass = 10 + integer, parameter :: & + pClass_noPrecip = 0, & ! No precipitation + pClass_Rain1 = 1, & ! Rain possible + pClass_Rain2 = 2, & ! Rain probable + pClass_Rain3 = 3, & ! Rain certain + pClass_Snow1 = 4, & ! Snow possible + pClass_Snow2 = 5, & ! Snow certain + pClass_Mixed1 = 6, & ! Mixed-precipitation possible + pClass_Mixed2 = 7, & ! Mixed-precipitation certain + pClass_Rain4 = 8, & ! Heavy rain + pClass_default = 9 ! Default + ! Reflectivity bin boundaries, used by decision tree to classify precipitation type. + real(wp), dimension(4),parameter :: & + Zenonbinval =(/0._wp, -5._wp, -7.5_wp, -15._wp/) + real(wp), dimension(6),parameter :: & + Zbinvallnd = (/10._wp, 5._wp, 2.5_wp, -2.5_wp, -5._wp, -15._wp/) + ! Vertical level index(Nlvgrid) for Cloudsat precipitation occurence/frequency diagnostics. + ! Level 39 of Nlvgrid(40) is 480-960m. + integer, parameter :: & + cloudsat_preclvl = 39 + + ! #################################################################################### + ! CLOUDSAT and MODIS joint product information (2018.11.22) + ! #################################################################################### + ! @ COSP_DIAG_WARMRAIN: + integer, parameter :: CFODD_NCLASS = 3 ! # of classes for CFODD (classified by MODIS Reff) + integer, parameter :: WR_NREGIME = 3 ! # of warm-rain regimes (non-precip/drizzling/raining) + integer, parameter :: SGCLD_CLR = 0 ! sub-grid cloud ID (fracout): clear-sky + integer, parameter :: SGCLD_ST = 1 ! sub-grid cloud ID (fracout): stratiform + integer, parameter :: SGCLD_CUM = 2 ! sub-grid cloud ID (fracout): cumulus + real(wp),parameter :: CWP_THRESHOLD = 0.00 ! cloud water path threshold + real(wp),parameter :: COT_THRESHOLD = 0.30 ! cloud optical thickness threshold + real(wp),parameter,dimension(CFODD_NCLASS+1) :: & + CFODD_BNDRE = (/5.0e-6, 12.0e-6, 18.0e-6, 35.0e-6/) ! Reff bnds + real(wp),parameter,dimension(2) :: & + CFODD_BNDZE = (/-15.0, 0.0/) ! dBZe bnds (cloud/drizzle/precip) + real(wp),parameter :: CFODD_DBZE_MIN = -30.0 ! Minimum value of CFODD dBZe bin + real(wp),parameter :: CFODD_DBZE_MAX = 20.0 ! Maximum value of CFODD dBZe bin + real(wp),parameter :: CFODD_ICOD_MIN = 0.0 ! Minimum value of CFODD ICOD bin + real(wp),parameter :: CFODD_ICOD_MAX = 60.0 ! Maximum value of CFODD ICOD bin + real(wp),parameter :: CFODD_DBZE_WIDTH = 2.0 ! Bin width (dBZe) + real(wp),parameter :: CFODD_ICOD_WIDTH = 2.0 ! Bin width (ICOD) + integer,parameter :: & + CFODD_NDBZE = INT( (CFODD_DBZE_MAX-CFODD_DBZE_MIN)/CFODD_DBZE_WIDTH ) ! Number of CFODD dBZe bins + integer,parameter :: & + CFODD_NICOD = INT( (CFODD_ICOD_MAX-CFODD_ICOD_MIN)/CFODD_ICOD_WIDTH ) ! Number of CFODD ICOD bins + real(wp),parameter,dimension(CFODD_NDBZE+1) :: & + CFODD_HISTDBZE = (/int(CFODD_DBZE_MIN),(/(i, i=int(CFODD_DBZE_MIN+CFODD_DBZE_WIDTH), & + int(CFODD_DBZE_MIN+(CFODD_NDBZE-1)*CFODD_DBZE_WIDTH), & + int(CFODD_DBZE_WIDTH))/),int(CFODD_DBZE_MAX)/) + real(wp),parameter,dimension(CFODD_NICOD+1) :: & + CFODD_HISTICOD = (/int(CFODD_ICOD_MIN),(/(i, i=int(CFODD_ICOD_MIN+CFODD_ICOD_WIDTH), & + int(CFODD_ICOD_MIN+(CFODD_NICOD-1)*CFODD_ICOD_WIDTH), & + int(CFODD_ICOD_WIDTH))/),int(CFODD_ICOD_MAX)/) + real(wp),parameter,dimension(2,CFODD_NDBZE) :: & + CFODD_HISTDBZEedges = reshape(source=(/CFODD_HISTDBZE(1),((CFODD_HISTDBZE(k), & + l=1,2),k=2,CFODD_NDBZE),CFODD_HISTDBZE(CFODD_NDBZE+1)/), & + shape = (/2,CFODD_NDBZE/)) + real(wp),parameter,dimension(CFODD_NDBZE) :: & + CFODD_HISTDBZEcenters = (CFODD_HISTDBZEedges(1,:)+CFODD_HISTDBZEedges(2,:))/2._wp + real(wp),parameter,dimension(2,CFODD_NICOD) :: & + CFODD_HISTICODedges = reshape(source=(/CFODD_HISTICOD(1),((CFODD_HISTICOD(k), & + l=1,2),k=2,CFODD_NICOD),CFODD_HISTICOD(CFODD_NICOD+1)/), & + shape = (/2,CFODD_NICOD/)) + real(wp),parameter,dimension(CFODD_NICOD) :: & + CFODD_HISTICODcenters = (CFODD_HISTICODedges(1,:)+CFODD_HISTICODedges(2,:))/2._wp + + ! #################################################################################### + ! Parameters used by the CALIPSO LIDAR simulator + ! #################################################################################### + ! CALISPO backscatter histogram bins + real(wp),parameter :: & + S_cld = 5.0, & ! Threshold for cloud detection + S_att = 0.01, & ! + S_cld_att = 30. ! Threshold for undefined cloud phase detection + real(wp),parameter,dimension(SR_BINS+1) :: & + calipso_histBsct = (/-1.,0.01,1.2,3.0,5.0,7.0,10.0,15.0,20.0,25.0,30.0,40.0,50.0, & + 60.0,80.0,999./) ! Backscatter histogram bins + real(wp),parameter,dimension(2,SR_BINS) :: & + calipso_binEdges = reshape(source=(/calipso_histBsct(1),((calipso_histBsct(k), & + l=1,2),k=2,SR_BINS),calipso_histBsct(SR_BINS+1)/), & + shape = (/2,SR_BINS/)) + real(wp),parameter,dimension(SR_BINS) :: & + calipso_binCenters = (calipso_binEdges(1,:)+calipso_binEdges(2,:))/2._wp + + integer,parameter :: & + LIDAR_NTEMP = 40, & + LIDAR_NCAT = 4, & ! Number of categories for cloudtop heights (high/mid/low/tot) + LIDAR_NTYPE = 3 ! Number of categories for OPAQ (opaque/thin cloud + z_opaque) + real(wp),parameter,dimension(LIDAR_NTEMP) :: & + LIDAR_PHASE_TEMP= & + (/-91.5,-88.5,-85.5,-82.5,-79.5,-76.5,-73.5,-70.5,-67.5,-64.5, & + -61.5,-58.5,-55.5,-52.5,-49.5,-46.5,-43.5,-40.5,-37.5,-34.5, & + -31.5,-28.5,-25.5,-22.5,-19.5,-16.5,-13.5,-10.5, -7.5, -4.5, & + -1.5, 1.5, 4.5, 7.5, 10.5, 13.5, 16.5, 19.5, 22.5, 25.5/) + real(wp),parameter,dimension(2,LIDAR_NTEMP) :: & + LIDAR_PHASE_TEMP_BNDS=reshape(source= & + (/-273.15, -90., -90., -87., -87., -84., -84., -81., -81., -78., & + -78., -75., -75., -72., -72., -69., -69., -66., -66., -63., & + -63., -60., -60., -57., -57., -54., -54., -51., -51., -48., & + -48., -45., -45., -42., -42., -39., -39., -36., -36., -33., & + -33., -30., -30., -27., -27., -24., -24., -21., -21., -18., & + -18., -15., -15., -12., -12., -9., -9., -6., -6., -3., & + -3., 0., 0., 3., 3., 6., 6., 9., 9., 12., & + 12., 15., 15., 18., 18., 21., 21., 24., 24., 100. /), & + shape=(/2,40/)) + + ! #################################################################################### + ! Parameters used by the GROUND LIDAR simulator + ! #################################################################################### + ! GROUND LIDAR backscatter histogram bins +! real(wp),parameter :: & +! S_cld = 5.0, & ! Threshold for cloud detection +! S_att = 0.01, & ! +! S_cld_att = 30. ! Threshold for undefined cloud phase detection + real(wp),parameter,dimension(SR_BINS+1) :: & + grLidar532_histBsct = (/-1.,0.01,1.2,3.0,5.0,7.0,10.0,15.0,20.0,25.0,30.0,40.0,50.0, & + 60.0,80.0,999./) ! Backscatter histogram bins + real(wp),parameter,dimension(2,SR_BINS) :: & + grLidar532_binEdges = reshape(source=(/grLidar532_histBsct(1),((grLidar532_histBsct(k), & + l=1,2),k=2,SR_BINS),grLidar532_histBsct(SR_BINS+1)/), & + shape = (/2,SR_BINS/)) + real(wp),parameter,dimension(SR_BINS) :: & + grLidar532_binCenters = (grLidar532_binEdges(1,:)+grLidar532_binEdges(2,:))/2._wp + +! integer,parameter :: & +! LIDAR_NCAT = 4 ! Number of categories for cloudtop heights (high/mid/low/tot) + + ! #################################################################################### + ! Parameters used by the ATLID LIDAR simulator + ! #################################################################################### + ! ATLID LIDAR backscatter histogram bins + real(wp),parameter :: & + S_cld_atlid = 1.74, & ! Threshold for cloud detection + S_att_atlid = 0.01, & ! + S_cld_att_atlid = 6.67 ! Threshold for undefined cloud phase detection + real(wp),parameter,dimension(SR_BINS+1) :: & + atlid_histBsct = (/-1.,0.01,1.03,1.38,1.74,2.07,2.62,3.65,4.63,5.63,6.67,8.8,11.25, & + 13.2,17.2,999./) ! Backscatter histogram bins + real(wp),parameter,dimension(2,SR_BINS) :: & + atlid_binEdges = reshape(source=(/atlid_histBsct(1),((atlid_histBsct(k), & + l=1,2),k=2,SR_BINS),atlid_histBsct(SR_BINS+1)/), & + shape = (/2,SR_BINS/)) + real(wp),parameter,dimension(SR_BINS) :: & + atlid_binCenters = (atlid_binEdges(1,:)+atlid_binEdges(2,:))/2._wp + +! integer,parameter :: & +! LIDAR_NCAT = 4 ! Number of categories for cloudtop heights (high/mid/low/tot) + + ! #################################################################################### + ! New vertical grid used by CALIPSO and CLOUDSAT L3 (set up during initialization) + ! #################################################################################### + integer :: & + Nlvgrid ! Number of levels in New grid + real(wp),dimension(:),allocatable :: & + vgrid_zl, & ! New grid bottoms + vgrid_zu, & ! New grid tops + vgrid_z, & ! New grid center + dz ! dZ + +END MODULE MOD_COSP_CONFIG diff --git a/src/cosp_stats.F90 b/src/cosp_stats.F90 index 4619bca2ba..fae50d89ab 100755 --- a/src/cosp_stats.F90 +++ b/src/cosp_stats.F90 @@ -130,6 +130,12 @@ MODULE MOD_COSP_STATS refl_in, & ! Surface reflectance (point,channel) (1) fl_rain, & ! Precipitation (rain) flux (kg/m2/s) fl_snow ! Precipitation (snow) flux (kg/m2/s) + + ! added by DPLRW + real(wp),allocatable,dimension(:,:) :: & + gwvel, & ! grid verical velocity (m/s) + gcumf ! grid cumulus mass flux (kg/m^2/s) + end type cosp_column_inputs @@ -166,6 +172,9 @@ MODULE MOD_COSP_STATS real(wp),dimension(maxhclass,nd,nRe_types) :: fc, rho_eff real(wp),dimension(Re_MAX_BIN) :: base_list,step_list + ! added by DPLRW + real(wp),dimension(maxhclass,mt_ntt,nRe_types) :: vf_scaled,vq_scaled,v3_scaled,v0_scaled,m3_scaled,m0_scaled + end type radar_cfg ! ###################################################################################### @@ -203,6 +212,9 @@ MODULE MOD_COSP_STATS z_vol_cloudsat, & ! Effective reflectivity factor (mm^6/m^3) kr_vol_cloudsat, & ! Attenuation coefficient hydro (dB/km) g_vol_cloudsat ! Attenuation coefficient gases (dB/km) + real(wp),allocatable,dimension(:,:,:,:) :: & + vfall, vfsqu, zehyd, krhyd, & ! for DPLRW, each hydrometeor + vtrm3, vtrm0, mmnt3, mmnt0 real(wp),allocatable,dimension(:,:) :: & beta_mol_calipso, & ! Lidar molecular backscatter coefficient (calipso @ 532nm) beta_mol_grLidar532, & ! Lidar molecular backscatter coefficient (ground-lidar @ 532nm) diff --git a/src/cosp_stats.F90.bak b/src/cosp_stats.F90.bak new file mode 100755 index 0000000000..4619bca2ba --- /dev/null +++ b/src/cosp_stats.F90.bak @@ -0,0 +1,781 @@ +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +! Copyright (c) 2015, Regents of the University of Colorado +! All rights reserved. +! +! Redistribution and use in source and binary forms, with or without modification, are +! permitted provided that the following conditions are met: +! +! 1. Redistributions of source code must retain the above copyright notice, this list of +! conditions and the following disclaimer. +! +! 2. Redistributions in binary form must reproduce the above copyright notice, this list +! of conditions and the following disclaimer in the documentation and/or other +! materials provided with the distribution. +! +! 3. Neither the name of the copyright holder nor the names of its contributors may be +! used to endorse or promote products derived from this software without specific prior +! written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +! +! History: +! Jul 2007 - A. Bodas-Salcedo - Initial version +! Jul 2008 - A. Bodas-Salcedo - Added capability of producing outputs in standard grid +! Oct 2008 - J.-L. Dufresne - Bug fixed. Assignment of Npoints,Nlevels,Nhydro,Ncolumns +! in COSP_STATS +! Oct 2008 - H. Chepfer - Added PARASOL reflectance arguments +! Jun 2010 - T. Yokohata, T. Nishimura and K. Ogochi - Added NEC SXs optimisations +! Jan 2013 - G. Cesana - Added betaperp and temperature arguments +! - Added phase 3D/3Dtemperature/Map output variables in diag_lidar +! May 2015 - D. Swales - Modified for cosp2.0 +! Nov 2018 - T. Michibata - Added CloudSat+MODIS Warmrain Diagnostics +! Jun 2025 - J.K. Shaw. - Added COSP-RTTOV integration and swathing +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +MODULE MOD_COSP_STATS + USE COSP_KINDS, ONLY: wp + USE MOD_COSP_CONFIG, & + ONLY: R_UNDEF, R_GROUND, & + SGCLD_CLR, SGCLD_ST, & + SGCLD_CUM, & + CWP_THRESHOLD, COT_THRESHOLD, & + CFODD_NDBZE, CFODD_NICOD, & + CFODD_BNDRE, CFODD_BNDZE, & + CFODD_NCLASS, & + CFODD_DBZE_MIN, CFODD_DBZE_MAX, & + CFODD_ICOD_MIN, CFODD_ICOD_MAX, & + CFODD_DBZE_WIDTH, CFODD_ICOD_WIDTH, & + CFODD_HISTDBZE, CFODD_HISTICOD, & + WR_NREGIME, VGRID_ZU, & + VGRID_ZL, VGRID_Z, & + DZ + USE COSP_PHYS_CONSTANTS, ONLY: tmelt, radius_earth + USE COSP_MATH_CONSTANTS, ONLY: pi + USE MOD_COSP_RTTOV_UTIL, ONLY: rttov_cfg + IMPLICIT NONE + + ! ###################################################################################### + ! Quickbeam parameters + integer,parameter :: & + maxhclass = 20, & ! Qucikbeam maximum number of hydrometeor classes. + nRe_types = 550, & ! Quickbeam maximum number or Re size bins allowed in N and Z_scaled look up table. + nd = 85, & ! Qucikbeam number of discrete particles used in construction DSDs. + mt_ntt = 39, & ! Quickbeam number of temperatures in mie LUT. + Re_BIN_LENGTH = 10, & ! Quickbeam minimum Re interval in scale LUTs + Re_MAX_BIN = 250 ! Quickbeam maximum Re interval in scale LUTs + real(wp),parameter :: & + dmin = 0.1, & ! Quickbeam minimum size of discrete particle + dmax = 10000. ! Quickbeam maximum size of discrete particle + + ! ###################################################################################### + ! TYPE cosp_column_inputs + ! ###################################################################################### + type cosp_column_inputs + integer :: & + Npoints, & ! Number of gridpoints. + Ncolumns, & ! Number of columns. + Nlevels ! Number of levels. + + integer,allocatable,dimension(:) :: & + sunlit ! Sunlit flag (0-1) + + real(wp),allocatable,dimension(:,:) :: & + at, & ! Temperature (K) + pfull, & ! Pressure (Pa) + phalf, & ! Pressure at half-levels (Pa) + qv, & ! Specific humidity (kg/kg) + co2, & ! CO2 (kg/kg) + ch4, & ! Methane (kg/kg) + n2o, & ! N2O (kg/kg) + co, & ! CO (kg/kg) + so2, & ! SO2 (kg/kg) + hgt_matrix, & ! Height of atmosphere layer (km) + hgt_matrix_half ! Height of bottom interface of atm layer(km) + ! First level contains the bottom of the top layer. + ! Last level contains the bottom of the surface layer. + + real(wp),allocatable,dimension(:) :: & + land, & ! Land/Sea mask (0 for ocean, 1 for land) + skt, & ! Surface temperature (K) + surfelev ! Surface Elevation (m) + ! Fields used ONLY by RTTOV + real(wp),allocatable,dimension(:) :: & + u_sfc, & ! Surface u-wind (m/s) + v_sfc, & ! Surface v-wind (m/s) + t2m, & ! 2-meter temperature (K) + q2m, & ! 2-meter specific humidity (kg/kg) + lat, & ! Latitude (deg) + lon, & ! Longitude (deg) + sza, & ! Solar Zenith Angle in degrees + psfc, & ! Surface pressure (Pa) + rttov_sfcmask ! Mask for RTTOV surface types (0 for ocean, 1 for land, 2 for sea ice) + + real(wp),allocatable,dimension(:,:) :: & + o3, & ! Ozone (kg/kg) + tca, & ! Total layer cloud fraction (0-1) + cloudIce, & ! Cloud ice water mixing ratio (kg/kg) + cloudLiq, & ! Cloud liquid water mixing ratio (kg/kg) + DeffLiq, & ! Cloud liquid effective diameter (um) + DeffIce, & ! Cloud ice effective diameter (um) + rttov_date, & ! Date of the profile as year (e.g. 2013), month (1-12), and day (1-31) + rttov_time, & ! Time of profile as hour, minute, second. + emis_in, & ! Surface emissivity (point,channel) (1) + refl_in, & ! Surface reflectance (point,channel) (1) + fl_rain, & ! Precipitation (rain) flux (kg/m2/s) + fl_snow ! Precipitation (snow) flux (kg/m2/s) + end type cosp_column_inputs + + + ! ###################################################################################### + ! TYPE swath_inputs + ! ###################################################################################### + type swath_inputs + + integer :: & + N_inst_swaths = 0 + real(wp),dimension(20) :: & + inst_localtimes, & + inst_localtime_widths + + end type swath_inputs + + type radar_cfg + ! Radar properties + real(wp) :: freq,k2 + integer :: nhclass ! Number of hydrometeor classes in use + integer :: use_gas_abs, do_ray + logical :: radar_at_layer_one ! If true radar is assume to be at the edge + ! of the first layer, if the first layer is the + ! surface than a ground-based radar. If the + ! first layer is the top-of-atmosphere, then + ! a space borne radar. + + ! Variables used to store Z scale factors + character(len=240) :: scale_LUT_file_name + logical :: load_scale_LUTs, update_scale_LUTs + logical, dimension(maxhclass,nRe_types) :: N_scale_flag + logical, dimension(maxhclass,mt_ntt,nRe_types) :: Z_scale_flag,Z_scale_added_flag + real(wp),dimension(maxhclass,mt_ntt,nRe_types) :: Ze_scaled,Zr_scaled,kr_scaled + real(wp),dimension(maxhclass,nd,nRe_types) :: fc, rho_eff + real(wp),dimension(Re_MAX_BIN) :: base_list,step_list + + end type radar_cfg + + ! ###################################################################################### + ! TYPE cosp_optical_inputs + ! ###################################################################################### + type cosp_optical_inputs + integer :: & + Npoints, & ! Number of gridpoints. + Ncolumns, & ! Number of columns. + Nlevels, & ! Number of levels. + Npart, & ! Number of cloud meteors for LIDAR simulators. + Nrefl, & ! Number of reflectances for PARASOL simulator + Ninst_rttov ! Number of RTTOV instruments + real(wp),pointer :: & + emis_grey => null() ! Greybody (spectrally flat) emissivity value for RTTOV + real(wp) :: & + emsfc_lw ! Surface emissivity @ 11micron + real(wp),allocatable,dimension(:,:,:) :: & + frac_out, & ! Cloud fraction + tau_067, & ! Optical depth @ 0.67micron + emiss_11, & ! Emissivity @ 11 micron + fracLiq, & ! Fraction of optical-depth due to liquid (MODIS) + asym, & ! Assymetry parameter @ 3.7micron (MODIS) + ss_alb, & ! Single-scattering albedo @ 3.7micron (MODIS) + betatot_calipso, & ! Lidar backscatter coefficient (calipso @ 532nm) + betatot_grLidar532, & ! Lidar backscatter coefficient (ground-lidar @ 532nm) + betatot_atlid, & ! Lidar backscatter coefficient (atlid @ 355nm) + betatot_ice_calipso, & ! Lidar backscatter coefficient ICE (calipso @ 532nm) + betatot_liq_calipso, & ! Lidar backscatter coefficient LIQUID (calipso @ 532nm) + tautot_calipso, & ! Lidar Optical thickness (calipso @ 532nm) + tautot_grLidar532, & ! Lidar Optical thickness (ground-lidar @ 532nm) + tautot_atlid, & ! Lidar Optical thickness (atlid @ 355nm) + tautot_ice_calipso, & ! Lidar Ice Optical thickness (calipso @ 532nm) + tautot_liq_calipso, & ! Lidar Liquid Optical thickness (calipso @ 532nm) + z_vol_cloudsat, & ! Effective reflectivity factor (mm^6/m^3) + kr_vol_cloudsat, & ! Attenuation coefficient hydro (dB/km) + g_vol_cloudsat ! Attenuation coefficient gases (dB/km) + real(wp),allocatable,dimension(:,:) :: & + beta_mol_calipso, & ! Lidar molecular backscatter coefficient (calipso @ 532nm) + beta_mol_grLidar532, & ! Lidar molecular backscatter coefficient (ground-lidar @ 532nm) + beta_mol_atlid, & ! Lidar molecular backscatter coefficient (atlid @ 355nm) + tau_mol_calipso, & ! Lidar molecular optical depth (calipso @ 532nm) + tau_mol_grLidar532, & ! Lidar molecular optical depth (ground-lidar @ 532nm) + tau_mol_atlid, & ! Lidar molecular optical depth (atlid @ 355nm) + tautot_S_liq, & ! Parasol Liquid water optical thickness, from TOA to SFC + tautot_S_ice, & ! Parasol Ice water optical thickness, from TOA to SFC + fracPrecipIce ! Fraction of precipitation which is frozen (1). + type(radar_cfg) :: & + rcfg_cloudsat ! Radar configuration information (CLOUDSAT) + type(rttov_cfg),dimension(:),pointer :: & + cfg_rttov ! RTTOV configuration information (multiple instruments) + type(swath_inputs),dimension(6) :: & ! Could be a pointer but fine + cospswathsIN + end type cosp_optical_inputs + + +CONTAINS + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + !---------- SUBROUTINE COSP_CHANGE_VERTICAL_GRID ---------------- + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +SUBROUTINE COSP_CHANGE_VERTICAL_GRID(Npoints,Ncolumns,Nlevels,zfull,zhalf,y,Nglevels,newgrid_bot,newgrid_top,r,log_units) + implicit none + ! Input arguments + integer,intent(in) :: Npoints !# of grid points + integer,intent(in) :: Nlevels !# of levels + integer,intent(in) :: Ncolumns !# of columns + real(wp),dimension(Npoints,Nlevels),intent(in) :: zfull ! Height at model levels [m] (Bottom of model layer) + real(wp),dimension(Npoints,Nlevels),intent(in) :: zhalf ! Height at half model levels [m] (Bottom of model layer) + real(wp),dimension(Npoints,Ncolumns,Nlevels),intent(in) :: y ! Variable to be changed to a different grid + integer,intent(in) :: Nglevels !# levels in the new grid + real(wp),dimension(Nglevels),intent(in) :: newgrid_bot ! Lower boundary of new levels [m] + real(wp),dimension(Nglevels),intent(in) :: newgrid_top ! Upper boundary of new levels [m] + logical,optional,intent(in) :: log_units ! log units, need to convert to linear units + ! Output + real(wp),dimension(Npoints,Ncolumns,Nglevels),intent(out) :: r ! Variable on new grid + + ! Local variables + integer :: i,j,k + logical :: lunits + integer :: l + real(wp) :: w ! Weight + real(wp) :: dbb, dtb, dbt, dtt ! Distances between edges of both grids + integer :: Nw ! Number of weights + real(wp) :: wt ! Sum of weights + real(wp),dimension(Nlevels) :: oldgrid_bot,oldgrid_top ! Lower and upper boundaries of model grid + real(wp) :: yp ! Local copy of y at a particular point. + ! This allows for change of units. + + lunits=.false. + if (present(log_units)) lunits=log_units + + r = 0._wp + + do i=1,Npoints + ! Calculate tops and bottoms of new and old grids + oldgrid_bot = zhalf(i,:) + oldgrid_top(1:Nlevels-1) = oldgrid_bot(2:Nlevels) + oldgrid_top(Nlevels) = zfull(i,Nlevels) + zfull(i,Nlevels) - zhalf(i,Nlevels) ! Top level symmetric + l = 0 ! Index of level in the old grid + ! Loop over levels in the new grid + do k = 1,Nglevels + Nw = 0 ! Number of weigths + wt = 0._wp ! Sum of weights + ! Loop over levels in the old grid and accumulate total for weighted average + do + l = l + 1 + w = 0.0 ! Initialise weight to 0 + if (l > Nlevels) exit + ! Distances between edges of both grids + dbb = oldgrid_bot(l) - newgrid_bot(k) + dtb = oldgrid_top(l) - newgrid_bot(k) + dbt = oldgrid_bot(l) - newgrid_top(k) + dtt = oldgrid_top(l) - newgrid_top(k) + if (dbt >= 0.0) exit ! Do next level in the new grid + if (dtb > 0.0) then + if (dbb <= 0.0) then + if (dtt <= 0) then + w = dtb + else + w = newgrid_top(k) - newgrid_bot(k) + endif + else + if (dtt <= 0) then + w = oldgrid_top(l) - oldgrid_bot(l) + else + w = -dbt + endif + endif + ! If layers overlap (w/=0), then accumulate + if (w /= 0.0) then + Nw = Nw + 1 + wt = wt + w + do j=1,Ncolumns + if (lunits) then + if (y(i,j,l) /= R_UNDEF) then + yp = 10._wp**(y(i,j,l)/10._wp) + else + yp = 0._wp + endif + else + yp = y(i,j,l) + endif + r(i,j,k) = r(i,j,k) + w*yp + enddo + endif + endif + enddo + l = l - 2 + if (l < 1) l = 0 + ! Calculate average in new grid + if (Nw > 0) then + do j=1,Ncolumns + r(i,j,k) = r(i,j,k)/wt + enddo + endif + enddo + enddo + + ! Set points under surface to R_UNDEF, and change to dBZ if necessary + do k=1,Nglevels + do j=1,Ncolumns + do i=1,Npoints + if (newgrid_top(k) > zhalf(i,1)) then ! Level above model bottom level + if (lunits) then + if (r(i,j,k) <= 0.0) then + r(i,j,k) = R_UNDEF + else + r(i,j,k) = 10._wp*log10(r(i,j,k)) + endif + endif + else ! Level below surface + r(i,j,k) = R_GROUND + endif + enddo + enddo + enddo + +END SUBROUTINE COSP_CHANGE_VERTICAL_GRID + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + !------------- SUBROUTINE COSP_LIDAR_ONLY_CLOUD ----------------- + ! (c) 2008, Lawrence Livermore National Security Limited Liability Corporation. + ! All rights reserved. + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + SUBROUTINE COSP_LIDAR_ONLY_CLOUD(Npoints, Ncolumns, Nlevels, beta_tot, beta_mol, & + Ze_tot, lidar_only_freq_cloud, tcc, radar_tcc, radar_tcc2) + ! Inputs + integer,intent(in) :: & + Npoints, & ! Number of horizontal gridpoints + Ncolumns, & ! Number of subcolumns + Nlevels ! Number of vertical layers + real(wp),dimension(Npoints,Nlevels),intent(in) :: & + beta_mol ! Molecular backscatter + real(wp),dimension(Npoints,Ncolumns,Nlevels),intent(in) :: & + beta_tot, & ! Total backscattered signal + Ze_tot ! Radar reflectivity + ! Outputs + real(wp),dimension(Npoints,Nlevels),intent(out) :: & + lidar_only_freq_cloud + real(wp),dimension(Npoints),intent(out) ::& + tcc, & ! + radar_tcc, & ! + radar_tcc2 ! + + ! local variables + real(wp) :: sc_ratio + real(wp),parameter :: & + s_cld=5.0, & + s_att=0.01 + integer :: flag_sat,flag_cld,pr,i,j,flag_radarcld,flag_radarcld_no1km,j_1km + + lidar_only_freq_cloud = 0._wp + tcc = 0._wp + radar_tcc = 0._wp + radar_tcc2 = 0._wp + do pr=1,Npoints + do i=1,Ncolumns + flag_sat = 0 + flag_cld = 0 + flag_radarcld = 0 !+JEK + flag_radarcld_no1km=0 !+JEK + ! look for j_1km from bottom to top + j = 1 + do while (Ze_tot(pr,i,j) .eq. R_GROUND) + j = j+1 + enddo + j_1km = j+1 !this is the vertical index of 1km above surface + + do j=1,Nlevels + sc_ratio = beta_tot(pr,i,j)/beta_mol(pr,j) + if ((sc_ratio .le. s_att) .and. (flag_sat .eq. 0)) flag_sat = j + if (Ze_tot(pr,i,j) .lt. -30.) then !radar can't detect cloud + if ( (sc_ratio .gt. s_cld) .or. (flag_sat .eq. j) ) then !lidar sense cloud + lidar_only_freq_cloud(pr,j)=lidar_only_freq_cloud(pr,j)+1. !top->surf + flag_cld=1 + endif + else !radar sense cloud (z%Ze_tot(pr,i,j) .ge. -30.) + flag_cld=1 + flag_radarcld=1 + if (j .gt. j_1km) flag_radarcld_no1km=1 + endif + enddo !levels + if (flag_cld .eq. 1) tcc(pr)=tcc(pr)+1._wp + if (flag_radarcld .eq. 1) radar_tcc(pr)=radar_tcc(pr)+1. + if (flag_radarcld_no1km .eq. 1) radar_tcc2(pr)=radar_tcc2(pr)+1. + enddo !columns + enddo !points + lidar_only_freq_cloud=lidar_only_freq_cloud/Ncolumns + tcc=tcc/Ncolumns + radar_tcc=radar_tcc/Ncolumns + radar_tcc2=radar_tcc2/Ncolumns + + ! Unit conversion + where(lidar_only_freq_cloud /= R_UNDEF) & + lidar_only_freq_cloud = lidar_only_freq_cloud*100._wp + where(tcc /= R_UNDEF) tcc = tcc*100._wp + where(radar_tcc /= R_UNDEF) radar_tcc = radar_tcc*100._wp + where(radar_tcc2 /= R_UNDEF) radar_tcc2 = radar_tcc2*100._wp + + END SUBROUTINE COSP_LIDAR_ONLY_CLOUD + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + !----------------------- SUBROUTINE COSP_DIAG_WARMRAIN ------------------------ + ! (c) 2018, Research Institute for Applied Mechanics (RIAM), Kyushu Univ. + ! All rights reserved. + ! * Purpose: 1) Diagnose Contoured Frequency by Optical Depth Diagram (CFODD) + ! from CloudSat Radar and MODIS retrievals. + ! 2) Diagnose Warm-Rain Occurrence Frequency (nonprecip/drizzle/rain) + ! from CloudSat Radar. + ! * History: Jan 2018 (T.Michibata): Test run + ! May 2018 (T.Michibata): update for COSP2 + ! Sep 2018 (T.Michibata): modified I/O + ! Nov 2018 (T.Michibata): minor revisions + ! May 2020 (T.Michibata and X.Jing): bug-fix for frac_out dimsize + ! Apr 2022 (T.Michibata): bug-fix for non-sunlit columns + ! * References: Michibata et al. (GMD'19, doi:10.5194/gmd-12-4297-2019) + ! Michibata et al. (GRL'20, doi:10.1029/2020GL088340) + ! Suzuki et al. (JAS'10, doi:10.1175/2010JAS3463.1) + ! Suzuki et al. (JAS'15, doi:10.1175/JAS-D-14-0265.1) + ! Jing et al. (JCLIM'19, doi:10.1175/jcli-d-18-0789.1) + ! * Contact: Takuro Michibata (RIAM, Kyushu University, Japan). + ! E-mail: michibata@riam.kyushu-u.ac.jp + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + SUBROUTINE COSP_DIAG_WARMRAIN( Npoints, Ncolumns, Nlevels, & !! in + temp, zlev, & !! in + lwp, liqcot, liqreff, liqcfrc, & !! in + iwp, icecot, icereff, icecfrc, & !! in + fracout, dbze, & !! in + cfodd_ntotal, & !! inout + wr_occfreq_ntotal ) !! inout + + ! Inputs + integer, intent(in) :: & + Npoints, & ! Number of horizontal gridpoints + Ncolumns, & ! Number of subcolumns + Nlevels ! Number of vertical layers + real(wp), dimension(Npoints), intent(in) :: & + lwp, & ! MODIS LWP [kg m-2] + liqcot, & ! MODIS liq. COT + liqreff, & ! MODIS liq. Reff [m] + liqcfrc ! MODIS liq. cloud fraction + real(wp), dimension(Npoints), intent(in) :: & + iwp, & ! MODIS IWP [kg m-2] + icecot, & ! MODIS ice COT + icereff, & ! MODIS ice Reff [m] + icecfrc ! MODIS ice cloud fraction + real(wp), dimension(Npoints,Nlevels), intent(in) :: & + zlev ! altitude [m] for model level + real(wp), dimension(Npoints,1,Nlevels),intent(in) :: & + temp ! temperature [K] + real(wp), dimension(Npoints,Ncolumns,Nlevels),intent(in) :: & + fracout, & ! SCOPS subcolumn retrieval + dbze ! Radar reflectivity [dBZe] + + ! Outputs + real(wp),dimension(Npoints,CFODD_NDBZE,CFODD_NICOD,CFODD_NCLASS),intent(inout) :: & + cfodd_ntotal ! # of CFODD samples for each ICOD/dBZe bin + real(wp),dimension(Npoints,WR_NREGIME),intent(inout) :: & + wr_occfreq_ntotal ! # of SLWC samples + + ! Local variables + integer :: i, j, k + integer :: kctop, kcbtm + integer :: icls + integer :: iregime + real(wp) :: cmxdbz + real(wp) :: diagcgt !! diagnosed cloud geometric thickness [m] + real(wp) :: diagicod !! diagnosed in-cloud optical depth + real(wp) :: cbtmh !! diagnosed in-cloud optical depth + real(wp), dimension(Npoints,Ncolumns,Nlevels) :: icod !! in-cloud optical depth (ICOD) + logical :: octop, ocbtm, oslwc + integer, dimension(Npoints,Ncolumns,Nlevels) :: fracout_int !! fracout (decimal to integer) + fracout_int(:,:,:) = 0 + where ((fracout(:,:,:) .ge. 0.5_wp) .and. (fracout(:,:,:) .lt. 1.5_wp )) fracout_int(:,:,:) = 1 + where ((fracout(:,:,:) .ge. 1.5_wp) .and. (fracout(:,:,:) .lt. 2.5_wp )) fracout_int(:,:,:) = 2 + !! initialize + do i = 1, Npoints + if ( lwp(i) .eq. R_UNDEF ) then ! for non-sunlit columns + cfodd_ntotal(i,:,:,:) = R_UNDEF + wr_occfreq_ntotal(i,:) = R_UNDEF + icod(i,:,:) = R_UNDEF + else + cfodd_ntotal(i,:,:,:) = 0._wp + wr_occfreq_ntotal(i,:) = 0._wp + icod(i,:,:) = 0._wp + endif + enddo + + do i = 1, Npoints + !! check by MODIS retrieval + if ( ( lwp(i) .le. CWP_THRESHOLD .and. lwp(i) .ne. R_UNDEF ) .or. & + & liqcot(i) .le. COT_THRESHOLD .or. & + & liqreff(i) .lt. CFODD_BNDRE(1) .or. & + & liqreff(i) .gt. CFODD_BNDRE(4) .or. & + & iwp(i) .gt. CWP_THRESHOLD .or. & !! exclude ice cloud + & icecot(i) .gt. COT_THRESHOLD .or. & !! exclude ice cloud + & icereff(i) .gt. CFODD_BNDRE(1) ) then !! exclude ice cloud + cycle + else + !! retrieve the CFODD array based on Reff + icls = 0 + if ( liqreff(i) .ge. CFODD_BNDRE(1) .and. liqreff(i) .lt. CFODD_BNDRE(2) ) then + icls = 1 + elseif( liqreff(i) .ge. CFODD_BNDRE(2) .and. liqreff(i) .lt. CFODD_BNDRE(3) ) then + icls = 2 + elseif( liqreff(i) .ge. CFODD_BNDRE(3) .and. liqreff(i) .le. CFODD_BNDRE(4) ) then + icls = 3 + endif + endif + + !CDIR NOLOOPCHG + do j = 1, Ncolumns, 1 + octop = .true. !! initialize + ocbtm = .true. !! initialize + kcbtm = 0 !! initialize + kctop = 0 !! initialize + !CDIR NOLOOPCHG + do k = Nlevels, 1, -1 !! scan from cloud-bottom to cloud-top + if ( dbze(i,j,k) .eq. R_GROUND .or. & + dbze(i,j,k) .eq. R_UNDEF ) cycle + if ( ocbtm .and. & + & fracout_int(i,j,k) .ne. SGCLD_CLR .and. & + & dbze(i,j,k) .ge. CFODD_DBZE_MIN ) then + ocbtm = .false. !! cloud bottom detected + kcbtm = k + kctop = k + endif + if ( octop .and. & !! scan cloud-top + & .not. ocbtm .and. & !! cloud-bottom already detected + & fracout_int(i,j,k) .ne. SGCLD_CLR .and. & !! exclude clear sky + & dbze(i,j,k) .ge. CFODD_DBZE_MIN ) then + kctop = k !! update + endif + enddo !! k loop + if( ocbtm ) cycle !! cloud wasn't detected in this subcolumn + !! check SLWC? + if( temp(i,1,kctop) .lt. tmelt ) cycle !! return to the j (subcolumn) loop + oslwc = .true. + cmxdbz = CFODD_DBZE_MIN !! initialized + + !CDIR NOLOOPCHG + do k = kcbtm, kctop, -1 + cmxdbz = max( cmxdbz, dbze(i,j,k) ) !! column maximum dBZe update + if ( fracout_int(i,j,k) .eq. SGCLD_CLR .or. & + & fracout_int(i,j,k) .eq. SGCLD_CUM .or. & + & dbze (i,j,k) .lt. CFODD_DBZE_MIN ) then + oslwc = .false. + endif + enddo + if ( .not. oslwc ) cycle !! return to the j (subcolumn) loop + + !! warm-rain occurrence frequency + iregime = 0 + if( cmxdbz .lt. CFODD_BNDZE(1) ) then + iregime = 1 !! non-precipitating + elseif( cmxdbz .ge. CFODD_BNDZE(1) .and. cmxdbz .lt. CFODD_BNDZE(2) ) then + iregime = 2 !! drizzling + elseif( cmxdbz .ge. CFODD_BNDZE(2) ) then + iregime = 3 !! raining + endif + wr_occfreq_ntotal(i,iregime) = wr_occfreq_ntotal(i,iregime) + 1._wp + + !! retrievals of ICOD and dBZe bin for CFODD plane + diagcgt = zlev(i,kctop) - zlev(i,kcbtm) + cbtmh = zlev(i,kcbtm) + !CDIR NOLOOPCHG + do k = kcbtm, kctop, -1 + if( k .eq. kcbtm ) then + diagicod = liqcot(i) + else + diagicod = liqcot(i) * ( 1._wp - ( (zlev(i,k)-cbtmh)/diagcgt)**(5._wp/3._wp) ) + endif + icod(i,j,k) = min( diagicod, CFODD_ICOD_MAX ) + enddo + + enddo ! j (Ncolumns) + + !! # of samples for CFODD (joint 2d-histogram dBZe vs ICOD) + call hist2d( dbze(i,1:Ncolumns,1:Nlevels), icod(i,1:Ncolumns,1:Nlevels), & + & Ncolumns*Nlevels, & + & CFODD_HISTDBZE, CFODD_NDBZE, CFODD_HISTICOD, CFODD_NICOD, & + & cfodd_ntotal( i, 1:CFODD_NDBZE, 1:CFODD_NICOD, icls ) ) + + enddo ! i (Npoints) + + RETURN + END SUBROUTINE COSP_DIAG_WARMRAIN + + ! ###################################################################################### + ! FUNCTION hist1D + ! ###################################################################################### + function hist1d(Npoints,var,nbins,bins) + ! Inputs + integer,intent(in) :: & + Npoints, & ! Number of points in input array + Nbins ! Number of bins for sorting + real(wp),intent(in),dimension(Npoints) :: & + var ! Input variable to be sorted + real(wp),intent(in),dimension(Nbins+1) :: & + bins ! Histogram bins [lowest,binTops] + ! Outputs + real(wp),dimension(Nbins) :: & + hist1d ! Output histogram + ! Local variables + integer :: ij + + do ij=2,Nbins+1 + hist1D(ij-1) = count(var .ge. bins(ij-1) .and. var .lt. bins(ij)) + if (count(var .eq. R_GROUND) .ge. 1) hist1D(ij-1)=R_UNDEF + enddo + + end function hist1D + + ! ###################################################################################### + ! SUBROUTINE hist2D + ! ###################################################################################### + subroutine hist2D(var1,var2,npts,bin1,nbin1,bin2,nbin2,jointHist) + implicit none + + ! INPUTS + integer, intent(in) :: & + npts, & ! Number of data points to be sorted + nbin1, & ! Number of bins in histogram direction 1 + nbin2 ! Number of bins in histogram direction 2 + real(wp),intent(in),dimension(npts) :: & + var1, & ! Variable 1 to be sorted into bins + var2 ! variable 2 to be sorted into bins + real(wp),intent(in),dimension(nbin1+1) :: & + bin1 ! Histogram bin 1 boundaries + real(wp),intent(in),dimension(nbin2+1) :: & + bin2 ! Histogram bin 2 boundaries + ! OUTPUTS + real(wp),intent(out),dimension(nbin1,nbin2) :: & + jointHist + + ! LOCAL VARIABLES + integer :: ij,ik + + do ij=2,nbin1+1 + do ik=2,nbin2+1 + jointHist(ij-1,ik-1)=count(var1 .ge. bin1(ij-1) .and. var1 .lt. bin1(ij) .and. & + var2 .ge. bin2(ik-1) .and. var2 .lt. bin2(ik)) + enddo + enddo + end subroutine hist2D + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE cosp_cleanUp + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + subroutine cosp_cleanUp() + deallocate(vgrid_zl,vgrid_zu,vgrid_z,dz) + end subroutine cosp_cleanUp + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE compute_orbitmasks + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + subroutine compute_orbitmasks(Npoints,Nlocaltimes,localtimes,localtime_widths, & + lat,lon,month,day,hour,minute,swath_mask_out,Nswathed_out) + + ! Inputs + integer,intent(in) :: & + Npoints, & + Nlocaltimes + + real(wp),dimension(Nlocaltimes),intent(in) :: & + localtimes, & + localtime_widths + + real(wp),dimension(Npoints),intent(in) :: & + lat, & + lon, & + month, & + day, & + hour, & + minute + + ! Output + logical,dimension(Npoints),intent(out) :: & + swath_mask_out ! Mask of reals over all gridcells + integer,intent(out) :: & + Nswathed_out + + ! Local variables + integer :: i ! iterator + + real(wp),dimension(Npoints,Nlocaltimes) :: & + sat_lon, & ! Central longitude of the instrument. + dlon, & ! distance to satellite longitude in degrees + dx ! distance to satellite longitude in km? + + logical,dimension(Npoints,Nlocaltimes) :: & + swath_mask_all ! Mask of logicals over all local times, gridcells + + integer, dimension(Npoints) :: & + rttov_DOY ! Array of day of year values + real(wp), dimension(Npoints) :: & + localtime_offsets ! Offset values to avoid striping with hourly RT calls. [hours] + ! Compute the day of the year and determine the localtime offset + do i=1,Npoints + call get_DOY(int(month(i)), int(day(i)), rttov_DOY(i)) + end do + localtime_offsets = (mod(rttov_DOY(:), 5) - 2) / 5.0 ! Need to cast to real + + ! Iterate over local times + swath_mask_all(:,:) = .false. + do i=1,Nlocaltimes + ! Calculate the central longitude for each gridcell and orbit + sat_lon(:,i) = 15.0 * (localtimes(i) + localtime_offsets - (hour + minute / 60)) + ! Calculate distance (in degrees) from each grid cell to the satellite central long + dlon(:,i) = mod((lon - sat_lon(:,i) + 180.0), 360.0) - 180.0 + ! calculate distance to satellite in km. Remember to convert to radians for cos/sine calls + dx(:,i) = dlon(:,i) * (pi/180.0) * COS(lat * pi / 180) * radius_earth + ! Determine if a gridcell falls in the swath width + where (abs(dx(:,i))<(localtime_widths(i)*0.5)) + swath_mask_all(:,i) = .true. + end where + end do + + ! Mask is true where values should be calculated + swath_mask_out = ANY( swath_mask_all(:,:),2) ! Compute mask by collapsing the localtimes dimension + Nswathed_out = count(swath_mask_out) ! Number of gridcells that should be calculated. + + end subroutine compute_orbitmasks + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE get_DOY + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + subroutine get_DOY(month, day, DOY) + + integer,intent(in) :: & + month, & + day + integer,intent(out) :: & + DOY + + ! This subroutine does not handle leap years because it is not relevant to the purpose. + ! Simple look-up table for DOY. + if (month .eq. 1) DOY = day + if (month .eq. 2) DOY = 31 + day + if (month .eq. 3) DOY = 59 + day + if (month .eq. 4) DOY = 90 + day + if (month .eq. 5) DOY = 120 + day + if (month .eq. 6) DOY = 151 + day + if (month .eq. 7) DOY = 181 + day + if (month .eq. 8) DOY = 212 + day + if (month .eq. 9) DOY = 243 + day + if (month .eq. 10) DOY = 273 + day + if (month .eq. 11) DOY = 304 + day + if (month .eq. 12) DOY = 334 + day + + end subroutine get_DOY + +END MODULE MOD_COSP_STATS diff --git a/src/simulator/cosp_cloudsat_interface.F90 b/src/simulator/cosp_cloudsat_interface.F90 index ff61417104..c4384c4cb0 100644 --- a/src/simulator/cosp_cloudsat_interface.F90 +++ b/src/simulator/cosp_cloudsat_interface.F90 @@ -32,7 +32,7 @@ ! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% MODULE MOD_COSP_CLOUDSAT_INTERFACE USE COSP_KINDS, ONLY: wp - USE quickbeam, ONLY: quickbeam_init,Re_MAX_BIN,Re_BIN_LENGTH, & + USE quickbeam, ONLY: quickbeam_init,Re_MAX_BIN,Re_BIN_LENGTH, & maxhclass, nRe_types, nd, mt_ntt use mod_cosp_stats, ONLY: radar_cfg,compute_orbitmasks,cosp_optical_inputs,cosp_column_inputs IMPLICIT NONE @@ -49,7 +49,7 @@ MODULE MOD_COSP_CLOUDSAT_INTERFACE temp_z_vol_cloudsat, & temp_kr_vol_cloudsat, & temp_g_vol_cloudsat - + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! TYPE cloudsat_IN !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/src/simulator/cosp_cloudsat_interface.F90.bak b/src/simulator/cosp_cloudsat_interface.F90.bak new file mode 100644 index 0000000000..ff61417104 --- /dev/null +++ b/src/simulator/cosp_cloudsat_interface.F90.bak @@ -0,0 +1,234 @@ +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +! Copyright (c) 2015, Regents of the University of Colorado +! All rights reserved. +! +! Redistribution and use in source and binary forms, with or without modification, are +! permitted provided that the following conditions are met: +! +! 1. Redistributions of source code must retain the above copyright notice, this list of +! conditions and the following disclaimer. +! +! 2. Redistributions in binary form must reproduce the above copyright notice, this list +! of conditions and the following disclaimer in the documentation and/or other +! materials provided with the distribution. +! +! 3. Neither the name of the copyright holder nor the names of its contributors may be +! used to endorse or promote products derived from this software without specific prior +! written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +! +! History +! May 2015 - D. Swales - Original version +! Jun 2025 - J.K. Shaw - Added COSP-RTTOV integration and swathing +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +MODULE MOD_COSP_CLOUDSAT_INTERFACE + USE COSP_KINDS, ONLY: wp + USE quickbeam, ONLY: quickbeam_init,Re_MAX_BIN,Re_BIN_LENGTH, & + maxhclass, nRe_types, nd, mt_ntt + use mod_cosp_stats, ONLY: radar_cfg,compute_orbitmasks,cosp_optical_inputs,cosp_column_inputs + IMPLICIT NONE + + ! Directory where LUTs will be stored + character(len=120) :: RADAR_SIM_LUT_DIRECTORY = './' + logical :: RADAR_SIM_LOAD_scale_LUTs_flag = .false. + logical :: RADAR_SIM_UPDATE_scale_LUTs_flag = .false. + + ! Module variables + real(wp),dimension(:,:),target,allocatable :: & + temp_hgt_matrix + real(wp),dimension(:,:,:),target,allocatable :: & + temp_z_vol_cloudsat, & + temp_kr_vol_cloudsat, & + temp_g_vol_cloudsat + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! TYPE cloudsat_IN + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + type cloudsat_IN + integer :: & + Npoints ! Number of horizontal grid-points + integer,pointer :: & + Nlevels, & ! Number of vertical levels + Ncolumns ! Number of subcolumns + real(wp),pointer :: & + hgt_matrix(:,:), & ! Height of hydrometeors (km) + z_vol(:,:,:), & ! Effective reflectivity factor (mm^6/m^3) + kr_vol(:,:,:), & ! Attenuation coefficient hydro (dB/km) + g_vol(:,:,:), & ! Attenuation coefficient gases (dB/km) + g_to_vol_in(:,:) ! Gaseous atteunation, radar to vol (dB) + type(radar_cfg),pointer :: rcfg ! Radar simulator configuration + end type cloudsat_IN + +CONTAINS + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE cosp_cloudsat_in + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + SUBROUTINE COSP_CLOUDSAT_INIT(radar_freq,k2,use_gas_abs,do_ray,undef,nhydro, & + surface_radar,rcfg,cloudsat_micro_scheme,load_LUT) + ! INPUTS + real(wp),intent(in) :: & + radar_freq, & ! Radar frequency (GHz) + k2, & ! |K|^2, the dielectric constant + undef ! Undefined + integer,intent(in) :: & + use_gas_abs, & ! 1 = do gaseous abs calcs, 0=no gasesous absorbtion calculated, + ! 2 = calculate absorption for first profile on all profiles + do_ray, & ! + nhydro, & ! + surface_radar + logical,intent(in),optional :: & + load_LUT + character(len=64),intent(in) :: & + cloudsat_micro_scheme + + ! OUTPUTS + type(radar_cfg) :: & + rcfg ! + + ! LOCAL VARIABLES + character(len=240) :: LUT_file_name + logical :: local_load_LUT + integer :: j + + if (present(load_LUT)) then + local_load_LUT = load_LUT + else + local_load_LUT = RADAR_SIM_LOAD_scale_LUTs_flag + endif + + ! LUT file name + LUT_file_name = trim(RADAR_SIM_LUT_DIRECTORY) // & + trim(cloudsat_micro_scheme) + + ! Initialize for NEW radar-configurarion derived type (radar_cfg) + rcfg%freq = radar_freq + rcfg%k2 = k2 + rcfg%use_gas_abs = use_gas_abs + rcfg%do_ray = do_ray + rcfg%nhclass = nhydro + rcfg%load_scale_LUTs = local_load_LUT + rcfg%update_scale_LUTs = .false. + rcfg%scale_LUT_file_name = LUT_file_name + rcfg%N_scale_flag = .false. + rcfg%fc = undef + rcfg%rho_eff = undef + rcfg%Z_scale_flag = .false. + rcfg%Ze_scaled = 0._wp + rcfg%Zr_scaled = 0._wp + rcfg%kr_scaled = 0._wp + + ! Set up Re bin "structure" for z_scaling + rcfg%base_list(1)=0 + do j=1,Re_MAX_BIN + rcfg%step_list(j)=0.1_wp+0.1_wp*((j-1)**1.5_wp) + if(rcfg%step_list(j)>Re_BIN_LENGTH) then + rcfg%step_list(j)=Re_BIN_LENGTH + endif + if(j>1) then + rcfg%base_list(j)=rcfg%base_list(j-1)+floor(Re_BIN_LENGTH/rcfg%step_list(j-1)) + endif + enddo + + ! Set flag denoting position of radar + if (surface_radar == 1) then + rcfg%radar_at_layer_one = .false. + else + rcfg%radar_at_layer_one = .true. + endif + + END SUBROUTINE COSP_CLOUDSAT_INIT + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE COSP_ASSIGN_cloudsatIN + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + SUBROUTINE COSP_ASSIGN_cloudsatIN(cospIN, cospgridIN, Npoints, cloudsatIN, & + CSCAL_MASK_INDICES, CSCAL_SWATH_MASK) + type(cosp_optical_inputs),intent(in),target :: cospIN ! Optical inputs to COSP simulator + type(cosp_column_inputs), intent(in),target :: cospgridIN ! Host model inputs to COSP + integer,intent(in),target :: & + Npoints + type(cloudsat_IN),intent(inout) :: & + cloudsatIN + integer,dimension(:),allocatable,intent(out) :: & ! Array containing the indices of the swath masks, already allocated? + CSCAL_MASK_INDICES + logical,dimension(:),allocatable,intent(inout) :: & ! Mask of reals over all local times + CSCAL_SWATH_MASK + + ! Local variables + integer, target :: & + N_CLOUDSAT_SWATHED, & + i + + if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then + if (.not.allocated(CSCAL_SWATH_MASK)) allocate(CSCAL_SWATH_MASK(Npoints)) + ! Do swathing to figure out which cells to simulate on + call compute_orbitmasks(Npoints, & + cospIN % cospswathsIN(3) % N_inst_swaths, & + cospIN % cospswathsIN(3) % inst_localtimes, & + cospIN % cospswathsIN(3) % inst_localtime_widths, & + cospgridIN%lat, cospgridIN%lon, & + cospgridIN%rttov_date(:,2), cospgridIN%rttov_date(:,3), & ! Time fields: month, dayofmonth + cospgridIN%rttov_time(:,1), cospgridIN%rttov_time(:,2), & ! Time fields: hour, minute + CSCAL_SWATH_MASK,N_CLOUDSAT_SWATHED) ! Output: logical mask array + cloudsatIN%Npoints = N_CLOUDSAT_SWATHED + cloudsatIN%Ncolumns => cospIN%Ncolumns + if (.not. allocated(CSCAL_MASK_INDICES)) allocate(CSCAL_MASK_INDICES(cloudsatIN%Npoints)) + CSCAL_MASK_INDICES = pack((/ (i, i = 1, Npoints ) /),mask = CSCAL_SWATH_MASK) + if (cloudsatIN%Npoints .gt. 0) then + ! Allocate swathed arrays. + allocate(temp_z_vol_cloudsat(cloudsatIN%Npoints,cospIN%Ncolumns,cospIN%Nlevels), & + temp_kr_vol_cloudsat(cloudsatIN%Npoints,cospIN%Ncolumns,cospIN%Nlevels), & + temp_g_vol_cloudsat(cloudsatIN%Npoints,cospIN%Ncolumns,cospIN%Nlevels), & + temp_hgt_matrix(cloudsatIN%Npoints,cospIN%Nlevels)) + ! Encode step: Read only appropriate values into the new temp arrays. + temp_z_vol_cloudsat = cospIN%z_vol_cloudsat(int(CSCAL_MASK_INDICES),:,:) + temp_kr_vol_cloudsat = cospIN%kr_vol_cloudsat(int(CSCAL_MASK_INDICES),:,:) + temp_g_vol_cloudsat = cospIN%g_vol_cloudsat(int(CSCAL_MASK_INDICES),:,:) + temp_hgt_matrix = cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES),:) + ! Reassign swathed values. + cloudsatIN%Nlevels => cospIN%Nlevels + cloudsatIN%z_vol => temp_z_vol_cloudsat + cloudsatIN%kr_vol => temp_kr_vol_cloudsat + cloudsatIN%g_vol => temp_g_vol_cloudsat + cloudsatIN%rcfg => cospIN%rcfg_cloudsat + cloudsatIN%hgt_matrix => temp_hgt_matrix + end if + else + cloudsatIN%Npoints = Npoints + cloudsatIN%Ncolumns => cospIN%Ncolumns + cloudsatIN%Nlevels => cospIN%Nlevels + cloudsatIN%z_vol => cospIN%z_vol_cloudsat + cloudsatIN%kr_vol => cospIN%kr_vol_cloudsat + cloudsatIN%g_vol => cospIN%g_vol_cloudsat + cloudsatIN%rcfg => cospIN%rcfg_cloudsat + cloudsatIN%hgt_matrix => cospgridIN%hgt_matrix + end if + + END SUBROUTINE COSP_ASSIGN_cloudsatIN + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! SUBROUTINE COSP_ASSIGN_cloudsatIN_CLEAN + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + SUBROUTINE COSP_ASSIGN_cloudsatIN_CLEAN() + ! Deallocate temporary arrays + if (allocated(temp_z_vol_cloudsat)) deallocate(temp_z_vol_cloudsat) + if (allocated(temp_kr_vol_cloudsat)) deallocate(temp_kr_vol_cloudsat) + if (allocated(temp_g_vol_cloudsat)) deallocate(temp_g_vol_cloudsat) + if (allocated(temp_hgt_matrix)) deallocate(temp_hgt_matrix) + + END SUBROUTINE COSP_ASSIGN_cloudsatIN_CLEAN + + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + ! END MODULE + !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +END MODULE MOD_COSP_CLOUDSAT_INTERFACE diff --git a/src/simulator/quickbeam/quickbeam.F90 b/src/simulator/quickbeam/quickbeam.F90 index 06d78b9a82..50a67e0829 100644 --- a/src/simulator/quickbeam/quickbeam.F90 +++ b/src/simulator/quickbeam/quickbeam.F90 @@ -60,6 +60,7 @@ module quickbeam maxhclass,nRe_types,nd,mt_ntt,Re_BIN_LENGTH,Re_MAX_BIN, & dmin,dmax,radar_cfg implicit none + contains ! ###################################################################################### ! SUBROUTINE quickbeam_subcolumn @@ -504,6 +505,371 @@ subroutine cloudsat_precipOccurence(Npoints, Ncolumns, llm, Nhydro, Ze_out, Ze_n end subroutine cloudsat_precipOccurence + ! ############################################################################################## + ! ############################################################################################## + subroutine quickbeam_dplrw(Npoints, Ncolumns, Nlevels, rcfg, & + hgt_matrix, hgt_matrix_half, surfelev, & + at, pfull, & + gwvel, gcumf, & + vfall_in, vfsqu_in, zehyd_in, & + g_vol, krhyd_in, & + vtrm3_in, vtrm0_in, mmnt3_in, mmnt0_in, & + gcumw, & + dplrw_Z, spwid_Z, Zef94_Z, & + dplrw_T, spwid_T, Zef94_T, & + ZefVd_2, & + vfall_Z, gridw_Z, & + vfall_T, gridw_T, ZefVf_2 ) + USE MOD_COSP_CONFIG, ONLY: Nlvgrid, N_HYDRO, & + trbl_LS, trbl_CU, & + Nlvtemp, lvtemp_WID, lvtemp_MAX, lvtemp_MIN, & + NlvdBZe, lvdBZe_WID, lvdBZe_MAX, lvdBZe_MIN, & + Nlvdplr, lvdplr_WID, lvdplr_MAX, lvdplr_MIN, & + Nlvspwd, lvspwd_WID, lvspwd_MAX, lvspwd_MIN + + integer,intent(in) :: Npoints, Ncolumns, Nlevels + type(radar_cfg),intent(in) :: rcfg + real(wp),intent(in),dimension(npoints,nlevels) :: hgt_matrix, hgt_matrix_half, at, pfull + real(wp),intent(in),dimension(npoints) :: surfelev + real(wp),intent(in),dimension(npoints,nlevels) :: gwvel,gcumf + logical,dimension(npoints,ncolumns,nlevels,N_HYDRO) :: flags + real(wp),intent(in),dimension(npoints,ncolumns,nlevels,N_HYDRO) :: vfall_in, vfsqu_in, zehyd_in + real(wp),dimension(npoints,ncolumns,nlevels,N_HYDRO) :: vfall, vfsqu, zehyd + real(wp),intent(in),dimension(npoints,ncolumns,nlevels,N_HYDRO) :: vtrm3_in,vtrm0_in,mmnt3_in,mmnt0_in + real(wp),dimension(npoints,ncolumns,nlevels,N_HYDRO) :: vtrm3,vtrm0,mmnt3,mmnt0 + !=== + real(wp),intent(out),dimension(npoints,nlevels) :: gcumw + !=== + real(wp),dimension(npoints,nlevels+1) :: hgt_bnd + real(wp),intent(in),dimension(npoints,nlevels) :: g_vol + real(wp),dimension(npoints,nlevels) :: att_gas + real(wp),intent(in),dimension(npoints,ncolumns,nlevels,N_HYDRO) :: krhyd_in + real(wp),dimension(npoints,ncolumns,nlevels,N_HYDRO) :: krhyd + real(wp),dimension(npoints,ncolumns,nlevels,0:2) :: att_hyd + real(wp) :: krLS, krCU + integer :: sta,end,dif + !=== + real(wp),intent(out),dimension(npoints,Nlvdplr,Nlvgrid,0:2) :: dplrw_Z + real(wp),intent(out),dimension(npoints,Nlvspwd,Nlvgrid,0:2) :: spwid_Z + real(wp),intent(out),dimension(npoints,NlvdBZe,Nlvgrid,0:2) :: Zef94_Z + real(wp),intent(out),dimension(npoints,Nlvdplr,Nlvtemp,0:2) :: dplrw_T + real(wp),intent(out),dimension(npoints,Nlvspwd,Nlvtemp,0:2) :: spwid_T + real(wp),intent(out),dimension(npoints,NlvdBZe,Nlvtemp,0:2) :: Zef94_T + real(wp),intent(out),dimension(npoints,Nlvdplr,NlvdBZe,0:2) :: ZefVd_2 + !=== + real(wp),intent(out),dimension(npoints,Nlvdplr,Nlvgrid,0:2,3) :: vfall_Z + real(wp),intent(out),dimension(npoints,Nlvdplr,Nlvgrid,0:2) :: gridw_Z + real(wp),intent(out),dimension(npoints,Nlvdplr,Nlvtemp,0:2,3) :: vfall_T + real(wp),intent(out),dimension(npoints,Nlvdplr,Nlvtemp,0:2) :: gridw_T + real(wp),intent(out),dimension(npoints,Nlvdplr,NlvdBZe,0:2,3) :: ZefVf_2 + !=== + integer :: dbin, sbin, zbin, tbin, hbin, vbin, wbin + integer :: i,j,k,n,is,js,id,tp + real(wp) :: zesum(0:2),vdmn(0:2),swmn(0:2) + real(wp) :: vfmn(0:2,3),gwmn(0:2),m0sum(0:2),m3sum(0:2) + real(wp) :: intp,es,qs,Tvs + real(wp),dimension(Npoints,Nlvdplr,Nlevels,0:2) :: workD + real(wp),dimension(Npoints,Nlvspwd,Nlevels,0:2) :: workS + real(wp),dimension(Npoints,NlvdBZe,Nlevels,0:2) :: workZ + real(wp),dimension(Npoints,Nlvdplr,Nlevels,0:2,3) :: workV + real(wp),dimension(Npoints,Nlvdplr,Nlevels,0:2) :: workW + + integer,parameter :: & + I_LSCLIQ = 1, & ! Large-scale (stratiform) liquid + I_LSCICE = 2, & ! Large-scale (stratiform) ice + I_LSRAIN = 3, & ! Large-scale (stratiform) rain + I_LSSNOW = 4, & ! Large-scale (stratiform) snow + I_CVCLIQ = 5, & ! Convective liquid + I_CVCICE = 6, & ! Convective ice + I_CVRAIN = 7, & ! Convective rain + I_CVSNOW = 8, & ! Convective snow + I_LSGRPL = 9 ! Large-scale (stratiform) groupel + integer,parameter :: & + I_ALC = 0, & ! all (stratiform + convective) clouds + I_LSC = 1, & ! stratiform clouds + I_CVC = 2 ! convective clouds + + ! @@@@@ convert: convective mass flux -> cumulus vertical velocity + do k=1,nlevels + do i=1,npoints + if (at(i,k) < 0._wp .or. pfull(i,k) < 0._wp) then + gcumw(i,k) = 0._wp + flags(i,:,k,:) = .false. + else + es = 611.*exp( (2.5e+6 + 3.4e+5*(1-sign(1._wp,at(i,k)-273.15))/2._wp)/461. * (1./273.15 - 1./at(i,k)) ) + qs = (es/pfull(i,k)) * (287./461.) + + Tvs = at(i,k)*( (1+qs/(287./461.))/(1+qs) ) + gcumw(i,k) = gcumf(i,k) * (287.*Tvs/pfull(i,k)) + + end if + end do + end do + + ! @@@@@ flag check @@@@@ + flags = .true. + do j=1,ncolumns + where (gwvel < R_UNDEF * 0.1_wp) + flags(:,j,:,I_LSCLIQ) = .false. + flags(:,j,:,I_LSCICE) = .false. + flags(:,j,:,I_LSRAIN) = .false. + flags(:,j,:,I_LSSNOW) = .false. + flags(:,j,:,I_LSGRPL) = .false. + end where + + where (gcumf < R_UNDEF * 0.1_wp) + flags(:,j,:,I_CVCLIQ) = .false. + flags(:,j,:,I_CVCICE) = .false. + flags(:,j,:,I_CVRAIN) = .false. + flags(:,j,:,I_CVSNOW) = .false. + end where + end do + where (flags) + vfall = vfall_in ; vfsqu = vfsqu_in ; zehyd = zehyd_in ; krhyd = krhyd_in + vtrm3 = vtrm3_in ; vtrm0 = vtrm0_in ; mmnt3 = mmnt3_in ; mmnt0 = mmnt0_in + elsewhere + vfall = 0._wp ; vfsqu = 0._wp ; zehyd = 0._wp ; krhyd = 0._wp + vtrm3 = 0._wp ; vtrm0 = 0._wp ; mmnt3 = 0._wp ; mmnt0 = 0._wp + end where + + hgt_bnd(:,1:Nlevels) = hgt_matrix_half + hgt_bnd(:,Nlevels+1) = surfelev + + ! @@@@@ attenuation: gas, LShyd, and CUhyd + if (rcfg%radar_at_layer_one) then + dif = 1 ; sta = 1 ; end = nlevels + else + dif = -1 ; sta = nlevels ; end = 1 + end if + + att_gas = 0._wp + do k=sta,end,dif + do i=1,npoints + att_gas(i,k) = att_gas(i,k) + & + g_vol(i,k) * (hgt_bnd(i,k+1)-hgt_bnd(i,k))/1000._wp + end do + end do + + att_hyd = 0._wp + do k=sta,end,dif + do j=1,ncolumns + do i=1,npoints + krLS = krhyd(i,j,k,I_LSCLIQ)+krhyd(i,j,k,I_LSCICE)+& + krhyd(i,j,k,I_LSRAIN)+krhyd(i,j,k,I_LSSNOW)+krhyd(i,j,k,I_LSGRPL) + att_hyd(i,j,k,I_LSC) = att_hyd(i,j,k,I_LSC) + & + krLS * (hgt_bnd(i,k+1)-hgt_bnd(i,k))/1000._wp + + krCU = krhyd(i,j,k,I_CVCLIQ)+krhyd(i,j,k,I_CVCICE)+& + krhyd(i,j,k,I_CVRAIN)+krhyd(i,j,k,I_CVSNOW) + att_hyd(i,j,k,I_CVC) = att_hyd(i,j,k,I_CVC) + & + krCU * (hgt_bnd(i,k+1)-hgt_bnd(i,k))/1000._wp + + att_hyd(i,j,k,I_ALC) = att_hyd(i,j,k,I_ALC) + & + (krLS+krCU) * (hgt_bnd(i,k+1)-hgt_bnd(i,k))/1000._wp + end do + end do + end do + + ! @@@@@ Initialiation + dplrw_Z = 0._wp ; spwid_Z = 0._wp ; Zef94_Z = 0._wp ; vfall_Z = 0._wp ; gridw_Z = 0._wp + dplrw_T = 0._wp ; spwid_T = 0._wp ; Zef94_T = 0._wp ; vfall_T = 0._wp ; gridw_T = 0._wp + ZefVd_2 = 0._wp ; ZefVd_2 = 0._wp + workD = 0._wp ; workS = 0._wp ; workZ = 0._wp ; workV = 0._wp ; workW = 0._wp + + ! @@@@@ statistics + do i=1,npoints + do j=1,ncolumns + do k=1,nlevels + tbin = floor( ( (at(i,k)-273.15) - lvtemp_MIN)/lvtemp_WID ) + 1 + hbin = k + if (tbin < 1 .or. tbin > Nlvtemp) cycle + + ! radar parameters: for LS and CU + zesum = 0._wp ; vdmn = 0._wp ; swmn = 0._wp + do tp=1,N_HYDRO + if (tp==I_LSCLIQ .or. tp==I_LSCICE .or. tp==I_LSRAIN .or. tp==I_LSSNOW .or. tp==I_LSGRPL) then + zesum(I_LSC) = zesum(I_LSC) + zehyd(i,j,k,tp) + vdmn(I_LSC) = vdmn(I_LSC) + vfall(i,j,k,tp)*zehyd(i,j,k,tp) + swmn(I_LSC) = swmn(I_LSC) + vfsqu(i,j,k,tp)*zehyd(i,j,k,tp) + else if (tp==I_CVCLIQ .or. tp==I_CVCICE .or. tp==I_CVRAIN .or. tp==I_CVSNOW) then + zesum(I_CVC) = zesum(I_CVC) + zehyd(i,j,k,tp) + vdmn(I_CVC) = vdmn(I_CVC) + vfall(i,j,k,tp)*zehyd(i,j,k,tp) + swmn(I_CVC) = swmn(I_CVC) + vfsqu(i,j,k,tp)*zehyd(i,j,k,tp) + end if + end do + + zesum(I_ALC) = zesum(I_LSC) + zesum(I_CVC) + if (zesum(I_LSC) <= 0 .and. zesum(I_CVC) <= 0.) cycle + + vdmn(I_ALC) = ( vdmn(I_LSC)+gwvel(i,k)*zesum(I_LSC) + vdmn(I_CVC)+gcumw(i,k)*zesum(I_CVC) ) / (zesum(I_LSC)+zesum(I_CVC)) + swmn(I_ALC) = ( swmn(I_LSC) + 2*gwvel(i,k)*vdmn(I_LSC) + gwvel(i,k)**2*zesum(I_LSC) + & + swmn(I_CVC) + 2*gcumw(i,k)*vdmn(I_CVC) + gcumw(i,k)**2*zesum(I_CVC) ) / (zesum(I_LSC)+zesum(I_CVC)) + swmn(I_ALC) = swmn(I_ALC) - vdmn(I_ALC)**2 + swmn(I_ALC) = swmn(I_ALC) + & + ( trbl_LS**2*zesum(I_LSC) + trbl_CU**2*zesum(I_CVC) ) / (zesum(I_LSC)+zesum(I_CVC)) + swmn(I_ALC) = sqrt( swmn(I_ALC) ) + + swmn(I_LSC) = sqrt(trbl_LS**2 + swmn(I_LSC)/zesum(I_LSC)-vdmn(I_LSC)**2/zesum(I_LSC)**2) + vdmn(I_LSC) = vdmn(I_LSC)/zesum(I_LSC) + gwvel(i,k) + + swmn(I_CVC) = sqrt(trbl_CU**2 + swmn(I_CVC)/zesum(I_CVC)-vdmn(I_CVC)**2/zesum(I_CVC)**2) + vdmn(I_CVC) = vdmn(I_CVC)/zesum(I_CVC) + gcumw(i,k) + + ! ~~~ + vfmn = 0._wp ; gwmn = 0._wp ; m3sum = 0._wp ; m0sum = 0._wp + do tp=1,N_HYDRO + if (tp==I_LSCLIQ .or. tp==I_LSCICE .or. tp==I_LSRAIN .or. tp==I_LSSNOW .or. tp==I_LSGRPL) then + vfmn(I_LSC,1) = vfmn(I_LSC,1) + vfall(i,j,k,tp)*zehyd(i,j,k,tp) + vfmn(I_LSC,2) = vfmn(I_LSC,2) + vtrm3(i,j,k,tp)*mmnt3(i,j,k,tp) + vfmn(I_LSC,3) = vfmn(I_LSC,3) + vtrm0(i,j,k,tp)*mmnt0(i,j,k,tp) + + m3sum(I_LSC) = m3sum(I_LSC) + mmnt3(i,j,k,tp) + m0sum(I_LSC) = m0sum(I_LSC) + mmnt0(i,j,k,tp) + + gwmn(I_ALC) = gwmn(I_ALC) + gwvel(i,k)*zehyd(i,j,k,tp) + else if (tp==I_CVCLIQ .or. tp==I_CVCICE .or. tp==I_CVRAIN .or. tp==I_CVSNOW) then + vfmn(I_CVC,1) = vfmn(I_CVC,1) + vfall(i,j,k,tp)*zehyd(i,j,k,tp) + vfmn(I_CVC,2) = vfmn(I_CVC,2) + vtrm3(i,j,k,tp)*mmnt3(i,j,k,tp) + vfmn(I_CVC,3) = vfmn(I_CVC,3) + vtrm0(i,j,k,tp)*mmnt0(i,j,k,tp) + + m3sum(I_CVC) = m3sum(I_CVC) + mmnt3(i,j,k,tp) + m0sum(I_CVC) = m0sum(I_CVC) + mmnt0(i,j,k,tp) + + gwmn(I_ALC) = gwmn(I_ALC) + gcumw(i,k)*zehyd(i,j,k,tp) + end if + + vfmn(I_ALC,1) = vfmn(I_ALC,1) + vfall(i,j,k,tp)*zehyd(i,j,k,tp) + vfmn(I_ALC,2) = vfmn(I_ALC,2) + vtrm3(i,j,k,tp)*mmnt3(i,j,k,tp) + vfmn(I_ALC,3) = vfmn(I_ALC,3) + vtrm0(i,j,k,tp)*mmnt0(i,j,k,tp) + + m3sum(I_ALC) = m3sum(I_ALC) + mmnt3(i,j,k,tp) + m0sum(I_ALC) = m0sum(I_ALC) + mmnt0(i,j,k,tp) + end do + do tp=0,2 + vfmn(tp,1) = vfmn(tp,1)/zesum(tp) + vfmn(tp,2) = vfmn(tp,2)/m3sum(tp) + vfmn(tp,3) = vfmn(tp,3)/m0sum(tp) + end do + gwmn(I_ALC) = gwmn(I_ALC)/zesum(I_ALC) + gwmn(I_LSC) = gwvel(i,k) + gwmn(I_CVC) = gcumw(i,k) + + + do tp=0,2 + if (zesum(tp) <= 0._wp) cycle + + !if (tp > 0) write(*,*) 'test 6: ',tp,vfmn(tp,1),zesum(tp) + !if (tp > 0) write(*,*) 'test 3: ',tp,vfmn(tp,2),m3sum(tp) + !if (tp > 0) write(*,*) 'test 0: ',tp,vfmn(tp,3),m0sum(tp) + + !if (tp==1) write(*,'(a,3(x,I5))') 'test grd: ',i,j,k + !if (tp==1) write(*,'(a,8(x,ES10.3))') 'test v6 : ',vfall(i,j,k,1:8) + !if (tp==1) write(*,'(a,8(x,ES10.3))') 'test v3 : ',vtrm3(i,j,k,1:8) + !if (tp==1) write(*,'(a,8(x,ES10.3))') 'test v0 : ',vtrm0(i,j,k,1:8) + + zbin = floor( ((10*log10(zesum(tp))-att_gas(i,k)-att_hyd(i,j,k,I_ALC)) - lvdBZe_MIN)/lvdBZe_WID ) + 1 + if (zbin < 1 ) cycle + if (zbin > NlvdBZe) cycle + + dbin = floor( (vdmn(tp) - lvdplr_MIN)/lvdplr_WID ) + 1 + if (dbin < 1 ) dbin = 1 + if (dbin > Nlvdplr) dbin = Nlvdplr + + sbin = floor( (swmn(tp) - lvspwd_MIN)/lvspwd_WID ) + 1 + if (sbin < 1 ) sbin = 1 + if (sbin > Nlvspwd) sbin = Nlvspwd + + workZ(i,zbin,hbin,tp) = workZ(i,zbin,hbin,tp) + 1._wp + workD(i,dbin,hbin,tp) = workD(i,dbin,hbin,tp) + 1._wp + workS(i,sbin,hbin,tp) = workS(i,sbin,hbin,tp) + 1._wp + + Zef94_T(i,zbin,tbin,tp) = Zef94_T(i,zbin,tbin,tp) + 1._wp + dplrw_T(i,dbin,tbin,tp) = dplrw_T(i,dbin,tbin,tp) + 1._wp + spwid_T(i,sbin,tbin,tp) = spwid_T(i,sbin,tbin,tp) + 1._wp + + ZefVd_2(i,dbin,zbin,tp) = ZefVd_2(i,dbin,zbin,tp) + 1._wp + + ! ~~~ + do id=1,3 + vbin = floor( (vfmn(tp,id) - lvdplr_MIN)/lvdplr_WID ) + 1 + if (vbin < 1 ) vbin = 1 + if (vbin > Nlvdplr) vbin = Nlvdplr + workV(i,vbin,hbin,tp,id) = workV(i,vbin,hbin,tp,id) + 1._wp + vfall_T(i,vbin,tbin,tp,id) = vfall_T(i,vbin,tbin,tp,id) + 1._wp + ZefVf_2(i,vbin,zbin,tp,id) = ZefVf_2(i,vbin,zbin,tp,id) + 1._wp + end do + + wbin = floor( (gwmn(tp) - lvdplr_MIN)/lvdplr_WID ) + 1 + if (wbin < 1 ) wbin = 1 + if (wbin > Nlvdplr) wbin = Nlvdplr + workW(i,wbin,hbin,tp) = workW(i,wbin,hbin,tp) + 1._wp + gridw_T(i,wbin,tbin,tp) = gridw_T(i,wbin,tbin,tp) + 1._wp + + end do + + end do + end do + end do + + ! @@@@@ vertical grid conversion + if (use_vgrid) then + do tp=0,2 + call cosp_change_vertical_grid(npoints,Nlvdplr,Nlevels, & + hgt_matrix(:,nlevels:1:-1),hgt_matrix_half(:,nlevels:1:-1),workD(:,1:Nlvdplr,nlevels:1:-1,tp), & + Nlvgrid,vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1),dplrw_Z(:,1:Nlvdplr,1:Nlvgrid,tp)) + + call cosp_change_vertical_grid(npoints,Nlvspwd,Nlevels, & + hgt_matrix(:,nlevels:1:-1),hgt_matrix_half(:,nlevels:1:-1),workS(:,1:Nlvspwd,nlevels:1:-1,tp), & + Nlvgrid,vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1),spwid_Z(:,1:Nlvspwd,1:Nlvgrid,tp)) + + call cosp_change_vertical_grid(npoints,NlvdBZe,Nlevels, & + hgt_matrix(:,nlevels:1:-1),hgt_matrix_half(:,nlevels:1:-1),workZ(:,1:NlvdBZe,nlevels:1:-1,tp), & + Nlvgrid,vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1),Zef94_Z(:,1:NlvdBZe,1:Nlvgrid,tp)) + + ! ~~~ + do id=1,3 + call cosp_change_vertical_grid(npoints,Nlvdplr,Nlevels, & + hgt_matrix(:,nlevels:1:-1),hgt_matrix_half(:,nlevels:1:-1),workV(:,1:Nlvdplr,nlevels:1:-1,tp,id), & + Nlvgrid,vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1),vfall_Z(:,1:Nlvdplr,1:Nlvgrid,tp,id)) + end do + + call cosp_change_vertical_grid(npoints,Nlvdplr,Nlevels, & + hgt_matrix(:,nlevels:1:-1),hgt_matrix_half(:,nlevels:1:-1),workW(:,1:Nlvdplr,nlevels:1:-1,tp), & + Nlvgrid,vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1),gridw_Z(:,1:Nlvdplr,1:Nlvgrid,tp)) + + end do + where (dplrw_Z < 0._wp) + dplrw_Z = 0._wp + end where + where (spwid_Z < 0._wp) + spwid_Z = 0._wp + end where + where (Zef94_Z < 0._wp) + Zef94_Z = 0._wp + end where + where (vfall_Z < 0._wp) + vfall_Z = 0._wp + end where + where (gridw_Z < 0._wp) + gridw_Z = 0._wp + end where + + else + do tp=0,2 + dplrw_Z(:,1:Nlvdplr,1:Nlvgrid,tp) = workD(:,1:Nlvdplr,Nlevels:1:-1,tp) + spwid_Z(:,1:Nlvspwd,1:Nlvgrid,tp) = workS(:,1:Nlvspwd,Nlevels:1:-1,tp) + Zef94_Z(:,1:NlvdBZe,1:Nlvgrid,tp) = workZ(:,1:NlvdBZe,Nlevels:1:-1,tp) + + do id=1,3 + vfall_Z(:,1:Nlvdplr,1:Nlvgrid,tp,id) = workV(:,1:Nlvdplr,Nlevels:1:-1,tp,id) + end do + gridw_Z(:,1:Nlvdplr,1:Nlvgrid,tp) = workW(:,1:Nlvdplr,Nlevels:1:-1,tp) + + end do + end if + + end subroutine quickbeam_dplrw + ! ############################################################################################## ! ############################################################################################## subroutine load_scale_LUTs(rcfg) diff --git a/src/simulator/quickbeam/quickbeam.F90.bak b/src/simulator/quickbeam/quickbeam.F90.bak new file mode 100644 index 0000000000..06d78b9a82 --- /dev/null +++ b/src/simulator/quickbeam/quickbeam.F90.bak @@ -0,0 +1,605 @@ +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +! Copyright (c) 2015, Regents of the University of Colorado +! All rights reserved. +! +! Redistribution and use in source and binary forms, with or without modification, are +! permitted provided that the following conditions are met: +! +! 1. Redistributions of source code must retain the above copyright notice, this list of +! conditions and the following disclaimer. +! +! 2. Redistributions in binary form must reproduce the above copyright notice, this list +! of conditions and the following disclaimer in the documentation and/or other +! materials provided with the distribution. +! +! 3. Neither the name of the copyright holder nor the names of its contributors may be +! used to endorse or promote products derived from this software without specific prior +! written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +! +! History +! 11/2005: John Haynes - Created +! 09/2006 placed into subroutine form (Roger Marchand,JMH) +! 08/2007 added equivalent volume spheres, Z and N scalling most distrubtion types (Roger Marchand) +! 01/2008 'Do while' to determine if hydrometeor(s) present in volume +! changed for vectorization purposes (A. Bodas-Salcedo) +! +! 07/2010 V3.0 ... Modified to load or save scale factors to disk as a Look-Up Table (LUT) +! ... All hydrometeor and radar simulator properties now included in hp structure +! ... hp structure should be initialized by call to radar_simulator_init prior +! ... to calling this subroutine. +! Also ... Support of Morrison 2-moment style microphyscis (Np_matrix) added +! ... Changes implement by Roj Marchand following work by Laura Fowler +! +! 10/2011 Modified ngate loop to go in either direction depending on flag +! hp%radar_at_layer_one. This affects the direction in which attenuation is summed. +! +! Also removed called to AVINT for gas and hydrometeor attenuation and replaced with simple +! summation. (Roger Marchand) +! May 2015 - D. Swales - Modified for COSPv2.0 +! Jun 2025 - J.K. Shaw - Parameters and DDT moved to cosp_stats.F90 for interface swathing +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +module quickbeam + USE COSP_KINDS, ONLY: wp + USE MOD_COSP_CONFIG, ONLY: R_UNDEF,cloudsat_histRef,use_vgrid,vgrid_zl,vgrid_zu,& + pClass_noPrecip, pClass_Rain1, pClass_Rain2, pClass_Rain3,& + pClass_Snow1, pClass_Snow2, pClass_Mixed1, pClass_Mixed2, & + pClass_Rain4, pClass_default, Zenonbinval, Zbinvallnd, & + N_HYDRO,nCloudsatPrecipClass,cloudsat_preclvl + + USE MOD_COSP_STATS, ONLY: COSP_LIDAR_ONLY_CLOUD,hist1D,COSP_CHANGE_VERTICAL_GRID, & + maxhclass,nRe_types,nd,mt_ntt,Re_BIN_LENGTH,Re_MAX_BIN, & + dmin,dmax,radar_cfg + implicit none +contains + ! ###################################################################################### + ! SUBROUTINE quickbeam_subcolumn + ! ###################################################################################### + subroutine quickbeam_subcolumn(rcfg,nprof,ngate,hgt_matrix,z_vol,kr_vol,g_vol,dBZe,Ze_non) + + ! INPUTS + type(radar_cfg),intent(inout) :: & + rcfg ! Derived type for radar simulator setup + integer,intent(in) :: & + nprof, & ! Number of hydrometeor profiles + ngate ! Number of vertical layers + real(wp),intent(in),dimension(nprof,ngate) :: & + hgt_matrix, & ! Height of hydrometeors (km) + z_vol, & ! Effective reflectivity factor (mm^6/m^3) + kr_vol, & ! Attenuation coefficient hydro (dB/km) + g_vol ! Attenuation coefficient gases (dB/km) + + ! OUTPUTS + real(wp), intent(out),dimension(nprof,ngate) :: & + Ze_non, & ! Radar reflectivity without attenuation (dBZ) + dBZe ! Effective radar reflectivity factor (dBZ) + + ! LOCAL VARIABLES + integer :: k,pr,start_gate,end_gate,d_gate + real(wp),dimension(nprof,ngate) :: & + g_to_vol, & ! Gaseous atteunation, radar to vol (dB) + a_to_vol ! Hydromets attenuation, radar to vol (dB) + + ! Load scaling matricies from disk -- but only the first time this subroutine is called + if(rcfg%load_scale_LUTs) then + call load_scale_LUTs(rcfg) + rcfg%load_scale_LUTs=.false. + rcfg%Z_scale_added_flag = .false. ! will be set true if scaling Look Up Tables are modified during run + endif + + ! Initialization + g_to_vol = 0._wp + a_to_vol = 0._wp + + ! Loop over each range gate (ngate) ... starting with layer closest to the radar ! + if(rcfg%radar_at_layer_one) then + start_gate = 1 + end_gate = ngate + d_gate = 1 + else + start_gate = ngate + end_gate = 1 + d_gate = -1 + endif + do k=start_gate,end_gate,d_gate + ! Loop over each profile (nprof) + do pr=1,nprof + ! Attenuation due to hydrometeors between radar and volume + + ! NOTE old scheme integrates attenuation only for the layers ABOVE + ! the current layer ... i.e. 1 to k-1 rather than 1 to k ... + ! which may be a problem. ROJ + ! in the new scheme I assign half the attenuation to the current layer + if(d_gate==1) then + ! dheight calcuations assumes hgt_matrix points are the cell mid-points. + if (k>2) then + ! add to previous value to half of above layer + half of current layer + a_to_vol(pr,k)= a_to_vol(pr,k-1) + & + (kr_vol(pr,k-1)+kr_vol(pr,k))*(hgt_matrix(pr,k-1)-hgt_matrix(pr,k)) + else + a_to_vol(pr,k)= kr_vol(pr,k)*(hgt_matrix(pr,k)-hgt_matrix(pr,k+1)) + endif + else ! d_gate==-1 + if(k1) then + ! Add to previous value to half of above layer + half of current layer + g_to_vol(pr,k) = g_to_vol(pr,k-1) + & + 0.5*(g_vol(pr,k-1)+g_vol(pr,k))*(hgt_matrix(pr,k-1)-hgt_matrix(pr,k)) + else + g_to_vol(pr,k)= 0.5_wp*g_vol(pr,k)*(hgt_matrix(pr,k)-hgt_matrix(pr,k+1)) + endif + else ! d_gate==-1 + if (k 0._wp) + Ze_non(1:nprof,1:ngate) = 10._wp*log10(z_vol(1:nprof,1:ngate)) + dBZe(1:nprof,1:ngate) = Ze_non(1:nprof,1:ngate)-a_to_vol(1:nprof,1:ngate)-g_to_vol(1:nprof,1:ngate) + elsewhere + dBZe(1:nprof,1:ngate) = R_UNDEF + Ze_non(1:nprof,1:ngate) = R_UNDEF + end where + + ! Save any updates made + if (rcfg%update_scale_LUTs) call save_scale_LUTs(rcfg) + + end subroutine quickbeam_subcolumn + ! ###################################################################################### + ! SUBROUTINE quickbeam_column + ! ###################################################################################### + subroutine quickbeam_column(npoints, ncolumns, nlevels, llm, DBZE_BINS, platform, & + Ze_tot, Ze_tot_non, land, surfelev, t2m, fracPrecipIce, zlev, zlev_half, cfad_ze, & + cloudsat_precip_cover, cloudsat_pia) + ! Inputs + integer,intent(in) :: & + npoints, & ! Number of horizontal grid points + ncolumns, & ! Number of subcolumns + nlevels, & ! Number of vertical layers in OLD grid + llm, & ! Number of vertical layers in NEW grid + DBZE_BINS ! Number of bins for cfad. + character(len=*),intent(in) :: & + platform ! Name of platform (e.g. cloudsat) + real(wp),dimension(Npoints),intent(in) :: & + land, & ! Land/Sea mask. (1/0) + surfelev, & ! Surface Elevation (m) + t2m ! Near-surface temperature + real(wp),dimension(Npoints,Ncolumns),intent(in) :: & + fracPrecipIce ! Fraction of precipitation which is frozen. (1) + real(wp),intent(in),dimension(npoints,ncolumns,Nlevels) :: & + Ze_tot, & ! Effective reflectivity factor (dBZ) + Ze_tot_non ! Effective reflectivity factor w/o attenuation (dBZ) + real(wp),intent(in),dimension(npoints,Nlevels) :: & + zlev ! Model full levels + real(wp),intent(in),dimension(npoints,Nlevels) :: & + zlev_half ! Model half levels + + ! Outputs + real(wp),intent(inout),dimension(npoints,DBZE_BINS,llm) :: & + cfad_ze ! + real(wp),dimension(Npoints,nCloudsatPrecipClass),intent(out) :: & + cloudsat_precip_cover ! Model precip rate in by CloudSat precip flag + real(wp),dimension(Npoints),intent(out) :: & + cloudsat_pia ! Cloudsat path integrated attenuation + + ! Local variables + integer :: i,j + real(wp) :: zstep + real(wp),dimension(npoints,ncolumns,llm) :: ze_toti,ze_noni + logical :: lcloudsat = .false. + + ! Which platforms to create diagnostics for? + if (platform .eq. 'cloudsat') lcloudsat=.true. + + ! Create Cloudsat diagnostics. + if (lcloudsat) then + cloudsat_precip_cover = 0._wp + cloudsat_pia = 0._wp + if (use_vgrid) then + ! Regrid in the vertical (*NOTE* This routine requires SFC-2-TOA ordering, so flip + ! inputs and outputs to maintain TOA-2-SFC ordering convention in COSP2.) + call cosp_change_vertical_grid(Npoints,Ncolumns,Nlevels,zlev(:,nlevels:1:-1),& + zlev_half(:,nlevels:1:-1),Ze_tot(:,:,nlevels:1:-1),llm,vgrid_zl(llm:1:-1),& + vgrid_zu(llm:1:-1),Ze_toti(:,:,llm:1:-1),log_units=.true.) + + ! Effective reflectivity histogram + do i=1,Npoints + do j=1,llm + cfad_ze(i,:,j) = hist1D(Ncolumns,Ze_toti(i,:,j),DBZE_BINS,cloudsat_histRef) + enddo + enddo + where(cfad_ze .ne. R_UNDEF) cfad_ze = cfad_ze/Ncolumns + + ! Compute cloudsat near-surface precipitation diagnostics + ! First, regrid in the vertical Ze_tot_non. + call cosp_change_vertical_grid(Npoints,Ncolumns,Nlevels,zlev(:,nlevels:1:-1),& + zlev_half(:,nlevels:1:-1),Ze_tot_non(:,:,nlevels:1:-1),llm,vgrid_zl(llm:1:-1),& + vgrid_zu(llm:1:-1),Ze_noni(:,:,llm:1:-1),log_units=.true.) + ! Compute the zstep distance between two atmopsheric layers + zstep = vgrid_zl(1)-vgrid_zl(2) + ! Now call routine to generate diagnostics. + call cloudsat_precipOccurence(Npoints, Ncolumns, llm, N_HYDRO, Ze_toti, Ze_noni, & + land, surfelev, t2m, fracPrecipIce, cloudsat_precip_cover, cloudsat_pia, zstep) + else + ! Effective reflectivity histogram + do i=1,Npoints + do j=1,llm + cfad_ze(i,:,j) = hist1D(Ncolumns,Ze_tot(i,:,j),DBZE_BINS,cloudsat_histRef) + enddo + enddo + where(cfad_ze .ne. R_UNDEF) cfad_ze = cfad_ze/Ncolumns + endif + endif + + end subroutine quickbeam_column + ! ############################################################################################## + ! ############################################################################################## + ! ###################################################################################### + ! SUBROUTINE cloudsat_precipOccurence + ! + ! Notes from July 2016: Add precip flag also looped over subcolumns + ! Modified by Tristan L'Ecuyer (TSL) to add precipitation flagging + ! based on CloudSat's 2C-PRECIP-COLUMN algorithm (Haynes et al, JGR, 2009). + ! To mimic the satellite algorithm, this code applies thresholds to non-attenuated + ! reflectivities, Ze_non, consistent with those outlined in Haynes et al, JGR (2009). + ! + ! Procedures/Notes: + ! + ! (1) If the 2-way attenuation exceeds 40 dB, the pixel will be flagged as 'heavy rain' + ! consistent with the multiple-scattering analysis of Battaglia et al, JGR (2008). + ! (2) Rain, snow, and mixed precipitation scenes are separated according to the fraction + ! of the total precipitation hydrometeor mixing ratio that exists as ice. + ! (3) The entire analysis is applied to the range gate from 480-960 m to be consistent with + ! CloudSat's 720 m ground-clutter. + ! (4) Only a single flag is assigned to each model grid since there is no variation in + ! hydrometeor contents across a single model level. Unlike CFADs, whose variation enters + ! due to differening attenuation corrections from hydrometeors aloft, the non-attenuated + ! reflectivities used in the computation of this flag cannot vary across sub-columns. + ! + ! radar_prec_flag = 1-Rain possible 2-Rain probable 3-Rain certain + ! 4-Snow possible 5-Snow certain + ! 6-Mixed possible 7-Mixed certain + ! 8-Heavy Rain + ! 9- default value + ! + ! Modified by Dustin Swales (University of Colorado) for use with COSP2. + ! *NOTE* All inputs (Ze_out, Ze_non_out, fracPrecipIce) are at a single level from the + ! statistical output grid used by Cloudsat. This level is controlled by the + ! parameter cloudsat_preclvl, defined in src/cosp_config.F90 + ! ###################################################################################### + subroutine cloudsat_precipOccurence(Npoints, Ncolumns, llm, Nhydro, Ze_out, Ze_non_out, & + land, surfelev, t2m, fracPrecipIce, cloudsat_precip_cover, cloudsat_pia, zstep) + + ! Inputs + integer,intent(in) :: & + Npoints, & ! Number of columns + Ncolumns, & ! Numner of subcolumns + Nhydro, & ! Number of hydrometeor types + llm ! Number of levels + real(wp),dimension(Npoints),intent(in) :: & + land, & ! Land/Sea mask. (1/0) + surfelev, & ! Surface Elevation (m) + t2m ! Near-surface temperature + real(wp),dimension(Npoints,Ncolumns,llm),intent(in) :: & + Ze_out, & ! Effective reflectivity factor (dBZ) + Ze_non_out ! Effective reflectivity factor, w/o attenuation (dBZ) + real(wp),dimension(Npoints,Ncolumns),intent(in) :: & + fracPrecipIce ! Fraction of precipitation which is frozen. (1) + real(wp),intent(in) :: & + zstep ! Distance between two atmopsheric layers (m) + + ! Outputs + real(wp),dimension(Npoints,nCloudsatPrecipClass),intent(out) :: & + cloudsat_precip_cover ! Model precip rate in by CloudSat precip flag + real(wp),dimension(Npoints),intent(out) :: & + cloudsat_pia ! Cloudsat path integrated attenuation + + ! Local variables + integer,dimension(Npoints,Ncolumns) :: & + cloudsat_pflag, & ! Subcolumn precipitation flag + cloudsat_precip_pia ! Subcolumn path integrated attenutation. + integer,dimension(Npoints) :: & + cloudsat_preclvl_index ! Altitude index for precip flags calculation + ! in 40-level grid (one layer above surfelev) + integer :: pr,i,k + real(wp) :: Zmax + + ! Initialize + cloudsat_pflag(:,:) = pClass_default + cloudsat_precip_pia(:,:) = 0._wp + cloudsat_precip_cover(:,:) = 0._wp + cloudsat_pia(:) = 0._wp + cloudsat_preclvl_index(:) = 0._wp + + ! Computing altitude index for precip flags calculation + cloudsat_preclvl_index(:) = cloudsat_preclvl - floor( surfelev(:)/zstep ) + + ! ###################################################################################### + ! SUBCOLUMN processing + ! ###################################################################################### + do i=1, Npoints + do pr=1,Ncolumns + ! Compute precipitation flag + ! ################################################################################ + ! 1) Oceanic points. + ! ################################################################################ + if (land(i) .eq. 0) then + + ! 1a) Compute the PIA in all profiles containing hydrometeors + if ( (Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.-100) .and. (Ze_out(i,pr,cloudsat_preclvl_index(i)).gt.-100) ) then + if ( (Ze_non_out(i,pr,cloudsat_preclvl_index(i)).lt.100) .and. (Ze_out(i,pr,cloudsat_preclvl_index(i)).lt.100) ) then + cloudsat_precip_pia(i,pr) = Ze_non_out(i,pr,cloudsat_preclvl_index(i)) - Ze_out(i,pr,cloudsat_preclvl_index(i)) + endif + endif + + ! Snow + if(fracPrecipIce(i,pr).gt.0.9) then + if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(2)) then + cloudsat_pflag(i,pr) = pClass_Snow2 ! TSL: Snow certain + endif + if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(4).and. & + Ze_non_out(i,pr,cloudsat_preclvl_index(i)).le.Zenonbinval(2)) then + cloudsat_pflag(i,pr) = pClass_Snow1 ! TSL: Snow possible + endif + endif + + ! Mixed + if(fracPrecipIce(i,pr).gt.0.1.and.fracPrecipIce(i,pr).le.0.9) then + if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(2)) then + cloudsat_pflag(i,pr) = pClass_Mixed2 ! TSL: Mixed certain + endif + if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(4).and. & + Ze_non_out(i,pr,cloudsat_preclvl_index(i)).le.Zenonbinval(2)) then + cloudsat_pflag(i,pr) = pClass_Mixed1 ! TSL: Mixed possible + endif + endif + + ! Rain + if(fracPrecipIce(i,pr).le.0.1) then + if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(1)) then + cloudsat_pflag(i,pr) = pClass_Rain3 ! TSL: Rain certain + endif + if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(3).and. & + Ze_non_out(i,pr,cloudsat_preclvl_index(i)).le.Zenonbinval(1)) then + cloudsat_pflag(i,pr) = pClass_Rain2 ! TSL: Rain probable + endif + if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(4).and. & + Ze_non_out(i,pr,cloudsat_preclvl_index(i)).le.Zenonbinval(3)) then + cloudsat_pflag(i,pr) = pClass_Rain1 ! TSL: Rain possible + endif + if(cloudsat_precip_pia(i,pr).gt.40) then + cloudsat_pflag(i,pr) = pClass_Rain4 ! TSL: Heavy Rain + endif + endif + + ! No precipitation + if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).le.-15) then + cloudsat_pflag(i,pr) = pClass_noPrecip ! TSL: Not Raining + endif + endif ! Ocean points + + ! ################################################################################ + ! 2) Land points. + ! *NOTE* For land points we go up a layer higher, so cloudsat_preclvl_index(i)-1 + ! + ! ################################################################################ + if (land(i) .eq. 1) then + ! 2a) Compute the PIA in all profiles containing hydrometeors + if ( (Ze_non_out(i,pr,cloudsat_preclvl_index(i)-1).gt.-100) .and. (Ze_out(i,pr,cloudsat_preclvl_index(i)-1).gt.-100) ) then + if ( (Ze_non_out(i,pr,cloudsat_preclvl_index(i)-1).lt.100) .and. (Ze_out(i,pr,cloudsat_preclvl_index(i)-1).lt.100) ) then + cloudsat_precip_pia(i,pr) = Ze_non_out(i,pr,cloudsat_preclvl_index(i)-1) - Ze_out(i,pr,cloudsat_preclvl_index(i)-1) + endif + endif + + ! Find Zmax, the maximum reflectivity value in the attenuated profile (Ze_out); + Zmax=maxval(Ze_out(i,pr,:)) + + ! Snow (T<273) + if(t2m(i) .lt. 273._wp) then + if(Ze_out(i,pr,cloudsat_preclvl_index(i)-1) .gt. Zbinvallnd(5)) then + cloudsat_pflag(i,pr) = pClass_Snow2 ! JEK: Snow certain + endif + if(Ze_out(i,pr,cloudsat_preclvl_index(i)-1) .gt. Zbinvallnd(6) .and. & + Ze_out(i,pr,cloudsat_preclvl_index(i)-1).le.Zbinvallnd(5)) then + cloudsat_pflag(i,pr) = pClass_Snow1 ! JEK: Snow possible + endif + endif + + ! Mized phase (273275) + if(t2m(i) .gt. 275) then + if ((Zmax .gt. Zbinvallnd(1) .and. cloudsat_precip_pia(i,pr).gt.30) .or. & + (Ze_out(i,pr,cloudsat_preclvl_index(i)-1) .gt. Zbinvallnd(2))) then + cloudsat_pflag(i,pr) = pClass_Rain3 ! JEK: Rain certain + endif + if((Ze_out(i,pr,cloudsat_preclvl_index(i)-1) .gt. Zbinvallnd(6)) .and. & + (Zmax .gt. Zbinvallnd(3))) then + cloudsat_pflag(i,pr) = pClass_Rain2 ! JEK: Rain probable + endif + if((Ze_out(i,pr,cloudsat_preclvl_index(i)-1) .gt. Zbinvallnd(6)) .and. & + (Zmax.lt.Zbinvallnd(3))) then + cloudsat_pflag(i,pr) = pClass_Rain1 ! JEK: Rain possible + endif + if(cloudsat_precip_pia(i,pr).gt.40) then + cloudsat_pflag(i,pr) = pClass_Rain4 ! JEK: Heavy Rain + endif + endif + + ! No precipitation + if(Ze_out(i,pr,cloudsat_preclvl_index(i)-1) .le. -15) then + cloudsat_pflag(i,pr) = pClass_noPrecip ! JEK: Not Precipitating + endif + endif ! Land points + enddo ! Sub-columns + enddo ! Gridpoints + + ! ###################################################################################### + ! COLUMN processing + ! ###################################################################################### + + ! Aggregate subcolumns + do i=1,Npoints + ! Gridmean precipitation fraction for each precipitation type + do k=1,nCloudsatPrecipClass + if (any(cloudsat_pflag(i,:) .eq. k-1)) then + cloudsat_precip_cover(i,k) = count(cloudsat_pflag(i,:) .eq. k-1) + endif + enddo + + ! Gridmean path integrated attenuation (pia) + cloudsat_pia(i)=sum(cloudsat_precip_pia(i,:)) + enddo + + ! Normalize by number of subcolumns + where ((cloudsat_precip_cover /= R_UNDEF).and.(cloudsat_precip_cover /= 0.0)) & + cloudsat_precip_cover = cloudsat_precip_cover / Ncolumns + where ((cloudsat_pia/= R_UNDEF).and.(cloudsat_pia/= 0.0)) & + cloudsat_pia = cloudsat_pia / Ncolumns + + end subroutine cloudsat_precipOccurence + + ! ############################################################################################## + ! ############################################################################################## + subroutine load_scale_LUTs(rcfg) + + type(radar_cfg), intent(inout) :: rcfg + logical :: LUT_file_exists + integer :: i,j,k,ind + + ! Load scale LUT from file + inquire(file=trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat', & + exist=LUT_file_exists) + + if(.not.LUT_file_exists) then + write(*,*) '*************************************************' + write(*,*) 'Warning: Could NOT FIND radar LUT file: ', & + trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat' + write(*,*) 'Will calculated LUT values as needed' + write(*,*) '*************************************************' + return + else + OPEN(unit=12,file=trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat',& + form='unformatted', & + err= 89, & + access='DIRECT',& + recl=28) + write(*,*) 'Loading radar LUT file: ', & + trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat' + + do i=1,maxhclass + do j=1,mt_ntt + do k=1,nRe_types + ind = i+(j-1)*maxhclass+(k-1)*(nRe_types*mt_ntt) + read(12,rec=ind) rcfg%Z_scale_flag(i,j,k), & + rcfg%Ze_scaled(i,j,k), & + rcfg%Zr_scaled(i,j,k), & + rcfg%kr_scaled(i,j,k) + enddo + enddo + enddo + close(unit=12) + return + endif + +89 write(*,*) 'Error: Found but could NOT READ radar LUT file: ', & + trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat' + + end subroutine load_scale_LUTs + + ! ############################################################################################## + ! ############################################################################################## + subroutine save_scale_LUTs(rcfg) + type(radar_cfg), intent(inout) :: rcfg + logical :: LUT_file_exists + integer :: i,j,k,ind + + inquire(file=trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat', & + exist=LUT_file_exists) + + OPEN(unit=12,file=trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat',& + form='unformatted',err= 99,access='DIRECT',recl=28) + + write(*,*) 'Creating or Updating radar LUT file: ', & + trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat' + + do i=1,maxhclass + do j=1,mt_ntt + do k=1,nRe_types + ind = i+(j-1)*maxhclass+(k-1)*(nRe_types*mt_ntt) + if(.not.LUT_file_exists .or. rcfg%Z_scale_added_flag(i,j,k)) then + rcfg%Z_scale_added_flag(i,j,k)=.false. + write(12,rec=ind) rcfg%Z_scale_flag(i,j,k), & + rcfg%Ze_scaled(i,j,k), & + rcfg%Zr_scaled(i,j,k), & + rcfg%kr_scaled(i,j,k) + endif + enddo + enddo + enddo + close(unit=12) + return + +99 write(*,*) 'Error: Unable to create/update radar LUT file: ', & + trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat' + return + + end subroutine save_scale_LUTs + ! ############################################################################################## + ! ############################################################################################## + subroutine quickbeam_init() + + + end subroutine quickBeam_init + ! ############################################################################################## + ! ############################################################################################## + + +end module quickbeam + + diff --git a/subsample_and_optics_example/optics/cosp_utils.F90 b/subsample_and_optics_example/optics/cosp_utils.F90 old mode 100644 new mode 100755 index 98c26cd5be..467b317a0b --- a/subsample_and_optics_example/optics/cosp_utils.F90 +++ b/subsample_and_optics_example/optics/cosp_utils.F90 @@ -34,56 +34,157 @@ MODULE MOD_COSP_UTILS USE COSP_KINDS, ONLY: wp USE MOD_COSP_CONFIG + USE mod_quickbeam_optics, only: size_distribution + use mod_cosp_error, only: errorMessage IMPLICIT NONE CONTAINS !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% !------------------- SUBROUTINE COSP_PRECIP_MXRATIO -------------- !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -SUBROUTINE COSP_PRECIP_MXRATIO(Npoints,Nlevels,Ncolumns,p,T,prec_frac,prec_type, & - n_ax,n_bx,alpha_x,c_x,d_x,g_x,a_x,b_x,gamma1,gamma2,gamma3,gamma4, & - flux,mxratio,reff) +! SUBROUTINE COSP_PRECIP_MXRATIO(Npoints,Nlevels,Ncolumns,p,T,prec_frac,prec_type, & +! n_ax,n_bx,alpha_x,c_x,d_x,g_x,a_x,b_x,gamma1,gamma2,gamma3,gamma4, & +! flux,mxratio,reff) +! ! Input arguments, (IN) +! integer,intent(in) :: Npoints,Nlevels,Ncolumns +! real(wp),intent(in),dimension(Npoints,Nlevels) :: p,T,flux +! real(wp),intent(in),dimension(Npoints,Ncolumns,Nlevels) :: prec_frac +! real(wp),intent(in) :: n_ax,n_bx,alpha_x,c_x,d_x,g_x,a_x,b_x,gamma1,gamma2,gamma3,gamma4,prec_type +! ! Input arguments, (OUT) +! real(wp),intent(out),dimension(Npoints,Ncolumns,Nlevels) :: mxratio +! real(wp),intent(inout),dimension(Npoints,Ncolumns,Nlevels) :: reff +! ! Local variables +! integer :: i,j,k +! real(wp) :: sigma,one_over_xip1,xi,rho0,rho,lambda_x,gamma_4_3_2,delta + +! mxratio = 0.0 + +! if (n_ax >= 0.0) then ! N_ax is used to control which hydrometeors need to be computed +! xi = d_x/(alpha_x + b_x - n_bx + 1._wp) +! rho0 = 1.29_wp +! sigma = (gamma2/(gamma1*c_x))*(n_ax*a_x*gamma2)**xi +! one_over_xip1 = 1._wp/(xi + 1._wp) +! gamma_4_3_2 = 0.5_wp*gamma4/gamma3 +! delta = (alpha_x + b_x + d_x - n_bx + 1._wp) +! do k=1,Nlevels +! do j=1,Ncolumns +! do i=1,Npoints +! if ((prec_frac(i,j,k)==prec_type).or.(prec_frac(i,j,k)==3.)) then +! rho = p(i,k)/(287.05_wp*T(i,k)) +! mxratio(i,j,k)=(flux(i,k)*((rho/rho0)**g_x)*sigma)**one_over_xip1 +! mxratio(i,j,k)=mxratio(i,j,k)/rho +! ! Compute effective radius +! if ((reff(i,j,k) <= 0._wp).and.(flux(i,k) /= 0._wp)) then +! lambda_x = (a_x*c_x*((rho0/rho)**g_x)*n_ax*gamma1/flux(i,k))**(1._wp/delta) +! reff(i,j,k) = gamma_4_3_2/lambda_x +! endif +! endif +! enddo +! enddo +! enddo +! endif +! END SUBROUTINE COSP_PRECIP_MXRATIO + + SUBROUTINE COSP_PRECIP_MXRATIO(Npoints,Nlevels,Ncolumns, & + p,T,prec_frac,prec_type, index, sd, & + flux, mxratio, reff) ! Input arguments, (IN) - integer,intent(in) :: Npoints,Nlevels,Ncolumns + integer,intent(in) :: Npoints,Nlevels,Ncolumns,index real(wp),intent(in),dimension(Npoints,Nlevels) :: p,T,flux real(wp),intent(in),dimension(Npoints,Ncolumns,Nlevels) :: prec_frac - real(wp),intent(in) :: n_ax,n_bx,alpha_x,c_x,d_x,g_x,a_x,b_x,gamma1,gamma2,gamma3,gamma4,prec_type + real(wp),intent(in) :: prec_type + type(size_distribution),intent(in) :: sd ! Input arguments, (OUT) real(wp),intent(out),dimension(Npoints,Ncolumns,Nlevels) :: mxratio real(wp),intent(inout),dimension(Npoints,Ncolumns,Nlevels) :: reff ! Local variables - integer :: i,j,k + real(wp) :: pi = 3.14159265358979323846264338327950288419717_wp + integer :: i,j,k real(wp) :: sigma,one_over_xip1,xi,rho0,rho,lambda_x,gamma_4_3_2,delta + real(wp) :: apm,bpm,mu,D0,Dm ! modified gamma DSD + real(wp) :: lambda,N0 ! exponential DSD + real(wp) :: avf,bvf,vscs_fct ! fall velocity params - mxratio = 0.0 + !!! single-moment bulk microphysics is assumed !!! + + if (sd%apm(index) > 0) then + apm = sd%apm(index) + bpm = sd%bpm(index) + else if (sd%rho(index) > 0) then + apm = sd%rho(index)*pi/6._wp + bpm = 3._wp + else + call errorMessage('!!! unexpected sd, at COSP_PRECIP_MXRATIO !!!') + end if + + ! fall velocity params + select case(sd%ftype(index)) + case(1) + ! vf = a * D**b + avf = sd%f1(index) + bvf = sd%f2(index) + case(2) + ! PL08 formulation + call errorMessage('!!! not implemented yet, PL08 formulation, at COSP_PRECIP_MXRATIO') + end select - if (n_ax >= 0.0) then ! N_ax is used to control which hydrometeors need to be computed - xi = d_x/(alpha_x + b_x - n_bx + 1._wp) - rho0 = 1.29_wp - sigma = (gamma2/(gamma1*c_x))*(n_ax*a_x*gamma2)**xi - one_over_xip1 = 1._wp/(xi + 1._wp) - gamma_4_3_2 = 0.5_wp*gamma4/gamma3 - delta = (alpha_x + b_x + d_x - n_bx + 1._wp) - - do k=1,Nlevels - do j=1,Ncolumns - do i=1,Npoints - if ((prec_frac(i,j,k)==prec_type).or.(prec_frac(i,j,k)==3.)) then - rho = p(i,k)/(287.05_wp*T(i,k)) - mxratio(i,j,k)=(flux(i,k)*((rho/rho0)**g_x)*sigma)**one_over_xip1 - mxratio(i,j,k)=mxratio(i,j,k)/rho - ! Compute effective radius - if ((reff(i,j,k) <= 0._wp).and.(flux(i,k) /= 0._wp)) then - lambda_x = (a_x*c_x*((rho0/rho)**g_x)*n_ax*gamma1/flux(i,k))**(1._wp/delta) - reff(i,j,k) = gamma_4_3_2/lambda_x - endif - endif - enddo - enddo - enddo - endif -END SUBROUTINE COSP_PRECIP_MXRATIO + ! size distribution params + select case(sd%dtype(index)) + case(1) + Dm = sd%p2(index) + mu = sd%p3(index) + if (Dm < 0 .or. mu < 0) then + call errorMessage('!!! mod.gamma DSD requires mean D and mu, at COSP_PRECIP_MXRATIO') + end if + case(2) + N0 = sd%p1(index) + if (N0 < 0) then + call errorMessage('!!! exp. DSD requires N0, at COSP_PRECIP_MXRATIO') + end if + case default + call errorMessage('!!! not implemented yet, sd%dtype=3,4,5, at COSP_PRECIP_MXRATIO') + end select + do k=1,Nlevels + do j=1,Ncolumns + do i=1,Npoints + if ((prec_frac(i,j,k)/=prec_type).and.(prec_frac(i,j,k)/=3.)) cycle + rho0 = 1.29_wp + rho = p(i,k)/(287.05_wp*T(i,k)) + vscs_fct = merge(sqrt(rho0/rho),1._wp,sd%fvscs(index)==1) + + select case(sd%dtype(index)) + case(1) ! modified gamma + if (flux(i,k) > 1.D-20) then + D0 = Dm*gamma(mu)/gamma(mu+1._wp) * 1.D-6 ! um -> m + mxratio(i,j,k) = flux(i,k)/vscs_fct/avf/D0**bvf * gamma(mu+bpm)/gamma(mu+bvf+bpm) / rho + if (reff(i,j,k) < 1.D-20) then + reff(i,j,k) = D0/2._wp*gamma(mu+3._wp)/gamma(mu+2._wp) + end if + else + mxratio(i,j,k) = 0._wp ; reff(i,j,k) = 0._wp + end if + + case(2) ! exponential + if (flux(i,k) > 1.D-20) then + lambda = (vscs_fct*apm*avf*N0*gamma(1._wp+bpm+bvf)/flux(i,k))**(1._wp/(1._wp+bpm+bvf)) + mxratio(i,j,k) = flux(i,k)/vscs_fct/avf*lambda**bvf*gamma(1._wp+bpm)/gamma(1._wp+bpm+bvf) + if (reff(i,j,k) < 1.D-20) then + reff(i,j,k) = 0.5_wp/lambda*gamma(4._wp)/gamma(3._wp) + end if + else + mxratio(i,j,k) = 0._wp ; reff(i,j,k) = 0._wp + end if + + case default + call errorMessage('!!! not implemented yet, sd%dtype=3,4,5, at COSP_PRECIP_MXRATIO') + end select + + end do + end do + end do + + END SUBROUTINE COSP_PRECIP_MXRATIO END MODULE MOD_COSP_UTILS diff --git a/subsample_and_optics_example/optics/cosp_utils.F90.bak b/subsample_and_optics_example/optics/cosp_utils.F90.bak new file mode 100644 index 0000000000..98c26cd5be --- /dev/null +++ b/subsample_and_optics_example/optics/cosp_utils.F90.bak @@ -0,0 +1,89 @@ +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +! Copyright (c) 2015, Regents of the University of Colorado +! All rights reserved. +! +! Redistribution and use in source and binary forms, with or without modification, are +! permitted provided that the following conditions are met: +! +! 1. Redistributions of source code must retain the above copyright notice, this list of +! conditions and the following disclaimer. +! +! 2. Redistributions in binary form must reproduce the above copyright notice, this list +! of conditions and the following disclaimer in the documentation and/or other +! materials provided with the distribution. +! +! 3. Neither the name of the copyright holder nor the names of its contributors may be +! used to endorse or promote products derived from this software without specific prior +! written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +! +! History: +! Jul 2007 - A. Bodas-Salcedo - Initial version +! May 2015 - Dustin Swales - Modified for COSPv2.0 +! +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +MODULE MOD_COSP_UTILS + USE COSP_KINDS, ONLY: wp + USE MOD_COSP_CONFIG + IMPLICIT NONE + +CONTAINS +!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +!------------------- SUBROUTINE COSP_PRECIP_MXRATIO -------------- +!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +SUBROUTINE COSP_PRECIP_MXRATIO(Npoints,Nlevels,Ncolumns,p,T,prec_frac,prec_type, & + n_ax,n_bx,alpha_x,c_x,d_x,g_x,a_x,b_x,gamma1,gamma2,gamma3,gamma4, & + flux,mxratio,reff) + + ! Input arguments, (IN) + integer,intent(in) :: Npoints,Nlevels,Ncolumns + real(wp),intent(in),dimension(Npoints,Nlevels) :: p,T,flux + real(wp),intent(in),dimension(Npoints,Ncolumns,Nlevels) :: prec_frac + real(wp),intent(in) :: n_ax,n_bx,alpha_x,c_x,d_x,g_x,a_x,b_x,gamma1,gamma2,gamma3,gamma4,prec_type + ! Input arguments, (OUT) + real(wp),intent(out),dimension(Npoints,Ncolumns,Nlevels) :: mxratio + real(wp),intent(inout),dimension(Npoints,Ncolumns,Nlevels) :: reff + ! Local variables + integer :: i,j,k + real(wp) :: sigma,one_over_xip1,xi,rho0,rho,lambda_x,gamma_4_3_2,delta + + mxratio = 0.0 + + if (n_ax >= 0.0) then ! N_ax is used to control which hydrometeors need to be computed + xi = d_x/(alpha_x + b_x - n_bx + 1._wp) + rho0 = 1.29_wp + sigma = (gamma2/(gamma1*c_x))*(n_ax*a_x*gamma2)**xi + one_over_xip1 = 1._wp/(xi + 1._wp) + gamma_4_3_2 = 0.5_wp*gamma4/gamma3 + delta = (alpha_x + b_x + d_x - n_bx + 1._wp) + + do k=1,Nlevels + do j=1,Ncolumns + do i=1,Npoints + if ((prec_frac(i,j,k)==prec_type).or.(prec_frac(i,j,k)==3.)) then + rho = p(i,k)/(287.05_wp*T(i,k)) + mxratio(i,j,k)=(flux(i,k)*((rho/rho0)**g_x)*sigma)**one_over_xip1 + mxratio(i,j,k)=mxratio(i,j,k)/rho + ! Compute effective radius + if ((reff(i,j,k) <= 0._wp).and.(flux(i,k) /= 0._wp)) then + lambda_x = (a_x*c_x*((rho0/rho)**g_x)*n_ax*gamma1/flux(i,k))**(1._wp/delta) + reff(i,j,k) = gamma_4_3_2/lambda_x + endif + endif + enddo + enddo + enddo + endif +END SUBROUTINE COSP_PRECIP_MXRATIO + + +END MODULE MOD_COSP_UTILS diff --git a/subsample_and_optics_example/optics/quickbeam_optics/quickbeam_optics.F90 b/subsample_and_optics_example/optics/quickbeam_optics/quickbeam_optics.F90 index dd39c73b3a..7d63754468 100644 --- a/subsample_and_optics_example/optics/quickbeam_optics/quickbeam_optics.F90 +++ b/subsample_and_optics_example/optics/quickbeam_optics/quickbeam_optics.F90 @@ -40,14 +40,18 @@ module mod_quickbeam_optics use quickbeam, ONLY: dmin,dmax,Re_BIN_LENGTH, & Re_MAX_BIN,nRe_types,nd,maxhclass use mod_cosp_config, ONLY: N_HYDRO - use mod_cosp_error, ONLY: errorMessage use mod_cosp_stats, ONLY: radar_cfg + use mod_cosp_error, ONLY: errorMessage implicit none ! Derived type for particle size distribution TYPE size_distribution real(wp),dimension(maxhclass) :: p1,p2,p3,dmin,dmax,apm,bpm,rho integer, dimension(maxhclass) :: dtype,phase + + ! for DPLRW + integer, dimension(N_HYDRO) :: ftype,fvscs + real(wp),dimension(N_HYDRO) :: f1,f2,f3 END TYPE size_distribution ! Parameters @@ -81,7 +85,9 @@ end subroutine quickbeam_optics_init ! SUBROUTINE QUICKBEAM_OPTICS ! ###################################################################################### subroutine quickbeam_optics(sd, rcfg, nprof, ngate, undef, hm_matrix, re_matrix, & - Np_matrix, p_matrix, t_matrix, sh_matrix,z_vol,kr_vol) + Np_matrix, p_matrix, t_matrix, sh_matrix,z_vol,kr_vol, & + vfall, vfsqu, zehyd, krhyd, & + vtrm3, vtrm0, mmnt3, mmnt0 ) ! INPUTS type(size_distribution),intent(inout) :: & @@ -108,6 +114,11 @@ subroutine quickbeam_optics(sd, rcfg, nprof, ngate, undef, hm_matrix, re_matrix, z_vol, & ! Effective reflectivity factor (mm^6/m^3) kr_vol ! Attenuation coefficient hydro (dB/km) + ! OUTPUTS for DPLRW + real(wp),intent(out), dimension(nprof, ngate, N_HYDRO) :: & + vfall, vfsqu, zehyd, krhyd, & + vtrm3, vtrm0, mmnt3, mmnt0 + ! INTERNAL VARIABLES integer :: & phase, ns,tp,j,k,pr,itt,iRe_type,n @@ -116,7 +127,12 @@ subroutine quickbeam_optics(sd, rcfg, nprof, ngate, undef, hm_matrix, re_matrix, real(wp) :: & t_kelvin,Re_internal real(wp) :: & - rho_a,kr,ze,zr,scale_factor,Re,Np,base,step + rho_a,kr,ze,zr,scale_factor,Re,Np,base,step + + ! INTERNAL VARIABLES for DPLRW + real(wp) :: vf,vq + real(wp) :: vt3,vt0,D3int,D0int + real(wp),dimension(:),allocatable :: fall_speed real(wp),dimension(:),allocatable :: & Deq, & ! Discrete drop sizes (um) @@ -139,6 +155,14 @@ subroutine quickbeam_optics(sd, rcfg, nprof, ngate, undef, hm_matrix, re_matrix, z_vol = 0._wp z_ray = 0._wp kr_vol = 0._wp + vfall = 0._wp + vfsqu = 0._wp + zehyd = 0._wp + krhyd = 0._wp + vtrm3 = 0._wp + vtrm0 = 0._wp + mmnt3 = 0._wp + mmnt0 = 0._wp do k=1,ngate ! Loop over each profile (nprof) do pr=1,nprof @@ -280,8 +304,14 @@ subroutine quickbeam_optics(sd, rcfg, nprof, ngate, undef, hm_matrix, re_matrix, ! xxa are unused (Mie scattering and extinction efficiencies) xxa(1:ns) = -9.9_wp rhoi = rcfg%rho_eff(tp,1:ns,iRe_type) + + allocate(fall_speed(ns)) + call fall_velocity(ns,Deq*1e-6,sd,p_matrix(pr,k),t_matrix(pr,k),tp,& + & fall_speed) call zeff(rcfg%freq,Deq,Ni,ns,rcfg%k2,t_kelvin,phase,rcfg%do_ray, & - ze,zr,kr,xxa,xxa,rhoi) + ze,zr,kr,xxa,xxa,rhoi, & + fall_speed, vf, vq, & + vt3, vt0, D3int, D0int) ! Test compares total number concentration with sum of discrete samples ! The second test, below, compares ab initio and "scaled" computations @@ -302,6 +332,7 @@ subroutine quickbeam_optics(sd, rcfg, nprof, ngate, undef, hm_matrix, re_matrix, ! Clean up space deallocate(Di,Ni,rhoi,xxa,Deq) + deallocate(fall_speed) ! LUT test code ! This segment of code compares full calculation to scaling result @@ -319,12 +350,30 @@ subroutine quickbeam_optics(sd, rcfg, nprof, ngate, undef, hm_matrix, re_matrix, zr = rcfg%Zr_scaled(tp,itt,iRe_type) * scale_factor ze = rcfg%Ze_scaled(tp,itt,iRe_type) * scale_factor kr = rcfg%kr_scaled(tp,itt,iRe_type) * scale_factor + + vf = rcfg%vf_scaled(tp,itt,iRe_type) * scale_factor + vq = rcfg%vq_scaled(tp,itt,iRe_type) * scale_factor + + vt3 = rcfg%v3_scaled(tp,itt,iRe_type) * scale_factor + vt0 = rcfg%v0_scaled(tp,itt,iRe_type) * scale_factor + D3int = rcfg%m3_scaled(tp,itt,iRe_type) * scale_factor + D0int = rcfg%m0_scaled(tp,itt,iRe_type) * scale_factor endif ! end z_scaling kr_vol(pr,k) = kr_vol(pr,k) + kr z_vol(pr,k) = z_vol(pr,k) + ze z_ray(pr,k) = z_ray(pr,k) + zr + + vfall(pr,k,tp) = vf/ze + vfsqu(pr,k,tp) = vq/ze + zehyd(pr,k,tp) = ze + krhyd(pr,k,tp) = kr + vtrm3(pr,k,tp) = vt3/D3int + vtrm0(pr,k,tp) = vt0/D0int + mmnt3(pr,k,tp) = D3int + mmnt0(pr,k,tp) = D0int + ! Construct Ze_scaled, Zr_scaled, and kr_scaled ... if we can if ( .not. rcfg%Z_scale_flag(tp,itt,iRe_type) ) then if (iRe_type>1) then @@ -334,6 +383,14 @@ subroutine quickbeam_optics(sd, rcfg, nprof, ngate, undef, hm_matrix, re_matrix, rcfg%kr_scaled(tp,itt,iRe_type) = kr/ scale_factor rcfg%Z_scale_flag(tp,itt,iRe_type) = .true. rcfg%Z_scale_added_flag(tp,itt,iRe_type)=.true. + + rcfg%vf_scaled(tp,itt,iRe_type) = vf/ scale_factor + rcfg%vq_scaled(tp,itt,iRe_type) = vq/ scale_factor + + rcfg%v3_scaled(tp,itt,iRe_type) = vt3/ scale_factor + rcfg%v0_scaled(tp,itt,iRe_type) = vt0/ scale_factor + rcfg%m3_scaled(tp,itt,iRe_type) = D3int/ scale_factor + rcfg%m0_scaled(tp,itt,iRe_type) = D0int/ scale_factor endif endif enddo ! end loop of tp (hydrometeor type) @@ -862,7 +919,8 @@ subroutine dsd(Q,Re,Np,D,N,nsizes,dtype,rho_a,tk,dmin,dmax,apm,bpm,rho_c,p1,p2,p end subroutine dsd ! ############################################################################################## ! ############################################################################################## - subroutine zeff(freq,D,N,nsizes,k2,tt,ice,xr,z_eff,z_ray,kr,qe,qs,rho_e) + subroutine zeff(freq,D,N,nsizes,k2,tt,ice,xr,z_eff,z_ray,kr,qe,qs,rho_e, & + fall_speed, vf, vq, vt3, vt0, D3int, D0int) ! ############################################################################################## ! Purpose: ! Simulates radar return of a volume given DSD of spheres @@ -907,13 +965,19 @@ subroutine zeff(freq,D,N,nsizes,k2,tt,ice,xr,z_eff,z_ray,kr,qe,qs,rho_e) freq, & ! Radar frequency (GHz) tt ! Hydrometeor temperature (K) real(wp), intent(inout) :: & - k2 ! |K|^2, -1=use frequency dependent default + k2 ! |K|^2, -1=use frequency dependent default + real(wp), intent(in), dimension(nsizes) :: & + fall_speed ! droplet fall speed ! Outputs real(wp), intent(out) :: & z_eff, & ! Unattenuated effective reflectivity factor (mm^6/m^3) z_ray, & ! Reflectivity factor, Rayleigh only (mm^6/m^3) kr ! Attenuation coefficient (db km^-1) + real(wp), intent(out) :: & + vf, vq ! Ze weighted + real(wp), intent(out) :: & + vt0, vt3, D3int, D0int ! for terminal velocity ! Internal Variables integer :: correct_for_rho ! Correct for density flag @@ -940,6 +1004,7 @@ subroutine zeff(freq,D,N,nsizes,k2,tt,ice,xr,z_eff,z_ray,kr,qe,qs,rho_e) conv_f = 0.299792458 ! Conversion for radar frequency (to m) complex(wp),dimension(nsizes) ::& m0 ! Complex index of refraction + real(wp) :: fall_sum ! temporal array for DPLRW ! Initialize z0_ray = 0._wp @@ -1023,7 +1088,65 @@ subroutine zeff(freq,D,N,nsizes,k2,tt,ice,xr,z_eff,z_ray,kr,qe,qs,rho_e) cr = 10./log(10.) ! DS2014 STOP kr = k_sum*0.25_wp*pi*(1000._wp*cr) + + ! <---------- vf_sum ---------> + fall_sum = 0._wp + if (size(D0) == 1) then + fall_sum = fall_speed(1)*qbsca(1)*(n(1)*1E6)*D0(1)*D0(1) + else + xtemp = fall_speed*qbsca*N0*D0*D0 + call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),fall_sum) + end if + const = ((wl*wl*wl*wl)/(pi*pi*pi*pi*pi))*(1._wp/k2) + vf = fall_sum*const*0.25_wp*pi*1E18 + + fall_sum = 0._wp + if (size(D0) == 1) then + fall_sum = fall_speed(1)*fall_speed(1)*qbsca(1)*(n(1)*1E6)*D0(1)*D0(1) + else + xtemp = fall_speed*fall_speed*qbsca*N0*D0*D0 + call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),fall_sum) + end if + const = ((wl*wl*wl*wl)/(pi*pi*pi*pi*pi))*(1._wp/k2) + vq = fall_sum*const*0.25_wp*pi*1E18 + ! <---------- vf_sum for terminal velocity ---------> + fall_sum = 0._wp + if (size(D0) == 1) then + fall_sum = fall_speed(1)*(n(1)*1E6)*D0(1)*D0(1)*D0(1) + else + xtemp = fall_speed*N0*D0*D0*D0 + call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),fall_sum) + end if + vt3 = fall_sum + + fall_sum = 0._wp + if (size(D0) == 1) then + fall_sum = (n(1)*1E6)*D0(1)*D0(1)*D0(1) + else + xtemp = N0*D0*D0*D0 + call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),fall_sum) + end if + D3int = fall_sum + + fall_sum = 0._wp + if (size(D0) == 1) then + fall_sum = fall_speed(1)*(n(1)*1E6) + else + xtemp = fall_speed*N0 + call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),fall_sum) + end if + vt0 = fall_sum + + fall_sum = 0._wp + if (size(D0) == 1) then + fall_sum = (n(1)*1E6) + else + xtemp = N0 + call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),fall_sum) + end if + D0int = fall_sum + ! z_ray = sum[D^6*N(D)*deltaD] if (xr == 1) then z0_ray = 0._wp @@ -1323,18 +1446,25 @@ subroutine hydro_class_init(lsingle,ldouble,sd) ! SINGLE MOMENT PARAMETERS integer,parameter,dimension(N_HYDRO) :: & ! LSL LSI LSR LSS CVL CVI CVR CVS LSG - HCLASS1_TYPE = (/5, 1, 2, 2, 5, 1, 2, 2, 2/), & ! +! HCLASS1_TYPE = (/5, 1, 2, 2, 5, 1, 2, 2, 2/), & ! + HCLASS1_TYPE = (/1, 1, 1, 1, 1, 1, 2, 2, 1/), & ! HCLASS1_PHASE = (/0, 1, 0, 1, 0, 1, 0, 1, 1/) ! real(wp),parameter,dimension(N_HYDRO) ::& ! LSL LSI LSR LSS CVL CVI CVR CVS LSG HCLASS1_DMIN = (/ -1., -1., -1., -1., -1., -1., -1., -1., -1. /), & HCLASS1_DMAX = (/ -1., -1., -1., -1., -1., -1., -1., -1., -1. /), & - HCLASS1_APM = (/524., 110.8, 524., -1., 524., 110.8, 524., -1., -1. /), & - HCLASS1_BPM = (/ 3., 2.91, 3., -1., 3., 2.91, 3., -1., -1. /), & - HCLASS1_RHO = (/ -1., -1., -1., 100., -1., -1., -1., 100., 400. /), & - HCLASS1_P1 = (/ -1., -1., 8.e6, 3.e6, -1., -1., 8.e6, 3.e6, 4.e6/), & - HCLASS1_P2 = (/ 6., 40., -1., -1., 6., 40., -1., -1., -1. /), & - HCLASS1_P3 = (/ 0.3, 2., -1., -1., 0.3, 2., -1., -1., -1. /) +! HCLASS1_APM = (/524., 110.8, 524., -1., 524., 110.8, 524., -1., -1. /), & +! HCLASS1_BPM = (/ 3., 2.91, 3., -1., 3., 2.91, 3., -1., -1. /), & +! HCLASS1_RHO = (/ -1., -1., -1., 100., -1., -1., -1., 100., 400. /), & + HCLASS1_APM = (/524., -1., 524., -1., 524., -1., 524., -1., -1. /), & + HCLASS1_BPM = (/ 3., -1., 3., -1., 3., -1., 3., -1., -1. /), & + HCLASS1_RHO = (/ -1., 500., -1., 250., -1., 500., -1., 250., 500. /), & +! HCLASS1_P1 = (/ -1., -1., 8.e6, 3.e6, -1., -1., 8.e6, 3.e6, 4.e6/), & +! HCLASS1_P2 = (/ 6., 40., -1., -1., 6., 40., -1., -1., -1. /), & +! HCLASS1_P3 = (/ 0.3, 2., -1., -1., 0.3, 2., -1., -1., -1. /) + HCLASS1_P1 = (/ -1., -1., -1., -1., -1., -1., 8.e6, 3.e6, -1. /), & + HCLASS1_P2 = (/ 6., 40., 20., 40., 6., 40., -1., -1., 60. /), & + HCLASS1_P3 = (/ 1., 1., 5., 1., 1., 5., -1., -1., 1. /) ! TWO MOMENT PARAMETERS integer,parameter,dimension(N_HYDRO) :: & @@ -1352,6 +1482,18 @@ subroutine hydro_class_init(lsingle,ldouble,sd) HCLASS2_P1 = (/ -1, -1, -1, -1, -1, -1, -1, -1, -1/), & HCLASS2_P2 = (/ -1, -1, -1, -1, -1, -1, -1, -1, -1/), & HCLASS2_P3 = (/ -2, 1, 1, 1, -2, 1, 1, 1, 1/) + + integer,parameter,dimension(N_HYDRO) :: & + ! type1 -> p1*D^p2 ; type2 -> Posselt and Lohmann (2008) Eq.11 + ! LSL LSI LSR LSS CVL CVI CVR CVS LSG + ftype = (/ 2, 1, 2, 1, 2, 1, 1, 1, 1 /),& + fvscs = (/ 0, 0, 0, 0, 0, 0, 1, 1, 0 /) + + real(wp),parameter,dimension(N_HYDRO) :: & + ! LSL LSI LSR LSS CVL CVI CVR CVS LSG + f1 = (/ 9.65 , 1.107 , 9.65 , 3.321 , 9.65 , 1.107 , 8.42E+2, 4.84 , 19.3 /),& + f2 = (/ 10.43 , 0.22 , 10.43 , 0.22 , 10.43 , 0.22 , 0.8 , 0.25 , 0.37 /),& + f3 = (/ 6.00E+2, 0.00 , 6.00E+2, 0.00 , 6.00E+2, 0.00 , 0.00 , 0.00 , 0.00 /) if (lsingle) then sd%dtype(1:N_HYDRO) = HCLASS1_TYPE(1:N_HYDRO) @@ -1376,6 +1518,60 @@ subroutine hydro_class_init(lsingle,ldouble,sd) sd%p1(1:N_HYDRO) = HCLASS2_P1(1:N_HYDRO) sd%p2(1:N_HYDRO) = HCLASS2_P2(1:N_HYDRO) sd%p3(1:N_HYDRO) = HCLASS2_P3(1:N_HYDRO) - endif - end subroutine hydro_class_init + endif + + sd%ftype = ftype + sd%fvscs = fvscs + sd%f1 = f1 + sd%f2 = f2 + sd%f3 = f3 + + end subroutine hydro_class_init + + subroutine fall_velocity(nsizes,D0,sd,p_matrix,t_matrix,tp,fall) + implicit none + integer,intent(in) :: & + nsizes,tp + real(wp),intent(in), dimension(nsizes) :: & + D0 ! [m], equivalent volume spheres + type(size_distribution),intent(in) :: & + sd + real(wp),intent(in) :: & + p_matrix,t_matrix + real(wp),intent(out),dimension(nsizes) :: & + fall ! positive = ascending, [m/s] + + ! internal work + real(wp) :: rho,rho0 + integer,parameter :: & ! same index as in subsample_and_optics + LSCLIQ = 1, & + LSCICE = 2, & + LSRAIN = 3, & + LSSNOW = 4, & + CVCLIQ = 5, & + CVCICE = 6, & + CVRAIN = 7, & + CVSNOW = 8, & + LSGRPL = 9 + real(wp),dimension(N_HYDRO) :: vscs_fct + + rho0 = 101300/273.15/287 + rho = p_matrix/t_matrix/287 + vscs_fct = merge(sqrt(rho0/rho),1._wp,sd%fvscs==1) + + if (sd%ftype(tp) == 1) then + ! p1 * D^p2 + fall = -1 * vscs_fct(tp) * & + ( sd%f1(tp) * D0**sd%f2(tp) + sd%f3(tp) ) + else if (sd%ftype(tp) == 2) then + ! Posselt and Lohmann (2008), Eq.11 + fall = -1 * vscs_fct(tp) * & + ( sd%f1(tp) - sd%f2(tp)*exp(-1*sd%f3(tp)*D0) + (sd%f2(tp)-sd%f1(tp))*exp(-5*sd%f3(tp)*D0) ) + else + write(*,*) 'WARNING: size_distribution, undefined ftype; STOP' + stop + end if + + end subroutine fall_velocity + end module mod_quickbeam_optics diff --git a/subsample_and_optics_example/optics/quickbeam_optics/quickbeam_optics.F90.bak b/subsample_and_optics_example/optics/quickbeam_optics/quickbeam_optics.F90.bak new file mode 100644 index 0000000000..dd39c73b3a --- /dev/null +++ b/subsample_and_optics_example/optics/quickbeam_optics/quickbeam_optics.F90.bak @@ -0,0 +1,1381 @@ +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +! Copyright (c) 2015, Regents of the University of Colorado +! All rights reserved. +! +! Redistribution and use in source and binary forms, with or without modification, are +! permitted provided that the following conditions are met: +! +! 1. Redistributions of source code must retain the above copyright notice, this list of +! conditions and the following disclaimer. +! +! 2. Redistributions in binary form must reproduce the above copyright notice, this list +! of conditions and the following disclaimer in the documentation and/or other +! materials provided with the distribution. +! +! 3. Neither the name of the copyright holder nor the names of its contributors may be +! used to endorse or promote products derived from this software without specific prior +! written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +! +! History: +! May 2015: Dustin Swales - Initial version +! +! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +module mod_quickbeam_optics + USE COSP_KINDS, ONLY: wp,dp + USE array_lib, ONLY: infind + USE math_lib, ONLY: path_integral,avint,gamma + USE optics_lib, ONLY: m_wat,m_ice,MieInt + USE cosp_math_constants, ONLY: pi + USE cosp_phys_constants, ONLY: rhoice + use quickbeam, ONLY: dmin,dmax,Re_BIN_LENGTH, & + Re_MAX_BIN,nRe_types,nd,maxhclass + use mod_cosp_config, ONLY: N_HYDRO + use mod_cosp_error, ONLY: errorMessage + use mod_cosp_stats, ONLY: radar_cfg + implicit none + + ! Derived type for particle size distribution + TYPE size_distribution + real(wp),dimension(maxhclass) :: p1,p2,p3,dmin,dmax,apm,bpm,rho + integer, dimension(maxhclass) :: dtype,phase + END TYPE size_distribution + + ! Parameters + integer,parameter :: & ! + cnt_liq = 19, & ! Liquid temperature count + cnt_ice = 20 ! Lce temperature count + + ! Initialization variables + real(wp),dimension(cnt_ice) :: mt_tti + real(wp),dimension(cnt_liq) :: mt_ttl + real(wp),dimension(nd) :: D + !logical :: lQuickbeamInit + +contains + ! ###################################################################################### + ! SUBROUTINE quickbeam_optics_init + ! ###################################################################################### + subroutine quickbeam_optics_init() + integer :: j + + mt_tti = (/ ((j-1)*5-90 + 273.15, j = 1, cnt_ice) /) + mt_ttl = (/ ((j-1)*5-60 + 273.15, j = 1, cnt_liq) /) + D(1) = dmin + do j=2,nd + D(j) = D(j-1)*exp((log(dmax)-log(dmin))/(nd-1)) + enddo + !lQuickbeamInit = .true. + end subroutine quickbeam_optics_init + + ! ###################################################################################### + ! SUBROUTINE QUICKBEAM_OPTICS + ! ###################################################################################### + subroutine quickbeam_optics(sd, rcfg, nprof, ngate, undef, hm_matrix, re_matrix, & + Np_matrix, p_matrix, t_matrix, sh_matrix,z_vol,kr_vol) + + ! INPUTS + type(size_distribution),intent(inout) :: & + sd ! + type(radar_cfg),intent(inout) :: & + rcfg ! + integer,intent(in) :: & + nprof, & ! Number of hydrometeor profiles + ngate ! Number of vertical layers + real(wp),intent(in) :: & + undef ! Missing data value + real(wp),intent(in),dimension(nprof,ngate) :: & + p_matrix, & ! Pressure profile (hPa) + t_matrix, & ! Temperature profile (K) + sh_matrix ! Specific humidity profile (%) -- only needed if gaseous aborption calculated. + real(wp),intent(in),dimension(nprof,ngate,rcfg%nhclass) :: & + re_matrix, & ! Table of hydrometeor effective radii. 0 ==> use defaults. (units=microns) + hm_matrix ! Table of hydrometeor mixing ratios (g/kg) + real(wp),intent(inout),dimension(nprof,ngate,rcfg%nhclass) :: & + Np_matrix ! Table of hydrometeor number concentration. 0 ==> use defaults. (units = 1/kg) + + ! OUTPUTS + real(wp),intent(out), dimension(nprof, ngate) :: & + z_vol, & ! Effective reflectivity factor (mm^6/m^3) + kr_vol ! Attenuation coefficient hydro (dB/km) + + ! INTERNAL VARIABLES + integer :: & + phase, ns,tp,j,k,pr,itt,iRe_type,n + logical :: & + hydro + real(wp) :: & + t_kelvin,Re_internal + real(wp) :: & + rho_a,kr,ze,zr,scale_factor,Re,Np,base,step + + real(wp),dimension(:),allocatable :: & + Deq, & ! Discrete drop sizes (um) + Ni, & ! Discrete concentrations (cm^-3 um^-1) + rhoi, & ! Discrete densities (kg m^-3) + xxa, & ! + Di ! Discrete drop sizes (um) + + real(wp), dimension(nprof, ngate) :: & + z_ray ! Reflectivity factor, Rayleigh only (mm^6/m^3) + + ! PARAMETERS + logical, parameter :: & ! + DO_LUT_TEST = .false., & ! + DO_NP_TEST = .false. ! + real(wp), parameter :: & + one_third = 1._wp/3._wp ! + + ! Initialization + z_vol = 0._wp + z_ray = 0._wp + kr_vol = 0._wp + + do k=1,ngate ! Loop over each profile (nprof) + do pr=1,nprof + ! Determine if hydrometeor(s) present in volume + hydro = .false. + do j=1,rcfg%nhclass + if ((hm_matrix(pr,k,j) > 1E-12) .and. (sd%dtype(j) > 0)) then + hydro = .true. + exit + endif + enddo + + t_kelvin = t_matrix(pr,k) + ! If there is hydrometeor in the volume + if (hydro) then + rho_a = (p_matrix(pr,k))/(287._wp*(t_kelvin)) + + ! Loop over hydrometeor type + do tp=1,rcfg%nhclass + Re_internal = re_matrix(pr,k,tp) + + if (hm_matrix(pr,k,tp) <= 1E-12) cycle + + ! Index into temperature dimension of scaling tables + ! These tables have regular steps -- exploit this and abandon infind + phase = sd%phase(tp) + if (phase==0) then + itt = infind(mt_ttl,t_kelvin) + else + itt = infind(mt_tti,t_kelvin) + endif + + ! Compute effective radius from number concentration and distribution parameters + if (Re_internal .eq. 0) then + call calc_Re(hm_matrix(pr,k,tp),Np_matrix(pr,k,tp),rho_a, & + sd%dtype(tp),sd%apm(tp),sd%bpm(tp),sd%rho(tp),sd%p1(tp),sd%p2(tp),sd%p3(tp),Re) + Re_internal=Re + !re_matrix(pr,k,tp)=Re + else + if (Np_matrix(pr,k,tp) > 0) then + call errorMessage('WARNING(optics/quickbeam_optics.f90): Re and Np set for the same volume & hydrometeor type. Np is being ignored.') + endif + Re = Re_internal + !Re = re_matrix(pr,k,tp) + endif + + ! Index into particle size dimension of scaling tables + iRe_type=1 + if(Re.gt.0) then + ! Determine index in to scale LUT + ! Distance between Re points (defined by "base" and "step") for + ! each interval of size Re_BIN_LENGTH + ! Integer asignment, avoids calling floor intrinsic + n=Re/Re_BIN_LENGTH + if (n>=Re_MAX_BIN) n=Re_MAX_BIN-1 + step = rcfg%step_list(n+1) + base = rcfg%base_list(n+1) + iRe_type=Re/step + if (iRe_type.lt.1) iRe_type=1 + Re=step*(iRe_type+0.5_wp) ! set value of Re to closest value allowed in LUT. + iRe_type=iRe_type+base-int(n*Re_BIN_LENGTH/step) + + ! Make sure iRe_type is within bounds + if (iRe_type.ge.nRe_types) then + !write(*,*) 'Warning: size of Re exceed value permitted ', & + ! 'in Look-Up Table (LUT). Will calculate. ' + ! No scaling allowed + iRe_type=nRe_types + rcfg%Z_scale_flag(tp,itt,iRe_type)=.false. + else + ! Set value in re_matrix to closest values in LUT + if (.not. DO_LUT_TEST) re_internal=Re + !if (.not. DO_LUT_TEST) re_matrix(pr,k,tp)=Re + endif + endif + + ! Use Ze_scaled, Zr_scaled, and kr_scaled ... if know them + ! if not we will calculate Ze, Zr, and Kr from the distribution parameters +! if( rcfg%Z_scale_flag(tp,itt,iRe_type) .and. .not. DO_LUT_TEST) then +! ! can use z scaling +! scale_factor=rho_a*hm_matrix(pr,k,tp) +! zr = rcfg%Zr_scaled(tp,itt,iRe_type) * scale_factor +! ze = rcfg%Ze_scaled(tp,itt,iRe_type) * scale_factor +! kr = rcfg%kr_scaled(tp,itt,iRe_type) * scale_factor +! else + if( (.not. rcfg%Z_scale_flag(tp,itt,iRe_type)) .or. DO_LUT_TEST) then + ! Create a discrete distribution of hydrometeors within volume + select case(sd%dtype(tp)) + case(4) + ns = 1 + allocate(Di(ns),Ni(ns),rhoi(ns),xxa(ns),Deq(ns)) + Di = sd%p1(tp) + Ni = 0._wp + case default + ns = nd ! constant defined in simulator/quickbeam.f90 + allocate(Di(ns),Ni(ns),rhoi(ns),xxa(ns),Deq(ns)) + Di = D + Ni = 0._wp + end select + call dsd(hm_matrix(pr,k,tp),re_internal,Np_matrix(pr,k,tp), & + Di,Ni,ns,sd%dtype(tp),rho_a,t_kelvin, & + sd%dmin(tp),sd%dmax(tp),sd%apm(tp),sd%bpm(tp), & + sd%rho(tp),sd%p1(tp),sd%p2(tp),sd%p3(tp)) + + ! Calculate particle density + if (phase == 1) then + if (sd%rho(tp) < 0) then + ! Use equivalent volume spheres. + rcfg%rho_eff(tp,1:ns,iRe_type) = rhoice ! solid ice == equivalent volume approach + Deq = ( ( 6/pi*sd%apm(tp)/rhoice) ** one_third ) * ( (Di*1E-6) ** (sd%bpm(tp)/3._wp) ) * 1E6 + ! alternative is to comment out above two lines and use the following block + ! MG Mie approach - adjust density of sphere with D = D_characteristic to match particle density + ! + ! rcfg%rho_eff(tp,1:ns,iRe_type) = (6/pi)*sd%apm(tp)*(Di*1E-6)**(sd%bpm(tp)-3) !MG Mie approach + + ! as the particle size gets small it is possible that the mass to size relationship of + ! (given by power law in hclass.data) can produce impossible results + ! where the mass is larger than a solid sphere of ice. + ! This loop ensures that no ice particle can have more mass/density larger than an ice sphere. + ! do i=1,ns + ! if(rcfg%rho_eff(tp,i,iRe_type) > 917 ) then + ! rcfg%rho_eff(tp,i,iRe_type) = 917 + ! endif + ! enddo + else + ! Equivalent volume sphere (solid ice rhoice=917 kg/m^3). + rcfg%rho_eff(tp,1:ns,iRe_type) = rhoice + Deq=Di * ((sd%rho(tp)/rhoice)**one_third) + ! alternative ... coment out above two lines and use the following for MG-Mie + ! rcfg%rho_eff(tp,1:ns,iRe_type) = sd%rho(tp) !MG Mie approach + endif + else + ! I assume here that water phase droplets are spheres. + ! sd%rho should be ~ 1000 or sd%apm=524 .and. sd%bpm=3 + Deq = Di + endif + + ! Calculate effective reflectivity factor of volume + ! xxa are unused (Mie scattering and extinction efficiencies) + xxa(1:ns) = -9.9_wp + rhoi = rcfg%rho_eff(tp,1:ns,iRe_type) + call zeff(rcfg%freq,Deq,Ni,ns,rcfg%k2,t_kelvin,phase,rcfg%do_ray, & + ze,zr,kr,xxa,xxa,rhoi) + + ! Test compares total number concentration with sum of discrete samples + ! The second test, below, compares ab initio and "scaled" computations + ! of reflectivity + ! These should get broken out as a unit test that gets called on + ! data. That routine could write to std out. + + ! Test code ... compare Np value input to routine with sum of DSD + ! NOTE: if .not. DO_LUT_TEST, then you are checking the LUT approximation + ! not just the DSD representation given by Ni + if(Np_matrix(pr,k,tp)>0 .and. DO_NP_TEST ) then + Np = path_integral(Ni,Di,1,ns-1)/rho_a*1.E6_wp + ! Note: Representation is not great or small Re < 2 + if( (Np_matrix(pr,k,tp)-Np)/Np_matrix(pr,k,tp)>0.1 ) then + call errorMessage('ERROR(optics/quickbeam_optics.f90): Error: Np input does not match sum(N)') + endif + endif + + ! Clean up space + deallocate(Di,Ni,rhoi,xxa,Deq) + + ! LUT test code + ! This segment of code compares full calculation to scaling result + if ( rcfg%Z_scale_flag(tp,itt,iRe_type) .and. DO_LUT_TEST ) then + scale_factor=rho_a*hm_matrix(pr,k,tp) + ! if more than 2 dBZe difference print error message/parameters. + if ( abs(10*log10(ze) - 10*log10(rcfg%Ze_scaled(tp,itt,iRe_type) * & + scale_factor)) > 2 ) then + call errorMessage('ERROR(optics/quickbeam_optics.f90): ERROR: Roj Error?') + endif + endif + else + ! Use z scaling + scale_factor=rho_a*hm_matrix(pr,k,tp) + zr = rcfg%Zr_scaled(tp,itt,iRe_type) * scale_factor + ze = rcfg%Ze_scaled(tp,itt,iRe_type) * scale_factor + kr = rcfg%kr_scaled(tp,itt,iRe_type) * scale_factor + endif ! end z_scaling + + kr_vol(pr,k) = kr_vol(pr,k) + kr + z_vol(pr,k) = z_vol(pr,k) + ze + z_ray(pr,k) = z_ray(pr,k) + zr + + ! Construct Ze_scaled, Zr_scaled, and kr_scaled ... if we can + if ( .not. rcfg%Z_scale_flag(tp,itt,iRe_type) ) then + if (iRe_type>1) then + scale_factor=rho_a*hm_matrix(pr,k,tp) + rcfg%Ze_scaled(tp,itt,iRe_type) = ze/ scale_factor + rcfg%Zr_scaled(tp,itt,iRe_type) = zr/ scale_factor + rcfg%kr_scaled(tp,itt,iRe_type) = kr/ scale_factor + rcfg%Z_scale_flag(tp,itt,iRe_type) = .true. + rcfg%Z_scale_added_flag(tp,itt,iRe_type)=.true. + endif + endif + enddo ! end loop of tp (hydrometeor type) + endif + enddo + enddo + + where(kr_vol(:,:) <= EPSILON(kr_vol)) + ! Volume is hydrometeor-free + !z_vol(:,:) = undef + z_ray(:,:) = undef + end where + + end subroutine quickbeam_optics + ! ############################################################################################## + ! ############################################################################################## + subroutine calc_Re(Q,Np,rho_a,dtype,apm,bpm,rho_c,p1,p2,p3,Re) + ! ############################################################################################## + ! Purpose: + ! Calculates Effective Radius (1/2 distribution 3rd moment / 2nd moment). + ! + ! For some distribution types, the total number concentration (per kg), Np + ! may be optionally specified. Should be set to zero, otherwise. + ! + ! Roj Marchand July 2010 + ! + ! Inputs: + ! + ! [Q] hydrometeor mixing ratio (g/kg) ! not needed for some distribution types + ! [Np] Optional Total number concentration (per kg). 0 = use defaults (p1, p2, p3) + ! [rho_a] ambient air density (kg m^-3) + ! + ! Distribution parameters as per quickbeam documentation. + ! [dtype] distribution type + ! [apm] a parameter for mass (kg m^[-bpm]) + ! [bmp] b params for mass + ! [p1],[p2],[p3] distribution parameters + ! + ! Outputs: + ! [Re] Effective radius, 1/2 the 3rd moment/2nd moment (um) + ! + ! Created: + ! July 2010 Roj Marchand + ! Modified: + ! 12/18/14 Dustin Swales: Define type REALs as double precision (dustin.swales@noaa.gov) + ! + ! ############################################################################################## + ! ############################################################################################## + + ! Inputs + real(wp), intent(in) :: Q,Np,rho_a,rho_c,p1,p2,p3 + integer, intent(in) :: dtype + real(wp), intent(inout) :: apm,bpm + + ! Outputs + real(wp), intent(out) :: Re + + ! Internal + integer :: local_dtype + real(wp) :: local_p3,local_Np,tmp1,tmp2 + real(wp) :: N0,D0,vu,dm,ld,rg,log_sigma_g ! gamma, exponential variables + + + ! If density is constant, set equivalent values for apm and bpm + if ((rho_c > 0) .and. (apm < 0)) then + apm = (pi/6)*rho_c + bpm = 3._wp + endif + + ! Exponential is same as modified gamma with vu =1 + ! if Np is specified then we will just treat as modified gamma + if(dtype .eq. 2 .and. Np .gt. 0) then + local_dtype = 1 + local_p3 = 1 + else + local_dtype = dtype + local_p3 = p3 + endif + select case(local_dtype) + + ! ---------------------------------------------------------! + ! Modified gamma ! + ! Np = total number concentration (1/kg) = Nt / rho_a ! + ! D0 = characteristic diameter (um) ! + ! dm = mean diameter (um) - first moment over zeroth moment! + ! vu = distribution width parameter ! + ! ---------------------------------------------------------! + case(1) + + if( abs(local_p3+2) < 1E-8) then + if(Np>1E-30) then + ! Morrison scheme with Martin 1994 shape parameter (NOTE: vu = pc +1) + ! fixed Roj. Dec. 2010 -- after comment by S. Mcfarlane + vu = (1/(0.2714_wp + 0.00057145_wp*Np*rho_a*1E-6))**2 ! units of Nt = Np*rhoa = #/cm^3 + else + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify a value for Np in each volume with Morrison/Martin Scheme.') + return + endif + elseif (abs(local_p3+1) > 1E-8) then + ! vu is fixed in hp structure + vu = local_p3 + else + ! vu isn't specified + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify a value for vu for Modified Gamma distribution') + return + endif + + if( Np.eq.0 .and. p2+1 > 1E-8) then ! use default value for MEAN diameter as first default + dm = p2 ! by definition, should have units of microns + D0 = gamma(vu)/gamma(vu+1)*dm + else ! use value of Np + if(Np.eq.0) then + if( abs(p1+1) > 1E-8 ) then ! use default number concentration + local_Np = p1 ! total number concentration / pa --- units kg^-1 + else + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify Np or default value (p1=Dm [um] or p2=Np [1/kg]) for Modified Gamma distribution') + return + endif + else + local_Np=Np; + endif + D0 = 1E6 * ( Q*1E-3*gamma(vu)/(apm*local_Np*gamma(vu+bpm)) )**(1/bpm) ! units = microns + endif + Re = 0.5_wp*D0*gamma(vu+3)/gamma(vu+2) + + ! ---------------------------------------------------------! + ! Exponential ! + ! N0 = intercept parameter (m^-4) ! + ! ld = slope parameter (um) ! + ! ---------------------------------------------------------! + case(2) + + ! Np not specified (see if statement above) + if((abs(p1+1) > 1E-8) ) then ! N0 has been specified, determine ld + N0 = p1 + tmp1 = 1._wp/(1._wp+bpm) + ld = ((apm*gamma(1._wp+bpm)*N0)/(rho_a*Q*1E-3))**tmp1 + ld = ld/1E6 ! set units to microns^-1 + elseif (abs(p2+1) > 1E-8) then ! lambda=ld has been specified as default + ld = p2 ! should have units of microns^-1 + else + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify Np or default value (p1=No or p2=lambda) for Exponential distribution') + return + endif + Re = 1.5_wp/ld + + ! ---------------------------------------------------------! + ! Power law ! + ! ahp = Ar parameter (m^-4 mm^-bhp) ! + ! bhp = br parameter ! + ! dmin_mm = lower bound (mm) ! + ! dmax_mm = upper bound (mm) ! + ! ---------------------------------------------------------! + case(3) + + Re=0._wp ! Not supporting LUT approach for power-law ... + if(Np>0) then + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Variable Np not supported for Power Law distribution') + return + endif + + ! ---------------------------------------------------------! + ! Monodisperse ! + ! D0 = particle diameter (um) == Re ! + ! ---------------------------------------------------------! + case(4) + + Re = p1 + if(Np>0) then + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Variable Np not supported for Monodispersed distribution') + return + endif + + ! ---------------------------------------------------------! + ! Lognormal ! + ! N0 = total number concentration (m^-3) ! + ! np = fixed number concentration (kg^-1) ! + ! rg = mean radius (um) ! + ! log_sigma_g = ln(geometric standard deviation) ! + ! ---------------------------------------------------------! + case(5) + + if( abs(local_p3+1) > 1E-8 ) then + !set natural log width + log_sigma_g = local_p3 + else + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify a value for sigma_g when using a Log-Normal distribution') + return + endif + + ! get rg ... + if( Np.eq.0 .and. (abs(p2+1) > 1E-8) ) then ! use default value of rg + rg = p2 + else + if(Np>0) then + local_Np=Np; + elseif(abs(p2+1) < 1E-8) then + local_Np=p1 + else + call errorMessage('ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify Np or default value (p2=Rg or p1=Np) for Log-Normal distribution') + endif + log_sigma_g = p3 + tmp1 = (Q*1E-3)/(2._wp**bpm*apm*local_Np) + tmp2 = exp(0.5_wp*bpm*bpm*(log_sigma_g))*exp(0.5_wp*bpm*bpm*(log_sigma_g)) + rg = ((tmp1/tmp2)**(1._wp/bpm))*1E6 + endif + Re = rg*exp(2.5_wp*(log_sigma_g*log_sigma_g)) + end select + end subroutine calc_Re + ! ############################################################################################## + ! ############################################################################################## + subroutine dsd(Q,Re,Np,D,N,nsizes,dtype,rho_a,tk,dmin,dmax,apm,bpm,rho_c,p1,p2,p3) + ! ############################################################################################## + ! Purpose: + ! Create a discrete drop size distribution + ! + ! Starting with Quickbeam V3, this routine now allows input of + ! both effective radius (Re) and total number concentration (Nt) + ! Roj Marchand July 2010 + ! + ! The version in Quickbeam v.104 was modified to allow Re but not Nt + ! This is a significantly modified form for the version + ! + ! Originally Part of QuickBeam v1.03 by John Haynes + ! http://reef.atmos.colostate.edu/haynes/radarsim + ! + ! Inputs: + ! + ! [Q] hydrometeor mixing ratio (g/kg) + ! [Re] Optional Effective Radius (microns). 0 = use defaults (p1, p2, p3) + ! + ! [D] array of discrete drop sizes (um) where we desire to know the number concentraiton n(D). + ! [nsizes] number of elements of [D] + ! + ! [dtype] distribution type + ! [rho_a] ambient air density (kg m^-3) + ! [tk] temperature (K) + ! [dmin] minimum size cutoff (um) + ! [dmax] maximum size cutoff (um) + ! [rho_c] alternate constant density (kg m^-3) + ! [p1],[p2],[p3] distribution parameters + ! + ! Input/Output: + ! [apm] a parameter for mass (kg m^[-bpm]) + ! [bmp] b params for mass + ! + ! Outputs: + ! [N] discrete concentrations (cm^-3 um^-1) + ! or, for monodisperse, a constant (1/cm^3) + ! + ! Requires: + ! function infind + ! + ! Created: + ! 11/28/05 John Haynes (haynes@atmos.colostate.edu) + ! Modified: + ! 01/31/06 Port from IDL to Fortran 90 + ! 07/07/06 Rewritten for variable DSD's + ! 10/02/06 Rewritten using scaling factors (Roger Marchand and JMH), Re added V1.04 + ! July 2020 "N Scale factors" (variable fc) removed (Roj Marchand). + ! 12/18/14 Define type REALs as double precision (dustin.swales@noaa.gov) + ! ############################################################################################## + + ! Inputs + integer, intent(in) :: & + nsizes,& ! Number of elements of [D] + dtype ! distribution type + real(wp),intent(in),dimension(nsizes) :: & + D ! Array of discrete drop sizes (um) where we desire to know the number concentraiton n(D). + real(wp),intent(in) :: & + Q, & ! Hydrometeor mixing ratio (g/kg) + Np, & ! + rho_a, & ! Ambient air density (kg m^-3) + tk, & ! Temperature (K) + dmin, & ! Minimum size cutoff (um) + dmax, & ! Maximum size cutoff (um) + rho_c, & ! Alternate constant density (kg m^-3) + p1, & ! Distribution parameter 1 + p2, & ! Distribution parameter 2 + p3 ! Distribution parameter 3 + real(wp),intent(inout) :: & + apm, & ! a parameter for mass (kg m^[-bpm]) + bpm, & ! b params for mass + Re ! Optional Effective Radius (microns) + + ! Outputs + real(wp),intent(out),dimension(nsizes) :: & + N ! Discrete concentrations (cm^-3 um^-1) + ! or, for monodisperse, a constant (1/cm^3) + + ! Internal Variables + real(wp),dimension(nsizes) :: & + fc + real(wp) :: & + N0,D0,vu,local_np,dm,ld, & ! gamma, exponential variables + dmin_mm,dmax_mm,ahp,bhp, & ! power law variables + rg,log_sigma_g, & ! lognormal variables + rho_e, & ! particle density (kg m^-3) + tmp1,tmp2,tc + integer :: & + k,lidx,uidx + + ! Convert temperature from Kelvin to Celsius + tc = tk - 273.15_wp + + ! If density is constant, store equivalent values for apm and bpm + if ((rho_c > 0) .and. (apm < 0)) then + apm = (pi/6)*rho_c + bpm = 3._wp + endif + + ! Will preferentially use Re input over Np. + ! if only Np given then calculate Re + ! if neigher than use other defaults (p1,p2,p3) following quickbeam documentation + if(Re==0 .and. Np>0) then + call calc_Re(Q,Np,rho_a,dtype,apm,bpm,rho_c,p1,p2,p3,Re) + endif + select case(dtype) + + ! ---------------------------------------------------------! + ! Modified gamma ! + ! np = total number concentration ! + ! D0 = characteristic diameter (um) ! + ! dm = mean diameter (um) - first moment over zeroth moment! + ! vu = distribution width parameter ! + ! ---------------------------------------------------------! + case(1) + + if( abs(p3+2) < 1E-8) then + if( Np>1E-30) then + ! Morrison scheme with Martin 1994 shape parameter (NOTE: vu = pc +1) + ! fixed Roj. Dec. 2010 -- after comment by S. Mcfarlane + vu = (1/(0.2714_wp + 0.00057145_wp*Np*rho_a*1E-6))**2._wp ! units of Nt = Np*rhoa = #/cm^3 + else + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Must specify a value for Np in each volume with Morrison/Martin Scheme.') + return + endif + elseif (abs(p3+1) > 1E-8) then + ! vu is fixed in hp structure + vu = p3 + else + ! vu isn't specified + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Must specify a value for vu for Modified Gamma distribution') + return + endif + + if(Re>0) then + D0 = 2._wp*Re*gamma(vu+2)/gamma(vu+3) + fc = (((D*1E-6)**(vu-1)*exp(-1*D/D0)) / & + (apm*((D0*1E-6)**(vu+bpm))*gamma(vu+bpm))) * 1E-12 + N = fc*rho_a*(Q*1E-3) + elseif( p2+1 > 1E-8) then ! use default value for MEAN diameter + dm = p2 + D0 = gamma(vu)/gamma(vu+1)*dm + fc = (((D*1E-6)**(vu-1)*exp(-1*D/D0)) / & + (apm*((D0*1E-6)**(vu+bpm))*gamma(vu+bpm))) * 1E-12 + N = fc*rho_a*(Q*1E-3) + elseif(abs(p3+1) > 1E-8) then! use default number concentration + local_np = p1 ! total number concentration / pa check + tmp1 = (Q*1E-3)**(1./bpm) + fc = (D*1E-6 / (gamma(vu)/(apm*local_np*gamma(vu+bpm)))**(1._wp/bpm))**vu + N = ((rho_a*local_np*fc*(D*1E-6)**(-1._wp))/(gamma(vu)*tmp1**vu) * & + exp(-1._wp*fc**(1._wp/vu)/tmp1)) * 1E-12 + else + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): No default value for Dm or Np provided!') + return + endif + + ! ---------------------------------------------------------! + ! Exponential ! + ! N0 = intercept parameter (m^-4) ! + ! ld = slope parameter (um) ! + ! ---------------------------------------------------------! + case(2) + + if(Re>0) then + ld = 1.5_wp/Re ! units 1/um + fc = (ld*1E6)**(1.+bpm)/(apm*gamma(1._wp+bpm))*exp(-1._wp*(ld*1E6)*(D*1E-6))*1E-12 + N = fc*rho_a*(Q*1E-3) + elseif (abs(p1+1) > 1E-8) then + ! Use N0 default value + N0 = p1 + tmp1 = 1._wp/(1._wp+bpm) + fc = ((apm*gamma(1._wp+bpm)*N0)**tmp1)*(D*1E-6) + N = (N0*exp(-1._wp*fc*(1._wp/(rho_a*Q*1E-3))**tmp1)) * 1E-12 + elseif (abs(p2+1) > 1E-8) then + ! Use default value for lambda + ld = p2 + fc = (ld*1E6)**(1._wp+bpm)/(apm*gamma(1._wp+bpm))*exp(-1._wp*(ld*1E6)*(D*1E-6))*1E-12 + N = fc*rho_a*(Q*1E-3) + else + ! ld "parameterized" from temperature (carry over from original Quickbeam). + ld = 1220._wp*10._wp**(-0.0245_wp*tc)*1E-6 + N0 = ((ld*1E6)**(1._wp+bpm)*Q*1E-3*rho_a)/(apm*gamma(1._wp+bpm)) + N = (N0*exp(-ld*D)) * 1E-12 + endif + + ! ---------------------------------------------------------! + ! Power law ! + ! ahp = Ar parameter (m^-4 mm^-bhp) ! + ! bhp = br parameter ! + ! dmin_mm = lower bound (mm) ! + ! dmax_mm = upper bound (mm) ! + ! ---------------------------------------------------------! + case(3) + + if(Re>0) then + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Variable Re not supported for Power-Law distribution') + return + elseif(Np>0) then + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Variable Np not supported for Power-Law distribution') + return + endif + + ! br parameter + if (abs(p1+2) < 1E-8) then + ! if p1=-2, bhp is parameterized according to Ryan (2000), + ! applicatable to cirrus clouds + if (tc < -30) then + bhp = -1.75_wp+0.09_wp*((tc+273._wp)-243.16_wp) + elseif ((tc >= -30) .and. (tc < -9)) then + bhp = -3.25_wp-0.06_wp*((tc+273._wp)-265.66_wp) + else + bhp = -2.15_wp + endif + elseif (abs(p1+3) < 1E-8) then + ! if p1=-3, bhp is parameterized according to Ryan (2000), + ! applicable to frontal clouds + if (tc < -35) then + bhp = -1.75_wp+0.09_wp*((tc+273._wp)-243.16_wp) + elseif ((tc >= -35) .and. (tc < -17.5)) then + bhp = -2.65_wp+0.09_wp*((tc+273._wp)-255.66_wp) + elseif ((tc >= -17.5) .and. (tc < -9)) then + bhp = -3.25_wp-0.06_wp*((tc+273._wp)-265.66_wp) + else + bhp = -2.15_wp + endif + else + ! Otherwise the specified value is used + bhp = p1 + endif + + ! Ar parameter + dmin_mm = dmin*1E-3 + dmax_mm = dmax*1E-3 + + ! Commented lines are original method with constant density + ! rc = 500. ! (kg/m^3) + ! tmp1 = 6*rho_a*(bhp+4) + ! tmp2 = pi*rc*(dmax_mm**(bhp+4))*(1-(dmin_mm/dmax_mm)**(bhp+4)) + ! ahp = (Q*1E-3)*1E12*tmp1/tmp2 + + ! New method is more consistent with the rest of the distributions + ! and allows density to vary with particle size + tmp1 = rho_a*(Q*1E-3)*(bhp+bpm+1) + tmp2 = apm*(dmax_mm**bhp*dmax**(bpm+1)-dmin_mm**bhp*dmin**(bpm+1)) + ahp = tmp1/tmp2 * 1E24 + ! ahp = tmp1/tmp2 + lidx = infind(D,dmin) + uidx = infind(D,dmax) + do k=lidx,uidx + N(k) = (ahp*(D(k)*1E-3)**bhp) * 1E-12 + enddo + + ! ---------------------------------------------------------! + ! Monodisperse ! + ! D0 = particle diameter (um) ! + ! ---------------------------------------------------------! + case(4) + + if (Re>0) then + D0 = Re + else + D0 = p1 + endif + + rho_e = (6._wp/pi)*apm*(D0*1E-6)**(bpm-3) + fc(1) = (6._wp/(pi*D0*D0*D0*rho_e))*1E12 + N(1) = fc(1)*rho_a*(Q*1E-3) + + ! ---------------------------------------------------------! + ! Lognormal ! + ! N0 = total number concentration (m^-3) ! + ! np = fixed number concentration (kg^-1) ! + ! rg = mean radius (um) ! + ! og_sigma_g = ln(geometric standard deviation) ! + ! ---------------------------------------------------------! + case(5) + if (abs(p1+1) < 1E-8 .or. Re>0 ) then + ! rg, log_sigma_g are given + log_sigma_g = p3 + tmp2 = (bpm*log_sigma_g)*(bpm*log_sigma_g) + if(Re.le.0) then + rg = p2 + else + !rg = Re*exp(-2.5*(log_sigma_g*log_sigma_g)) + rg =Re*exp(-2.5_wp*(log_sigma_g**2)) + + endif + + fc = 0.5_wp*((1._wp/((2._wp*rg*1E-6)**(bpm)*apm*(2._wp*pi)**(0.5_wp) * & + log_sigma_g*D*0.5_wp*1E-6))*exp(-0.5_wp*((log(0.5_wp*D/rg)/log_sigma_g)**2._wp+tmp2)))*1E-12 + N = fc*rho_a*(Q*1E-3) + + elseif (abs(p2+1) < 1E-8 .or. Np>0) then + ! Np, log_sigma_g are given + if(Np>0) then + local_Np = Np + else + local_Np = p1 + endif + + log_sigma_g = p3 + N0 = local_np*rho_a + tmp1 = (rho_a*(Q*1E-3))/(2._wp**bpm*apm*N0) + tmp2 = exp(0.5_wp*bpm*bpm*(log_sigma_g))*exp(0.5_wp*bpm*bpm*(log_sigma_g)) + rg = ((tmp1/tmp2)**(1/bpm))*1E6 + + N = 0.5_wp*(N0 / ((2._wp*pi)**(0.5_wp)*log_sigma_g*D*0.5_wp*1E-6) * & + exp((-0.5_wp*(log(0.5_wp*D/rg)/log_sigma_g)**2._wp)))*1E-12 + else + call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Must specify a value for sigma_g') + return + endif + end select + end subroutine dsd + ! ############################################################################################## + ! ############################################################################################## + subroutine zeff(freq,D,N,nsizes,k2,tt,ice,xr,z_eff,z_ray,kr,qe,qs,rho_e) + ! ############################################################################################## + ! Purpose: + ! Simulates radar return of a volume given DSD of spheres + ! Part of QuickBeam v1.03 by John Haynes + ! http://reef.atmos.colostate.edu/haynes/radarsim + ! + ! Inputs: + ! [freq] radar frequency (GHz) + ! [D] discrete drop sizes (um) + ! [N] discrete concentrations (cm^-3 um^-1) + ! [nsizes] number of discrete drop sizes + ! [k2] |K|^2, -1=use frequency dependent default + ! [tt] hydrometeor temperature (K) + ! [ice] indicates volume consists of ice + ! [xr] perform Rayleigh calculations? + ! [qe] if using a mie table, these contain ext/sca ... + ! [qs] ... efficiencies; otherwise set to -1 + ! [rho_e] medium effective density (kg m^-3) (-1 = pure) + ! + ! Outputs: + ! [z_eff] unattenuated effective reflectivity factor (mm^6/m^3) + ! [z_ray] reflectivity factor, Rayleigh only (mm^6/m^3) + ! [kr] attenuation coefficient (db km^-1) + ! + ! Created: + ! 11/28/05 John Haynes (haynes@atmos.colostate.edu) + ! Modified: + ! 12/18/14 Dustin Swales: Define type REALs as double precision (dustin.swales@noaa.gov) + ! ############################################################################################## + ! Inputs + integer, intent(in) :: & + ice, & ! Indicates volume consists of ice + xr, & ! Perform Rayleigh calculations? + nsizes ! Number of discrete drop sizes + real(wp), intent(in),dimension(nsizes) :: & + D, & ! Discrete drop sizes (um) + N, & ! Discrete concentrations (cm^-3 um^-1) + rho_e, & ! Medium effective density (kg m^-3) (-1 = pure) + qe, & ! Extinction efficiency, when using Mie tables + qs ! Scatering efficiency, when using Mie tables + real(wp),intent(in) :: & + freq, & ! Radar frequency (GHz) + tt ! Hydrometeor temperature (K) + real(wp), intent(inout) :: & + k2 ! |K|^2, -1=use frequency dependent default + + ! Outputs + real(wp), intent(out) :: & + z_eff, & ! Unattenuated effective reflectivity factor (mm^6/m^3) + z_ray, & ! Reflectivity factor, Rayleigh only (mm^6/m^3) + kr ! Attenuation coefficient (db km^-1) + + ! Internal Variables + integer :: correct_for_rho ! Correct for density flag + real(wp), dimension(nsizes) :: & + D0, & ! D in (m) + N0, & ! N in m^-3 m^-1 + sizep, & ! Size parameter + qext, & ! Extinction efficiency + qbsca, & ! Backscatter efficiency + f, & ! Ice fraction + xtemp ! + real(wp) :: & + wl, cr,eta_sum,eta_mie,const,z0_eff,z0_ray,k_sum,n_r,n_i,dqv(1),dqsc,dg,dph(1) + complex(wp) :: & + m, & ! Complex index of refraction of bulk form + Xs1(1), Xs2(1) ! + integer :: & + i, err ! + integer, parameter :: & + one=1 ! + real(wp),parameter :: & + conv_d = 1e-6, & ! Conversion factor for drop sizes (to m) + conv_n = 1e12, & ! Conversion factor for drop concentrations (to m^-3) + conv_f = 0.299792458 ! Conversion for radar frequency (to m) + complex(wp),dimension(nsizes) ::& + m0 ! Complex index of refraction + + ! Initialize + z0_ray = 0._wp + + ! Conversions + D0 = d*conv_d + N0 = n*conv_n + wl = conv_f/freq + + ! // dielectric constant |k^2| defaults + if (k2 < 0) then + k2 = 0.933_wp + if (abs(94.-freq) < 3.) k2=0.75_wp + if (abs(35.-freq) < 3.) k2=0.88_wp + if (abs(13.8-freq) < 3.) k2=0.925_wp + endif + + if (qe(1) < -9) then + + ! Get the refractive index of the bulk hydrometeors + if (ice == 0) then + call m_wat(freq,tt,n_r,n_i) + else + call m_ice(freq,tt,n_r,n_i) + endif + m = cmplx(n_r,-n_i) + m0(1:nsizes) = m + + correct_for_rho = 0 + if ((ice == 1) .and. (minval(rho_e) >= 0)) correct_for_rho = 1 + + ! Correct refractive index for ice density if needed + if (correct_for_rho == 1) then + f = rho_e/rhoice + m0 = sqrt((2+(m0*m0)+2*f*((m0*m0)-1))/(2+(m0*m0)+f*(1-(m0*m0)))) + endif + + ! Mie calculations + sizep = (pi*D0)/wl + dqv(1) = 0._wp + do i=1,nsizes + call mieint(sizep(i), m0(i), one, dqv, qext(i), dqsc, qbsca(i), & + dg, xs1, xs2, dph, err) + end do + + else + ! Mie table used + qext = qe + qbsca = qs + endif + + ! eta_mie = 0.25*sum[qbsca*pi*D^2*N(D)*deltaD] + ! <--------- eta_sum ---------> + ! z0_eff = (wl^4/!pi^5)*(1./k2)*eta_mie + eta_sum = 0._wp + if (size(D0) == 1) then + eta_sum = qbsca(1)*(n(1)*1E6)*D0(1)*D0(1) + else + xtemp = qbsca*N0*D0*D0 + call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),eta_sum) + endif + + eta_mie = eta_sum*0.25_wp*pi + const = ((wl*wl*wl*wl)/(pi*pi*pi*pi*pi))*(1._wp/k2) + + z0_eff = const*eta_mie + + ! kr = 0.25*cr*sum[qext*pi*D^2*N(D)*deltaD] + ! <---------- k_sum ---------> + k_sum = 0._wp + if (size(D0) == 1) then + k_sum = qext(1)*(n(1)*1E6)*D0(1)*D0(1) + else + xtemp = qext*N0*D0*D0 + call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),k_sum) + endif + ! DS2014 START: Making this calculation in double precision results in a small + ! amount of very small errors in the COSP output field,dBZE94, + ! so it will be left as is. + !cr = 10._wp/log(10._wp) + cr = 10./log(10.) + ! DS2014 STOP + kr = k_sum*0.25_wp*pi*(1000._wp*cr) + + ! z_ray = sum[D^6*N(D)*deltaD] + if (xr == 1) then + z0_ray = 0._wp + if (size(D0) == 1) then + z0_ray = (n(1)*1E6)*D0(1)*D0(1)*D0(1)*D0(1)*D0(1)*D0(1) + else + xtemp = N0*D0*D0*D0*D0*D0*D0 + call avint(xtemp,D0,nsizes,D0(1),D0(size(D0)),z0_ray) + endif + endif + + ! Convert to mm^6/m^3 + z_eff = z0_eff*1E18 ! 10.*alog10(z0_eff*1E18) + z_ray = z0_ray*1E18 ! 10.*alog10(z0_ray*1E18) + + end subroutine zeff + ! ############################################################################################## + ! ############################################################################################## + function gases(PRES_mb,T,SH,f) + ! ############################################################################################## + ! Purpose: + ! Compute 2-way gaseous attenuation through a volume in microwave + ! + ! Inputs: + ! [PRES_mb] pressure (mb) (hPa) + ! [T] temperature (K) + ! [RH] relative humidity (%) + ! [f] frequency (GHz), < 300 GHz + ! + ! Returns: + ! 2-way gaseous attenuation (dB/km) + ! + ! Reference: + ! Uses method of Liebe (1985) + ! + ! Created: + ! 12/09/05 John Haynes (haynes@atmos.colostate.edu) + ! Modified: + ! 01/31/06 Port from IDL to Fortran 90 + ! 12/19/14 Dustin Swales: Define type REALs as double precision (dustin.swales@noaa.gov) + ! ############################################################################################## + + ! INPUTS + real(wp), intent(in) :: & ! + PRES_mb, & ! Pressure (mb) (hPa) + T, & ! Temperature (K) + SH, & ! Specific humidity + f ! Frequency (GHz), < 300 GHz + + ! PARAMETERS + integer, parameter :: & ! + nbands_o2 = 48, & ! Number of O2 bands + nbands_h2o = 30 ! Number of h2o bands + ! LOCAL VARIABLES + real(wp) :: & + gases, th, e, p, sumo, gm0, a0, ap, term1, & + term2, term3, bf, be, term4, npp,e_th,one_th, & + pth3,eth35,aux1,aux2,aux3, aux4,gm,delt,x,y, & + gm2,fpp_o2,fpp_h2o,s_o2,s_h2o + integer :: i + + ! Table1 parameters v0, a1, a2, a3, a4, a5, a6 + real(wp),dimension(nbands_o2),parameter :: & + v0 = (/49.4523790,49.9622570,50.4742380,50.9877480,51.5033500, & + 52.0214090,52.5423930,53.0669060,53.5957480,54.1299999,54.6711570, & + 55.2213650,55.7838000,56.2647770,56.3378700,56.9681000,57.6124810, & + 58.3238740,58.4465890,59.1642040,59.5909820,60.3060570,60.4347750, & + 61.1505580,61.8001520,62.4112120,62.4862530,62.9979740,63.5685150, & + 64.1277640,64.6789000,65.2240670,65.7647690,66.3020880,66.8368270, & + 67.3695950,67.9008620,68.4310010,68.9603060,69.4890210,70.0173420, & + 118.7503410,368.4983500,424.7631200,487.2493700,715.3931500, & + 773.8387300, 834.1453300/), & + a1 = (/0.0000001,0.0000003,0.0000009,0.0000025,0.0000061,0.0000141, & + 0.0000310,0.0000641,0.0001247,0.0002280,0.0003918,0.0006316,0.0009535, & + 0.0005489,0.0013440,0.0017630,0.0000213,0.0000239,0.0000146,0.0000240, & + 0.0000211,0.0000212,0.0000246,0.0000250,0.0000230,0.0000193,0.0000152, & + 0.0000150,0.0000109,0.0007335,0.0004635,0.0002748,0.0001530,0.0000801, & + 0.0000395,0.0000183,0.0000080,0.0000033,0.0000013,0.0000005,0.0000002, & + 0.0000094,0.0000679,0.0006380,0.0002350,0.0000996,0.0006710,0.0001800/),& + a2 = (/11.8300000,10.7200000,9.6900000,8.8900000,7.7400000,6.8400000, & + 6.0000000,5.2200000,4.4800000,3.8100000,3.1900000,2.6200000,2.1150000, & + 0.0100000,1.6550000,1.2550000,0.9100000,0.6210000,0.0790000,0.3860000, & + 0.2070000,0.2070000,0.3860000,0.6210000,0.9100000,1.2550000,0.0780000, & + 1.6600000,2.1100000,2.6200000,3.1900000,3.8100000,4.4800000,5.2200000, & + 6.0000000,6.8400000,7.7400000,8.6900000,9.6900000,10.7200000,11.8300000,& + 0.0000000,0.0200000,0.0110000,0.0110000,0.0890000,0.0790000,0.0790000/),& + a3 = (/0.0083000,0.0085000,0.0086000,0.0087000,0.0089000,0.0092000, & + 0.0094000,0.0097000,0.0100000,0.0102000,0.0105000,0.0107900,0.0111000, & + 0.0164600,0.0114400,0.0118100,0.0122100,0.0126600,0.0144900,0.0131900, & + 0.0136000,0.0138200,0.0129700,0.0124800,0.0120700,0.0117100,0.0146800, & + 0.0113900,0.0110800,0.0107800,0.0105000,0.0102000,0.0100000,0.0097000, & + 0.0094000,0.0092000,0.0089000,0.0087000,0.0086000,0.0085000,0.0084000, & + 0.0159200,0.0192000,0.0191600,0.0192000,0.0181000,0.0181000,0.0181000/),& + a4 = (/0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & + 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & + 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & + 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & + 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & + 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & + 0.0000000,0.6000000,0.6000000,0.6000000,0.6000000,0.6000000,0.6000000/),& + a5 = (/0.0056000,0.0056000,0.0056000,0.0055000,0.0056000,0.0055000, & + 0.0057000,0.0053000,0.0054000,0.0048000,0.0048000,0.0041700,0.0037500, & + 0.0077400,0.0029700,0.0021200,0.0009400,-0.0005500,0.0059700,-0.0024400,& + 0.0034400,-0.0041300,0.0013200,-0.0003600,-0.0015900,-0.0026600, & + -0.0047700,-0.0033400,-0.0041700,-0.0044800,-0.0051000,-0.0051000, & + -0.0057000,-0.0055000,-0.0059000,-0.0056000,-0.0058000,-0.0057000, & + -0.0056000,-0.0056000,-0.0056000,-0.0004400,0.0000000,0.0000000, & + 0.0000000,0.0000000,0.0000000,0.0000000/), & + a6 = (/1.7000000,1.7000000,1.7000000,1.7000000,1.8000000,1.8000000, & + 1.8000000,1.9000000,1.8000000,2.0000000,1.9000000,2.1000000,2.1000000, & + 0.9000000,2.3000000,2.5000000,3.7000000,-3.1000000,0.8000000,0.1000000, & + 0.5000000,0.7000000,-1.0000000,5.8000000,2.9000000,2.3000000,0.9000000, & + 2.2000000,2.0000000,2.0000000,1.8000000,1.9000000,1.8000000,1.8000000, & + 1.7000000,1.8000000,1.7000000,1.7000000,1.7000000,1.7000000,1.7000000, & + 0.9000000,1.0000000,1.0000000,1.0000000,1.0000000,1.0000000,1.0000000/) + + ! Table2 parameters v1, b1, b2, b3 + real(wp),dimension(nbands_h2o),parameter :: & + v1 = (/22.2350800,67.8139600,119.9959400,183.3101170,321.2256440, & + 325.1529190,336.1870000,380.1973720,390.1345080,437.3466670,439.1508120, & + 443.0182950,448.0010750,470.8889740,474.6891270,488.4911330,503.5685320, & + 504.4826920,556.9360020,620.7008070,658.0065000,752.0332270,841.0735950, & + 859.8650000,899.4070000,902.5550000,906.2055240,916.1715820,970.3150220, & + 987.9267640/), & + b1 = (/0.1090000,0.0011000,0.0007000,2.3000000,0.0464000,1.5400000, & + 0.0010000,11.9000000,0.0044000,0.0637000,0.9210000,0.1940000,10.6000000, & + 0.3300000,1.2800000,0.2530000,0.0374000,0.0125000,510.0000000,5.0900000, & + 0.2740000,250.0000000,0.0130000,0.1330000,0.0550000,0.0380000,0.1830000, & + 8.5600000,9.1600000,138.0000000/), & + b2 = (/2.1430000,8.7300000,8.3470000,0.6530000,6.1560000,1.5150000, & + 9.8020000,1.0180000,7.3180000,5.0150000,3.5610000,5.0150000,1.3700000, & + 3.5610000,2.3420000,2.8140000,6.6930000,6.6930000,0.1140000,2.1500000, & + 7.7670000,0.3360000,8.1130000,7.9890000,7.8450000,8.3600000,5.0390000, & + 1.3690000,1.8420000,0.1780000/), & + b3 = (/0.0278400,0.0276000,0.0270000,0.0283500,0.0214000,0.0270000, & + 0.0265000,0.0276000,0.0190000,0.0137000,0.0164000,0.0144000,0.0238000, & + 0.0182000,0.0198000,0.0249000,0.0115000,0.0119000,0.0300000,0.0223000, & + 0.0300000,0.0286000,0.0141000,0.0286000,0.0286000,0.0264000,0.0234000, & + 0.0253000,0.0240000,0.0286000/) + + ! Conversions + th = 300._wp/T ! unitless + + ! DS2014 START: Using _wp for the exponential in the denominator results in slight errors + ! for dBze94. 0.01 % of values differ, relative range: 1.03e-05 to 1.78e-04 + !e = (RH*th*th*th*th*th)/(41.45_wp*10**(9.834_wp*th-10)) ! kPa + !e = (RH*th*th*th*th*th)/(41.45_wp*10**(9.834_wp*th-10)) ! kPa + e = SH*PRES_mb/(SH+0.622_wp)/1000._wp !kPa + ! DS2014 END + + p = PRES_mb/1000._wp-e ! kPa + e_th = e*th + one_th = 1 - th + pth3 = p*th*th*th + eth35 = e*th**(3.5) + + ! Term1 + sumo = 0._wp + aux1 = 1.1_wp*e_th + do i=1,nbands_o2 + aux2 = f/v0(i) + aux3 = v0(i)-f + aux4 = v0(i)+f + gm = a3(i)*(p*th**(0.8_wp-a4(i))+aux1) + gm2 = gm*gm + delt = a5(i)*p*th**a6(i) + x = aux3*aux3+gm2 + y = aux4*aux4+gm2 + fpp_o2 = (((1._wp/x)+(1._wp/y))*(gm*aux2) - (delt*aux2)*((aux3/(x))-(aux4/(x)))) + s_o2 = a1(i)*pth3*exp(a2(i)*one_th) + sumo = sumo + fpp_o2 * s_o2 + enddo + term1 = sumo + + ! Term2 + gm0 = 5.6E-3_wp*(p+1.1_wp*e)*th**(0.8_wp) + a0 = 3.07E-4_wp + ap = 1.4_wp*(1-1.2_wp*f**(1.5_wp)*1E-5)*1E-10 + term2 = (2*a0*(gm0*(1+(f/gm0)*(f/gm0))*(1+(f/60._wp)**2))**(-1) + ap*p*th**(2.5_wp))*f*p*th*th + + ! Term3 + sumo = 0._wp + aux1 = 4.8_wp*e_th + do i=1,nbands_h2o + aux2 = f/v1(i) + aux3 = v1(i)-f + aux4 = v1(i)+f + gm = b3(i)*(p*th**(0.8)+aux1) + gm2 = gm*gm + x = aux3*aux3+gm2 + y = aux4*aux4+gm2 + fpp_h2o = ((1._wp/x)+(1._wp/y))*(gm*aux2) ! - (delt*aux2)*((aux3/(x))-(aux4/(x))) + s_h2o = b1(i)*eth35*exp(b2(i)*one_th) + sumo = sumo + fpp_h2o * s_h2o + enddo + term3 = sumo + + ! Term4 + bf = 1.4E-6_wp + be = 5.41E-5_wp + term4 = (bf*p+be*e*th*th*th)*f*e*th**(2.5_wp) + + ! Summation and result + npp = term1 + term2 + term3 + term4 + gases = 0.182_wp*f*npp + + end function gases + subroutine hydro_class_init(lsingle,ldouble,sd) + ! ############################################################################################## + ! Purpose: + ! + ! Initialize variables used by the radar simulator. + ! Part of QuickBeam v3.0 by John Haynes and Roj Marchand + ! + ! Inputs: + ! NAME SIZE DESCRIPTION + ! [lsingle] (1) Logical flag to use single moment + ! [ldouble] (1) Logical flag to use two moment + ! Outputs: + ! [sd] Structure that define hydrometeor types + ! + ! Local variables: + ! [n_hydro] (1) Number of hydrometeor types + ! [hclass_type] (nhclass) Type of distribution (see quickbeam documentation) + ! [hclass_phase] (nhclass) 1==ice, 0=liquid + ! [hclass_dmin] (nhclass) Minimum diameter allowed is drop size distribution N(DDmax)=0 + ! [hclass_apm] (nhclass) Density of partical apm*D^bpm or constant = rho + ! [hclass_bpm] (nhclass) Density of partical apm*D^bpm or constant = rho + ! [hclass_rho] (nhclass) Density of partical apm*D^bpm or constant = rho + ! [hclass_p1] (nhclass) Default values of DSD parameters (see quickbeam documentation) + ! [hclass_p2] (nhclass) Default values of DSD parameters (see quickbeam documentation) + ! [hclass_p3] (nhclass) Default values of DSD parameters (see quickbeam documentation) + ! Modified: + ! 08/23/2006 placed into subroutine form (Roger Marchand) + ! June 2010 New interface to support "radar_simulator_params" structure + ! 12/22/2014 Moved radar simulator (CLOUDSAT) configuration initialization to cloudsat_init + ! ############################################################################################## + + ! #################################################################################### + ! NOTES on HCLASS variables + ! + ! TYPE - Set to + ! 1 for modified gamma distribution, + ! 2 for exponential distribution, + ! 3 for power law distribution, + ! 4 for monodisperse distribution, + ! 5 for lognormal distribution. + ! + ! PHASE - Set to 0 for liquid, 1 for ice. + ! DMIN - The minimum drop size for this class (micron), ignored for monodisperse. + ! DMAX - The maximum drop size for this class (micron), ignored for monodisperse. + ! Important note: The settings for DMIN and DMAX are + ! ignored in the current version for all distributions except for power + ! law. Except when the power law distribution is used, particle size + ! is fixed to vary from zero to infinity, a restriction that is expected + ! to be lifted in future versions. A placeholder must still be specified + ! for each. + ! Density of particles is given by apm*D^bpm or a fixed value rho. ONLY specify ONE of these two!! + ! APM - The alpha_m coefficient in equation (1) (kg m**-beta_m ) + ! BPM - The beta_m coefficient in equation (1), see section 4.1. + ! RHO - Hydrometeor density (kg m-3 ). + ! + ! P1, P2, P3 - are default distribution parameters that depend on the type + ! of distribution (see quickmbeam documentation for more information) + ! + ! Modified Gamma (must set P3 and one of P1 or P2) + ! P1 - Set to the total particle number concentration Nt /rho_a (kg-1 ), where + ! rho_a is the density of air in the radar volume. + ! P2 - Set to the particle mean diameter D (micron). + ! P3 - Set to the distribution width nu. + ! + ! Exponetial (set one of) + ! P1 - Set to a constant intercept parameter N0 (m-4). + ! P2 - Set to a constant lambda (micron-1). + ! + ! Power Law + ! P1 - Set this to the value of a constant power law parameter br + ! + ! Monodisperse + ! P1 - Set to a constant diameter D0 (micron) = Re. + ! + ! Log-normal (must set P3 and one of P1 or P2) + ! P1 - Set to the total particle number concentration Nt /rho_a (kg-1 ) + ! P2 - Set to the geometric mean particle radius rg (micron). + ! P3 - Set to the natural logarithm of the geometric standard deviation. + ! #################################################################################### + ! INPUTS + logical,intent(in) :: & + lsingle, & ! True -> use single moment + ldouble ! True -> use two moment + + ! OUTPUTS + type(size_distribution),intent(out) ::& + sd ! + + ! SINGLE MOMENT PARAMETERS + integer,parameter,dimension(N_HYDRO) :: & + ! LSL LSI LSR LSS CVL CVI CVR CVS LSG + HCLASS1_TYPE = (/5, 1, 2, 2, 5, 1, 2, 2, 2/), & ! + HCLASS1_PHASE = (/0, 1, 0, 1, 0, 1, 0, 1, 1/) ! + real(wp),parameter,dimension(N_HYDRO) ::& + ! LSL LSI LSR LSS CVL CVI CVR CVS LSG + HCLASS1_DMIN = (/ -1., -1., -1., -1., -1., -1., -1., -1., -1. /), & + HCLASS1_DMAX = (/ -1., -1., -1., -1., -1., -1., -1., -1., -1. /), & + HCLASS1_APM = (/524., 110.8, 524., -1., 524., 110.8, 524., -1., -1. /), & + HCLASS1_BPM = (/ 3., 2.91, 3., -1., 3., 2.91, 3., -1., -1. /), & + HCLASS1_RHO = (/ -1., -1., -1., 100., -1., -1., -1., 100., 400. /), & + HCLASS1_P1 = (/ -1., -1., 8.e6, 3.e6, -1., -1., 8.e6, 3.e6, 4.e6/), & + HCLASS1_P2 = (/ 6., 40., -1., -1., 6., 40., -1., -1., -1. /), & + HCLASS1_P3 = (/ 0.3, 2., -1., -1., 0.3, 2., -1., -1., -1. /) + + ! TWO MOMENT PARAMETERS + integer,parameter,dimension(N_HYDRO) :: & + ! LSL LSI LSR LSS CVL CVI CVR CVS LSG + HCLASS2_TYPE = (/ 1, 1, 1, 1, 1, 1, 1, 1, 1/), & + HCLASS2_PHASE = (/ 0, 1, 0, 1, 0, 1, 0, 1, 1/) + + real(wp),parameter,dimension(N_HYDRO) :: & + ! LSL LSI LSR LSS CVL CVI CVR CVS LSG + HCLASS2_DMIN = (/ -1, -1, -1, -1, -1, -1, -1, -1, -1/), & + HCLASS2_DMAX = (/ -1, -1, -1, -1, -1, -1, -1, -1, -1/), & + HCLASS2_APM = (/524, -1, 524, -1, 524, -1, 524, -1, -1/), & + HCLASS2_BPM = (/ 3, -1, 3, -1, 3, -1, 3, -1, -1/), & + HCLASS2_RHO = (/ -1, 500, -1, 100, -1, 500, -1, 100, 900/), & + HCLASS2_P1 = (/ -1, -1, -1, -1, -1, -1, -1, -1, -1/), & + HCLASS2_P2 = (/ -1, -1, -1, -1, -1, -1, -1, -1, -1/), & + HCLASS2_P3 = (/ -2, 1, 1, 1, -2, 1, 1, 1, 1/) + + if (lsingle) then + sd%dtype(1:N_HYDRO) = HCLASS1_TYPE(1:N_HYDRO) + sd%phase(1:N_HYDRO) = HCLASS1_PHASE(1:N_HYDRO) + sd%dmin(1:N_HYDRO) = HCLASS1_DMIN(1:N_HYDRO) + sd%dmax(1:N_HYDRO) = HCLASS1_DMAX(1:N_HYDRO) + sd%apm(1:N_HYDRO) = HCLASS1_APM(1:N_HYDRO) + sd%bpm(1:N_HYDRO) = HCLASS1_BPM(1:N_HYDRO) + sd%rho(1:N_HYDRO) = HCLASS1_RHO(1:N_HYDRO) + sd%p1(1:N_HYDRO) = HCLASS1_P1(1:N_HYDRO) + sd%p2(1:N_HYDRO) = HCLASS1_P2(1:N_HYDRO) + sd%p3(1:N_HYDRO) = HCLASS1_P3(1:N_HYDRO) + endif + if (ldouble) then + sd%dtype(1:N_HYDRO) = HCLASS2_TYPE(1:N_HYDRO) + sd%phase(1:N_HYDRO) = HCLASS2_PHASE(1:N_HYDRO) + sd%dmin(1:N_HYDRO) = HCLASS2_DMIN(1:N_HYDRO) + sd%dmax(1:N_HYDRO) = HCLASS2_DMAX(1:N_HYDRO) + sd%apm(1:N_HYDRO) = HCLASS2_APM(1:N_HYDRO) + sd%bpm(1:N_HYDRO) = HCLASS2_BPM(1:N_HYDRO) + sd%rho(1:N_HYDRO) = HCLASS2_RHO(1:N_HYDRO) + sd%p1(1:N_HYDRO) = HCLASS2_P1(1:N_HYDRO) + sd%p2(1:N_HYDRO) = HCLASS2_P2(1:N_HYDRO) + sd%p3(1:N_HYDRO) = HCLASS2_P3(1:N_HYDRO) + endif + end subroutine hydro_class_init +end module mod_quickbeam_optics From 636a12f842d427c0cd824b8c5db0ff387283020a Mon Sep 17 00:00:00 2001 From: yuhi-n Date: Mon, 6 Apr 2026 11:45:44 +0900 Subject: [PATCH 2/3] remove duplicated files --- .gitignore | 1 + dplrw_src/cosp.F90 | 4882 ----------------- dplrw_src/cosp2_io.f90 | 3109 ----------- dplrw_src/cosp2_test.F90 | 2231 -------- dplrw_src/cosp_cloudsat_interface.F90 | 234 - dplrw_src/cosp_config.F90 | 529 -- dplrw_src/cosp_stats.F90 | 793 --- dplrw_src/cosp_utils.F90 | 190 - dplrw_src/quickbeam.F90 | 971 ---- dplrw_src/quickbeam_optics.F90 | 1577 ------ .../COSP2_global-map-checkpoint.ipynb | 260 - .../COSP2_zonal-mean-checkpoint.ipynb | 208 - .../EC_check-checkpoint.ipynb | 582 -- .../MIROC_check-checkpoint.ipynb | 260 - .../dplrw_results-checkpoint.ipynb | 663 --- .../input_check-checkpoint.ipynb | 402 -- driver/src/cosp2_io.f90.bak | 2762 ---------- driver/src/cosp2_test.f90.bak | 2076 ------- src/cosp.F90.bak | 4840 ---------------- src/cosp_config.F90.bak | 500 -- src/cosp_stats.F90.bak | 781 --- src/simulator/cosp_cloudsat_interface.F90.bak | 234 - src/simulator/quickbeam/quickbeam.F90.bak | 605 -- .../optics/cosp_utils.F90.bak | 89 - .../quickbeam_optics/quickbeam_optics.F90.bak | 1381 ----- 25 files changed, 1 insertion(+), 30159 deletions(-) delete mode 100755 dplrw_src/cosp.F90 delete mode 100644 dplrw_src/cosp2_io.f90 delete mode 100755 dplrw_src/cosp2_test.F90 delete mode 100644 dplrw_src/cosp_cloudsat_interface.F90 delete mode 100755 dplrw_src/cosp_config.F90 delete mode 100755 dplrw_src/cosp_stats.F90 delete mode 100755 dplrw_src/cosp_utils.F90 delete mode 100644 dplrw_src/quickbeam.F90 delete mode 100644 dplrw_src/quickbeam_optics.F90 delete mode 100644 driver/check/.ipynb_checkpoints/COSP2_global-map-checkpoint.ipynb delete mode 100644 driver/check/.ipynb_checkpoints/COSP2_zonal-mean-checkpoint.ipynb delete mode 100644 driver/check/.ipynb_checkpoints/EC_check-checkpoint.ipynb delete mode 100644 driver/check/.ipynb_checkpoints/MIROC_check-checkpoint.ipynb delete mode 100644 driver/check/.ipynb_checkpoints/dplrw_results-checkpoint.ipynb delete mode 100644 driver/check/.ipynb_checkpoints/input_check-checkpoint.ipynb delete mode 100644 driver/src/cosp2_io.f90.bak delete mode 100644 driver/src/cosp2_test.f90.bak delete mode 100755 src/cosp.F90.bak delete mode 100755 src/cosp_config.F90.bak delete mode 100755 src/cosp_stats.F90.bak delete mode 100644 src/simulator/cosp_cloudsat_interface.F90.bak delete mode 100644 src/simulator/quickbeam/quickbeam.F90.bak delete mode 100644 subsample_and_optics_example/optics/cosp_utils.F90.bak delete mode 100644 subsample_and_optics_example/optics/quickbeam_optics/quickbeam_optics.F90.bak diff --git a/.gitignore b/.gitignore index 26f4903009..ecba5b62b7 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ **.mod driver/run/cosp2_test driver/data/outputs/UKMO/*.nc +**/.ipynb_checkpoints/ \ No newline at end of file diff --git a/dplrw_src/cosp.F90 b/dplrw_src/cosp.F90 deleted file mode 100755 index c36cb6b15e..0000000000 --- a/dplrw_src/cosp.F90 +++ /dev/null @@ -1,4882 +0,0 @@ -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -! Copyright (c) 2015, Regents of the University of Colorado -! All rights reserved. -! -! Redistribution and use in source and binary forms, with or without modification, are -! permitted provided that the following conditions are met: -! -! 1. Redistributions of source code must retain the above copyright notice, this list of -! conditions and the following disclaimer. -! -! 2. Redistributions in binary form must reproduce the above copyright notice, this list -! of conditions and the following disclaimer in the documentation and/or other -! materials provided with the distribution. -! -! 3. Neither the name of the copyright holder nor the names of its contributors may be -! used to endorse or promote products derived from this software without specific prior -! written permission. -! -! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL -! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT -! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -! -! History: -! May 2015- D. Swales - Original version -! Mar 2018- R. Guzman - Added OPAQ diagnostics and GLID simulator -! Apr 2018- R. Guzman - Added ATLID simulator -! Nov 2018- T. Michibata - Added CloudSat+MODIS Warmrain Diagnostics -! Mar 2024- C. Wall - Added MODIS joint-histogram diagnostics -! -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -MODULE MOD_COSP - USE COSP_KINDS, ONLY: wp - USE MOD_COSP_CONFIG, ONLY: R_UNDEF,PARASOL_NREFL,LIDAR_NCAT,LIDAR_NTYPE, SR_BINS,& - N_HYDRO,numMISRHgtBins, & - cloudsat_DBZE_BINS,LIDAR_NTEMP,calipso_histBsct,& - use_vgrid,Nlvgrid,vgrid_zu,vgrid_zl,vgrid_z,dz, & - WR_NREGIME, CFODD_NCLASS, & - CFODD_NDBZE, CFODD_NICOD, & - numMODISTauBins,numMODISPresBins, & - numMODISReffIceBins,numMODISReffLiqBins, & - numMODISLWPBins,numMODISIWPBins, & - numISCCPTauBins,numISCCPPresBins,numMISRTauBins,& - ntau,modis_histTau,tau_binBounds, & - modis_histTauEdges,tau_binEdges,nCloudsatPrecipClass,& - modis_histTauCenters,tau_binCenters, & - cloudsat_preclvl,grLidar532_histBsct,atlid_histBsct - USE MOD_COSP_MODIS_INTERFACE, ONLY: cosp_modis_init, modis_IN, & - COSP_ASSIGN_modisIN - USE MOD_COSP_RTTOV_INTERFACE, ONLY: cosp_rttov_init, cosp_rttov_simulate - USE MOD_COSP_RTTOV_UTIL, ONLY: rttov_cfg, rttov_output - USE MOD_COSP_MISR_INTERFACE, ONLY: cosp_misr_init, misr_IN, & - COSP_ASSIGN_misrIN, COSP_ASSIGN_misrIN_clean - USE MOD_COSP_ISCCP_INTERFACE, ONLY: cosp_isccp_init, isccp_IN, & - COSP_ASSIGN_isccpIN, COSP_ASSIGN_isccpIN_clean - USE MOD_COSP_CALIPSO_INTERFACE, ONLY: cosp_calipso_init, calipso_IN, & - COSP_ASSIGN_calipsoIN, COSP_ASSIGN_calipsoIN_clean - USE MOD_COSP_ATLID_INTERFACE, ONLY: cosp_atlid_init, atlid_IN, & - COSP_ASSIGN_atlidIN, COSP_ASSIGN_atlidIN_clean - USE MOD_COSP_GRLIDAR532_INTERFACE, ONLY: cosp_grLidar532_init, grLidar532_IN - USE MOD_COSP_PARASOL_INTERFACE, ONLY: cosp_parasol_init, parasol_in, & - COSP_ASSIGN_parasolIN, COSP_ASSIGN_parasolIN_clean - USE MOD_COSP_CLOUDSAT_INTERFACE, ONLY: cosp_cloudsat_init, cloudsat_IN, & - COSP_ASSIGN_cloudsatIN,COSP_ASSIGN_cloudsatIN_clean - USE quickbeam, ONLY: quickbeam_subcolumn, quickbeam_column - USE quickbeam, ONLY: quickbeam_dplrw ! for DPLRW - USE MOD_ICARUS, ONLY: icarus_subcolumn, icarus_column - USE MOD_MISR_SIMULATOR, ONLY: misr_subcolumn, misr_column - USE MOD_LIDAR_SIMULATOR, ONLY: lidar_subcolumn, lidar_column - USE MOD_MODIS_SIM, ONLY: modis_subcolumn, modis_column - USE MOD_PARASOL, ONLY: parasol_subcolumn, parasol_column - USE MOD_COSP_RTTOV, ONLY: rttov_IN - USE MOD_COSP_STATS, ONLY: COSP_LIDAR_ONLY_CLOUD,COSP_CHANGE_VERTICAL_GRID, & - COSP_DIAG_WARMRAIN, COMPUTE_ORBITMASKS, & - cosp_optical_inputs, cosp_column_inputs, & - swath_inputs, radar_cfg - USE COSP_PHYS_CONSTANTS, ONLY: radius_earth - USE COSP_MATH_CONSTANTS, ONLY: pi - - IMPLICIT NONE - - logical :: linitialization ! Initialization flag - - - ! ###################################################################################### - ! TYPE cosp_outputs - ! ###################################################################################### - type cosp_outputs - - ! CALIPSO outputs - real(wp),dimension(:,:,:),pointer :: & - calipso_betaperp_tot => null(), & ! Total backscattered signal - calipso_beta_tot => null(), & ! Total backscattered signal - calipso_lidarcldphase => null(), & ! 3D "lidar" phase cloud fraction - calipso_lidarcldtype => null(), & ! 3D "lidar" OPAQ type fraction - calipso_cldlayerphase => null(), & ! low, mid, high-level lidar phase cloud cover - calipso_lidarcldtmp => null(), & ! 3D "lidar" phase cloud temperature - calipso_cfad_sr => null() ! CFAD of scattering ratio - real(wp), dimension(:,:),pointer :: & - calipso_lidarcld => null(), & ! 3D "lidar" cloud fraction - calipso_cldlayer => null(), & ! low, mid, high-level, total lidar cloud cover - calipso_cldtype => null(), & ! opaque and thin lidar cloud cover + z_opaque altitude - calipso_cldtypetemp => null(), & ! opaque and thin cloud temperature - calipso_cldtypemeanz => null(), & ! opaque and thin cloud altitude - calipso_cldtypemeanzse => null(),& ! same as just above with respect to SE - calipso_beta_mol => null() ! Molecular backscatter - real(wp), dimension(:),pointer :: & - calipso_cldthinemis => null(), & ! thin cloud emissivity - calipso_srbval => null() ! SR bins in cfad_sr - - ! GROUND LIDAR outputs - real(wp),dimension(:,:,:),pointer :: & - grLidar532_beta_tot => null(), & ! Total GROUND LIDAR backscattered signal - grLidar532_cfad_sr => null() ! CFAD of GROUND LIDAR scattering ratio - real(wp), dimension(:,:),pointer :: & - grLidar532_lidarcld => null(), & ! 3D GROUND "lidar" cloud fraction - grLidar532_cldlayer => null(), & ! low, mid, high-level, total GROUND lidar cloud cover - grLidar532_beta_mol => null() ! GROUND LIDAR Molecular backscatter - real(wp), dimension(:),pointer :: & - grLidar532_srbval => null() ! SR bins in cfad_sr - - ! ATLID outputs - real(wp),dimension(:,:,:),pointer :: & - atlid_beta_tot => null(), & ! Total ATLID backscattered signal - atlid_cfad_sr => null() ! CFAD of ATLID scattering ratio - real(wp), dimension(:,:),pointer :: & - atlid_lidarcld => null(), & ! 3D ATLID cloud fraction - atlid_cldlayer => null(), & ! low, mid, high-level, total ATLID cloud cover - atlid_beta_mol => null() ! ATLID Molecular backscatter - real(wp), dimension(:),pointer :: & - atlid_srbval => null() ! SR bins in cfad_sr - - ! PARASOL outputs - real(wp),dimension(:,:,:),pointer :: & - parasolPix_refl => null() ! PARASOL reflectances (subcolumn) - real(wp),dimension(:,:),pointer :: & - parasolGrid_refl => null() ! PARASOOL reflectances (column) - - ! CLOUDSAT outputs - real(wp),dimension(:,:,:),pointer :: & - cloudsat_Ze_tot => null(), & ! Effective reflectivity factor (Npoints,Ncolumns,Nlevels) - cloudsat_cfad_ze => null() ! Ze CFAD(Npoints,dBZe_bins,Nlevels) - real(wp), dimension(:,:),pointer :: & - lidar_only_freq_cloud => null(), & ! (Npoints,Nlevels) - cloudsat_precip_cover => null() ! Radar total cloud amount by CloudSat precip flag (Npoints,dBZe_bins) - real(wp),dimension(:),pointer :: & - cloudsat_tcc => null(), & - cloudsat_tcc2 => null(), & - radar_lidar_tcc => null(), & ! Radar&lidar total cloud amount, grid-box scale (Npoints) - cloudsat_pia => null() ! Radar path integrated attenuation (Npoints) - - ! ISCCP outputs - real(wp),dimension(:),pointer :: & - isccp_totalcldarea => null(), & ! The fraction of model grid box columns with cloud - ! somewhere in them. (%) - isccp_meantb => null(), & ! Mean all-sky 10.5 micron brightness temperature. (K) - isccp_meantbclr => null(), & ! Mean clear-sky 10.5 micron brightness temperature. (K) - isccp_meanptop => null(), & ! Mean cloud top pressure (mb). - isccp_meantaucld => null(), & ! Mean optical thickness. (1) - isccp_meanalbedocld => null() ! Mean cloud albedo. (1) - real(wp),dimension(:,:),pointer ::& - isccp_boxtau => null(), & ! Optical thickness in each column. (1) - isccp_boxptop => null() ! Cloud top pressure in each column. (mb) - real(wp),dimension(:,:,:),pointer :: & - isccp_fq => null() ! The fraction of the model grid box covered by each of - ! the 49 ISCCP D level cloud types. (%) - - ! MISR outputs - real(wp),dimension(:,:,:),pointer :: & ! - misr_fq => null() ! Fraction of the model grid box covered by each of the MISR - ! cloud types - real(wp),dimension(:,:),pointer :: & ! - misr_dist_model_layertops => null() ! - real(wp),dimension(:),pointer :: & ! - misr_meanztop => null(), & ! Mean MISR cloud top height - misr_cldarea => null() ! Mean MISR cloud cover area - - ! MODIS outputs - real(wp),pointer,dimension(:) :: & ! - modis_Cloud_Fraction_Total_Mean => null(), & ! L3 MODIS retrieved cloud fraction (total) - modis_Cloud_Fraction_Water_Mean => null(), & ! L3 MODIS retrieved cloud fraction (liq) - modis_Cloud_Fraction_Ice_Mean => null(), & ! L3 MODIS retrieved cloud fraction (ice) - modis_Cloud_Fraction_High_Mean => null(), & ! L3 MODIS retrieved cloud fraction (high) - modis_Cloud_Fraction_Mid_Mean => null(), & ! L3 MODIS retrieved cloud fraction (middle) - modis_Cloud_Fraction_Low_Mean => null(), & ! L3 MODIS retrieved cloud fraction (low ) - modis_Optical_Thickness_Total_Mean => null(), & ! L3 MODIS retrieved optical thickness (tot) - modis_Optical_Thickness_Water_Mean => null(), & ! L3 MODIS retrieved optical thickness (liq) - modis_Optical_Thickness_Ice_Mean => null(), & ! L3 MODIS retrieved optical thickness (ice) - modis_Optical_Thickness_Total_LogMean => null(), & ! L3 MODIS retrieved log10 optical thickness - modis_Optical_Thickness_Water_LogMean => null(), & ! L3 MODIS retrieved log10 optical thickness - modis_Optical_Thickness_Ice_LogMean => null(), & ! L3 MODIS retrieved log10 optical thickness - modis_Cloud_Particle_Size_Water_Mean => null(), & ! L3 MODIS retrieved particle size (liquid) - modis_Cloud_Particle_Size_Ice_Mean => null(), & ! L3 MODIS retrieved particle size (ice) - modis_Cloud_Top_Pressure_Total_Mean => null(), & ! L3 MODIS retrieved cloud top pressure - modis_Liquid_Water_Path_Mean => null(), & ! L3 MODIS retrieved liquid water path - modis_Ice_Water_Path_Mean => null() ! L3 MODIS retrieved ice water path - real(wp),pointer,dimension(:,:,:) :: & - modis_Optical_Thickness_vs_Cloud_Top_Pressure => null(), & ! Tau/Pressure joint histogram - modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq => null(), & ! Tau/Pressure Liq joint histogram - modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice => null(), & ! Tau/Pressure Ice joint histogram - modis_Optical_Thickness_vs_ReffICE => null(), & ! Tau/ReffICE joint histogram - modis_Optical_Thickness_vs_ReffLIQ => null(), & ! Tau/ReffLIQ joint histogram - modis_LWP_vs_ReffLIQ => null(), & ! LWP/ReffLIQ joint histogram - modis_IWP_vs_ReffICE => null() ! IWP/ReffICE joint histogram - - ! Joint CloudSat+MODIS simulators outputs - real(wp),dimension(:,:,:,:),pointer :: & - cfodd_ntotal => null() ! # of CFODD (Npoints,CFODD_NDBZE,CFODD_NICOD,CFODD_NCLASS) - real(wp),dimension(:,:), pointer :: & - wr_occfreq_ntotal => null() ! # of nonprecip/drizzle/precip (Npoints,WR_NREGIME) - - ! RTTOV outputs - integer :: & - Ninst_rttov - type(rttov_output),dimension(:),allocatable :: & - rttov_outputs - - ! Doppler capability of radar (CloudSat/QuickBeam) - real(wp),dimension(:,:,:,:),pointer :: & - dplrw_Z => null(), spwid_Z => null(), Zef94_Z => null(), & - dplrw_T => null(), spwid_T => null(), Zef94_T => null(), & - ZefVd_2 => null(), & - gridw_Z => null(), gridw_T => null() - real(wp),dimension(:,:,:,:,:),pointer :: & - vfall_Z => null(), vfall_T => null(), ZefVf_2 => null() - real(wp),dimension(:,:),pointer :: & - gcumw => null() - - end type cosp_outputs - -CONTAINS - ! ###################################################################################### - ! FUNCTION cosp_simulator - ! ###################################################################################### - function COSP_SIMULATOR(cospIN,cospgridIN,cospOUT,start_idx,stop_idx,debug) - type(cosp_optical_inputs),intent(in),target :: cospIN ! Optical inputs to COSP simulator - type(cosp_column_inputs), intent(in),target :: cospgridIN ! Host model inputs to COSP - - ! Inputs into the simulators - type(isccp_IN) :: isccpIN ! Input to the ISCCP simulator - type(misr_IN) :: misrIN ! Input to the LIDAR simulator - type(calipso_IN) :: calipsoIN ! Input to the LIDAR simulator - type(grLidar532_IN) :: grLidar532IN ! Input to the GROUND LIDAR simulator - type(atlid_IN) :: atlidIN ! Input to the ATLID simulator - type(parasol_IN) :: parasolIN ! Input to the PARASOL simulator - type(cloudsat_IN) :: cloudsatIN ! Input to the CLOUDSAT radar simulator - type(modis_IN) :: modisIN ! Input to the MODIS simulator - type(rttov_IN) :: rttovIN ! Input to the RTTOV simulator - - ! Outputs from the simulators (nested simulator output structure) - type(cosp_outputs), intent(inout) :: cospOUT - - integer,optional :: start_idx,stop_idx - logical,optional :: debug - - character(len=256),dimension(100) :: cosp_simulator - - ! Local variables - integer :: & - i,icol,ij,ik,nError - integer :: k - integer,target :: & - Npoints - logical :: & - Lisccp_subcolumn, & ! On/Off switch for subcolumn ISCCP simulator - Lmisr_subcolumn, & ! On/Off switch for subcolumn MISR simulator - Lcalipso_subcolumn, & ! On/Off switch for subcolumn CALIPSO simulator - LgrLidar532_subcolumn,& ! On/Off switch for subcolumn GROUND LIDAR simulator - Latlid_subcolumn, & ! On/Off switch for subcolumn ATLID simulator - Lparasol_subcolumn, & ! On/Off switch for subcolumn PARASOL simulator - Lcloudsat_subcolumn, & ! On/Off switch for subcolumn CLOUDSAT simulator - Lmodis_subcolumn, & ! On/Off switch for subcolumn MODIS simulator - Lisccp_column, & ! On/Off switch for column ISCCP simulator - Lmisr_column, & ! On/Off switch for column MISR simulator - Lcalipso_column, & ! On/Off switch for column CALIPSO simulator - LgrLidar532_column, & ! On/Off switch for column GROUND LIDAR simulator - Latlid_column, & ! On/Off switch for column ATLID simulator - Lparasol_column, & ! On/Off switch for column PARASOL simulator - Lcloudsat_column, & ! On/Off switch for column CLOUDSAT simulator - Lmodis_column, & ! On/Off switch for column MODIS simulator - Lrttov_column, & ! On/Off switch for column RTTOV simulator - Lradar_lidar_tcc, & ! On/Off switch from joint Calipso/Cloudsat product - Lcloudsat_tcc, & ! - Lcloudsat_tcc2, & ! - Llidar_only_freq_cloud, & ! On/Off switch from joint Calipso/Cloudsat product - Lcloudsat_modis_wr, & ! On/Off switch from joint CloudSat/MODIS warm rain product - Ldplrw ! On/Off switch from Doppler capability of CLOUDSAT simulator - logical :: & - ok_lidar_cfad = .false., & - ok_lidar_cfad_grLidar532 = .false., & - ok_lidar_cfad_atlid = .false., & - verbose = .false. - integer, dimension(:,:),allocatable :: & - modisRetrievedPhase,isccpLEVMATCH - real(wp), dimension(:), allocatable :: & - modisCfTotal,modisCfLiquid,modisMeanIceWaterPath, isccp_meantbclr, & - modisCfIce, modisCfHigh, modisCfMid, modisCfLow,modisMeanTauTotal, & - modisMeanTauLiquid, modisMeanTauIce, modisMeanLogTauTotal, & - modisMeanLogTauLiquid, modisMeanLogTauIce, modisMeanSizeLiquid, & - modisMeanSizeIce, modisMeanCloudTopPressure, modisMeanLiquidWaterPath, & - radar_lidar_tcc, cloudsat_tcc, cloudsat_tcc2 - REAL(WP), dimension(:,:),allocatable :: & - modisRetrievedCloudTopPressure,modisRetrievedTau,modisRetrievedSize, & - misr_boxtau,misr_boxztop,misr_dist_model_layertops,isccp_boxtau, & - isccp_boxttop,isccp_boxptop,calipso_beta_mol,lidar_only_freq_cloud, & - grLidar532_beta_mol,atlid_beta_mol, & - rttov_bt_total,rttov_bt_clear, & ! RTTOV brightness temps - rttov_rad_total,rttov_rad_clear,rttov_rad_cloudy, & ! RTTOV radiances - rttov_refl_total,rttov_refl_clear ! RTTOV reflectances - REAL(WP), dimension(:,:,:),allocatable :: & - modisJointHistogram,modisJointHistogramIce,modisJointHistogramLiq, & - modisJointHistogram_CtpCodLiq,modisJointHistogram_CtpCodIce, & - modisJointHistogram_LwpRefLiq,modisJointHistogram_IwpRefIce, & - calipso_beta_tot,calipso_betaperp_tot, cloudsatDBZe,parasolPix_refl, & - grLidar532_beta_tot,atlid_beta_tot,cloudsatZe_non - real(wp),dimension(:),allocatable,target :: & - out1D_1,out1D_2,out1D_3,out1D_4,out1D_5,out1D_6,out1D_7,out1D_8, & - out1D_9,out1D_10,out1D_11,out1D_12 - real(wp),dimension(:,:,:),allocatable :: & - betamol_in,betamoli,pnormi,ze_toti - real(wp),dimension(:,:,:),allocatable :: & - t_in,tempI,frac_outI ! subscript "I": vertical interpolation (use_vgrid=.true.) - real(wp), allocatable :: & - zlev (:,:), & ! altitude (used only when use_vgrid=.true.) - cfodd_ntotal (:,:,:,:), & ! # of total samples for CFODD (Npoints,CFODD_NDBZE,CFODD_NICOD,CFODD_NCLASS) - wr_occfreq_ntotal(:,:) ! # of warm-rain (nonprecip/drizzle/precip) (Npoints,WR_NREGIME) - - ! Fields used in orbit swathing of gridcells. - logical,dimension(:),allocatable :: & ! Mask of reals over all local times - CSCAL_SWATH_MASK, & ! Needed for MODIS CSCAL - MODIS_SWATH_MASK ! Needed for MODIS CSCAL + normal MODIS - integer,dimension(:),allocatable :: & ! Arrays containing the indices of the swath masks - ISCCP_MASK_INDICES, & - MISR_MASK_INDICES, & - CSCAL_MASK_INDICES, & - PARASOL_MASK_INDICES, & - ATLID_MASK_INDICES, & - MODIS_CSCAL_MASK_INDICES - integer :: j - ! ISCCP swathing variables - real(wp),dimension(:),target,allocatable :: & - temp_isccp_meanalbedocld, & - temp_isccp_meanptop, & - temp_isccp_meantaucld, & - temp_isccp_totalcldarea, & - temp_isccp_meantb - real(wp),dimension(:,:,:),target,allocatable :: & - temp_isccp_fq - ! MISR swathing variables - real(wp),dimension(:),target,allocatable :: & - temp_misr_cldarea, & - temp_misr_meanztop - real(wp),dimension(:,:,:),target,allocatable :: & - temp_misr_fq - ! CALIPSO swathing variables - real(wp),dimension(:),target,allocatable :: & - temp_calipso_cldthinemis - real(wp),dimension(:,:),target,allocatable :: & - temp_calipso_lidarcld, & - temp_calipso_cldlayer, & - temp_calipso_cldtype, & - temp_calipso_cldtypetemp, & - temp_calipso_cldtypemeanz,& - temp_calipso_cldtypemeanzse - real(wp),dimension(:,:,:),target,allocatable :: & - temp_calipso_cfad_sr, & - temp_calipso_lidarcldphase, & - temp_calipso_lidarcldtype, & - temp_calipso_cldlayerphase, & - temp_calipso_lidarcldtmp - ! ATLID swathing variables - real(wp),dimension(:,:),target,allocatable :: & - temp_atlid_lidarcld, & - temp_atlid_cldlayer - real(wp),dimension(:,:,:),target,allocatable :: & - temp_atlid_cfad_sr - ! PARASOL swathing variables - real(wp),dimension(:,:),target,allocatable :: & - temp_parasolGrid_refl - ! CLOUDSAT swathing variables - real(wp),dimension(:),target,allocatable :: & - temp_cloudsat_pia - real(wp),dimension(:,:),target,allocatable :: & - temp_cloudsat_precip_cover - real(wp),dimension(:,:,:),target,allocatable :: & - temp_cloudsat_cfad_ze - ! MODIS swathing variables. - real(wp),dimension(:,:),allocatable :: & - modis_boxptop, & - modis_boxttop, & - modis_boxtau - integer,dimension(:,:),allocatable :: & - modisLEVMATCH - real(wp),dimension(:),target,allocatable :: & - modis_meantbclr - - ! Initialize error reporting for output - cosp_simulator(:)='' - if (present(debug)) verbose = debug - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! 1) Determine if using full inputs or subset - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (present(start_idx) .and. present(stop_idx)) then - ij=start_idx - ik=stop_idx - else - ij=1 - ik=cospIN%Npoints - endif - Npoints = ik-ij+1 - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! 2a) Determine which simulators to run and which statistics to compute - ! - If any of the subcolumn fields are allocated, then run the subcolumn simulators. - ! - If any of the column fields are allocated, then compute the statistics for that - ! simulator, but only save the requested fields. - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Start with all simulators and joint-diagnostics off - Lisccp_subcolumn = .false. - Lmisr_subcolumn = .false. - Lcalipso_subcolumn = .false. - LgrLidar532_subcolumn = .false. - Latlid_subcolumn = .false. - Lparasol_subcolumn = .false. - Lcloudsat_subcolumn = .false. - Lmodis_subcolumn = .false. - Lisccp_column = .false. - Lmisr_column = .false. - Lcalipso_column = .false. - LgrLidar532_column = .false. - Latlid_column = .false. - Lparasol_column = .false. - Lcloudsat_column = .false. - Lmodis_column = .false. - Lrttov_column = .false. - Lradar_lidar_tcc = .false. - Llidar_only_freq_cloud = .false. - Lcloudsat_tcc = .false. - Lcloudsat_tcc2 = .false. - Lcloudsat_modis_wr = .false. - - ! CLOUDSAT subcolumn - if (associated(cospOUT%cloudsat_Ze_tot)) Lcloudsat_subcolumn = .true. - - ! MODIS subcolumn - if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean) .or. & - associated(cospOUT%modis_Cloud_Fraction_Total_Mean) .or. & - associated(cospOUT%modis_Cloud_Fraction_Ice_Mean) .or. & - associated(cospOUT%modis_Cloud_Fraction_High_Mean) .or. & - associated(cospOUT%modis_Cloud_Fraction_Mid_Mean) .or. & - associated(cospOUT%modis_Cloud_Fraction_Low_Mean) .or. & - associated(cospOUT%modis_Optical_Thickness_Total_Mean) .or. & - associated(cospOUT%modis_Optical_Thickness_Water_Mean) .or. & - associated(cospOUT%modis_Optical_Thickness_Ice_Mean) .or. & - associated(cospOUT%modis_Optical_Thickness_Total_LogMean) .or. & - associated(cospOUT%modis_Optical_Thickness_Water_LogMean) .or. & - associated(cospOUT%modis_Optical_Thickness_Ice_LogMean) .or. & - associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean) .or. & - associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean) .or. & - associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean) .or. & - associated(cospOUT%modis_Liquid_Water_Path_Mean) .or. & - associated(cospOUT%modis_Ice_Water_Path_Mean) .or. & - associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure) .or. & - associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq) .or. & - associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & - Lmodis_subcolumn = .true. - - ! ISCCP subcolumn - if (associated(cospOUT%isccp_boxtau) .or. & - associated(cospOUT%isccp_boxptop)) & - Lisccp_subcolumn = .true. - - ! MISR subcolumn - if (associated(cospOUT%misr_dist_model_layertops)) & - Lmisr_subcolumn = .true. - - ! CALIPOSO subcolumn - if (associated(cospOUT%calipso_beta_mol) .or. & - associated(cospOUT%calipso_betaperp_tot) .or. & - associated(cospOUT%calipso_beta_tot)) & - Lcalipso_subcolumn = .true. - - ! GROUND LIDAR subcolumn - if (associated(cospOUT%grLidar532_beta_mol) .or. & - associated(cospOUT%grLidar532_beta_tot)) & - LgrLidar532_subcolumn = .true. - - ! ATLID subcolumn - if (associated(cospOUT%atlid_beta_mol) .or. & - associated(cospOUT%atlid_beta_tot)) & - Latlid_subcolumn = .true. - - ! PARASOL subcolumn - if (associated(cospOUT%parasolPix_refl)) & - Lparasol_subcolumn = .true. - - ! RTTOV Column - if (allocated(cospOUT%rttov_outputs)) then - Lrttov_column = .true. - endif - - ! ISCCP column - if (associated(cospOUT%isccp_fq) .or. & - associated(cospOUT%isccp_meanalbedocld) .or. & - associated(cospOUT%isccp_meanptop) .or. & - associated(cospOUT%isccp_meantaucld) .or. & - associated(cospOUT%isccp_totalcldarea) .or. & - associated(cospOUT%isccp_meantb)) then - Lisccp_column = .true. - Lisccp_subcolumn = .true. - endif - - ! MISR column - if (associated(cospOUT%misr_cldarea) .or. & - associated(cospOUT%misr_meanztop) .or. & - associated(cospOUT%misr_fq)) then - Lmisr_column = .true. - Lmisr_subcolumn = .true. - endif - - ! CALIPSO column - if (associated(cospOUT%calipso_cfad_sr) .or. & - associated(cospOUT%calipso_lidarcld) .or. & - associated(cospOUT%calipso_lidarcldphase) .or. & - associated(cospOUT%calipso_lidarcldtype) .or. & - associated(cospOUT%calipso_cldlayer) .or. & - associated(cospOUT%calipso_cldtype) .or. & - associated(cospOUT%calipso_cldtypetemp) .or. & - associated(cospOUT%calipso_cldtypemeanz) .or. & - associated(cospOUT%calipso_cldtypemeanzse) .or. & - associated(cospOUT%calipso_cldthinemis) .or. & - associated(cospOUT%calipso_cldlayerphase) .or. & - associated(cospOUT%calipso_lidarcldtmp)) then - Lcalipso_column = .true. - Lcalipso_subcolumn = .true. - endif - - ! GROUND LIDAR column - if (associated(cospOUT%grLidar532_cfad_sr) .or. & - associated(cospOUT%grLidar532_lidarcld) .or. & - associated(cospOUT%grLidar532_cldlayer)) then - LgrLidar532_column = .true. - LgrLidar532_subcolumn = .true. - endif - - ! ATLID column - if (associated(cospOUT%atlid_cfad_sr) .or. & - associated(cospOUT%atlid_lidarcld) .or. & - associated(cospOUT%atlid_cldlayer)) then - Latlid_column = .true. - Latlid_subcolumn = .true. - endif - - ! PARASOL column - if (associated(cospOUT%parasolGrid_refl)) then - Lparasol_column = .true. - Lparasol_subcolumn = .true. - endif - - ! CLOUDSAT column - if (associated(cospOUT%cloudsat_cfad_ze)) then - Lcloudsat_column = .true. - Lcloudsat_subcolumn = .true. - endif - - ! MODIS column - if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean) .or. & - associated(cospOUT%modis_Cloud_Fraction_Water_Mean) .or. & - associated(cospOUT%modis_Cloud_Fraction_Ice_Mean) .or. & - associated(cospOUT%modis_Cloud_Fraction_High_Mean) .or. & - associated(cospOUT%modis_Cloud_Fraction_Mid_Mean) .or. & - associated(cospOUT%modis_Cloud_Fraction_Low_Mean) .or. & - associated(cospOUT%modis_Optical_Thickness_Total_Mean) .or. & - associated(cospOUT%modis_Optical_Thickness_Water_Mean) .or. & - associated(cospOUT%modis_Optical_Thickness_Ice_Mean) .or. & - associated(cospOUT%modis_Optical_Thickness_Total_LogMean) .or. & - associated(cospOUT%modis_Optical_Thickness_Water_LogMean) .or. & - associated(cospOUT%modis_Optical_Thickness_Ice_LogMean) .or. & - associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean) .or. & - associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean) .or. & - associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean) .or. & - associated(cospOUT%modis_Liquid_Water_Path_Mean) .or. & - associated(cospOUT%modis_Ice_Water_Path_Mean) .or. & - associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure) .or. & - associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq) .or. & - associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) then - Lmodis_column = .true. - Lmodis_subcolumn = .true. - endif - - ! Joint simulator products - if (associated(cospOUT%lidar_only_freq_cloud) .or. associated(cospOUT%radar_lidar_tcc) .or. & - associated(cospOUT%cloudsat_tcc) .or. associated(cospOUT%cloudsat_tcc2)) then - Lcalipso_column = .true. - Lcalipso_subcolumn = .true. - Lcloudsat_column = .true. - Lcloudsat_subcolumn = .true. - Lradar_lidar_tcc = .true. - Llidar_only_freq_cloud = .true. - Lcloudsat_tcc = .true. - Lcloudsat_tcc2 = .true. - endif - - ! CloudSat+MODIS joint simulator product - if ( associated(cospOUT%cfodd_ntotal) .or. associated(cospOUT%wr_occfreq_ntotal) ) then - Lmodis_column = .true. - Lmodis_subcolumn = .true. - Lcloudsat_column = .true. - Lcloudsat_subcolumn = .true. - Lcloudsat_modis_wr = .true. ! WR: warm rain product - endif - - ! for DPLRW - if (associated(cospOUT%dplrw_Z)) then - Ldplrw = .true. - Lcloudsat_subcolumn = .true. - end if - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! 2b) Error Checking - ! Enforce bounds on input fields. If input field is out-of-bounds, report error - ! and turn off simulator - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - call cosp_errorCheck(cospgridIN, cospIN, Lisccp_subcolumn, Lisccp_column, & - Lmisr_subcolumn, Lmisr_column, Lmodis_subcolumn, Lmodis_column, & - Lcloudsat_subcolumn, Lcloudsat_column, Lcalipso_subcolumn, Lcalipso_column, & - Latlid_subcolumn, Latlid_column, LgrLidar532_subcolumn, LgrLidar532_column, & - Lrttov_column, Lparasol_subcolumn, Lparasol_column, & - Lradar_lidar_tcc, Llidar_only_freq_cloud, Lcloudsat_tcc,Lcloudsat_tcc2, & - Lcloudsat_modis_wr, cospOUT, cosp_simulator, nError) - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! 3) Populate instrument simulator inputs - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - ! Indexing order for "cospIN % cospswathsIN" is ISCCP, MISR, CLOUDSAT-CALIPSO, ATLID, PARASOL, MODIS - if (Lisccp_subcolumn .or. Lmodis_subcolumn) then - call COSP_ASSIGN_isccpIN(cospIN,cospgridIN,Npoints,isccpIN,ISCCP_MASK_INDICES) !COSP_ASSIGN_isccpIN - endif - - if (Lmisr_subcolumn) then - call COSP_ASSIGN_misrIN(cospIN,cospgridIN,Npoints,misrIN,MISR_MASK_INDICES) - endif - - if (Lcalipso_subcolumn) then - call COSP_ASSIGN_calipsoIN(cospIN,cospgridIN,Npoints,calipsoIN,CSCAL_MASK_INDICES,CSCAL_SWATH_MASK) - endif - - if (LgrLidar532_subcolumn) then - grLidar532IN%Npoints => Npoints - grLidar532IN%Ncolumns => cospIN%Ncolumns - grLidar532IN%Nlevels => cospIN%Nlevels - grLidar532IN%beta_mol => cospIN%beta_mol_grLidar532 - grLidar532IN%betatot => cospIN%betatot_grLidar532 - grLidar532IN%tau_mol => cospIN%tau_mol_grLidar532 - grLidar532IN%tautot => cospIN%tautot_grLidar532 - endif - - if (Latlid_subcolumn) then - call COSP_ASSIGN_atlidIN(cospIN,cospgridIN,Npoints,atlidIN,ATLID_MASK_INDICES) - endif - - if (Lparasol_subcolumn) then - call COSP_ASSIGN_parasolIN(cospIN,cospgridIN,Npoints,parasolIN,PARASOL_MASK_INDICES) - endif - - if (Lcloudsat_subcolumn) then - call COSP_ASSIGN_cloudsatIN(cospIN,cospgridIN,Npoints,cloudsatIN,CSCAL_MASK_INDICES,CSCAL_SWATH_MASK) - endif - - if (Lmodis_subcolumn) then - call COSP_ASSIGN_modisIN(cospIN,cospgridIN,Npoints,modisIN,CSCAL_SWATH_MASK,MODIS_CSCAL_MASK_INDICES) - endif - - if (Lrttov_column) then - rttovIN%nPoints => Npoints - rttovIN%nLevels => cospIN%nLevels ! This is actually "nlayers" in the RTTOV sense - rttovIN%nSubCols => cospIN%nColumns - rttovIN%co2 => cospgridIN%co2 - rttovIN%ch4 => cospgridIN%ch4 - rttovIN%n2o => cospgridIN%n2o - rttovIN%co => cospgridIN%co - rttovIN%h_surf => cospgridIN%surfelev - rttovIN%u_surf => cospgridIN%u_sfc - rttovIN%v_surf => cospgridIN%v_sfc - rttovIN%t_skin => cospgridIN%skt - rttovIN%p_surf => cospgridIN%psfc ! Lower boundary of lowest layer may not be the surface. - if (associated(cospIN%emis_grey)) rttovIN%emis_grey => cospIN%emis_grey -! rttovIN%surfem => cospgridIN%emis_in -! rttovIN%refl_in => cospgridIN%refl_in - if (allocated(cospgridIN%q2m)) then - rttovIN%q2m => cospgridIN%q2m(:) - else - rttovIN%q2m => cospgridIN%qv(:,cospIN%Nlevels) - end if - if (allocated(cospgridIN%t2m)) then - rttovIN%t2m => cospgridIN%t2m(:) - else - rttovIN%t2m => cospgridIN%at(:,cospIN%Nlevels) - end if - rttovIN%sfcmask => cospgridIN%rttov_sfcmask - rttovIN%latitude => cospgridIN%lat - rttovIN%longitude => cospgridIN%lon - rttovIN%p => cospgridIN%pfull - rttovIN%ph => cospgridIN%phalf - rttovIN%t => cospgridIN%at - rttovIN%q => cospgridIN%qv - rttovIN%o3 => cospgridIN%o3 - ! Below only needed for all-sky RTTOV calculation - rttovIN%rttov_date => cospgridIN%rttov_date - rttovIN%rttov_time => cospgridIN%rttov_time - rttovIN%sza => cospgridIN%sza - rttovIN%tca => cospgridIN%tca - rttovIN%cldLiq => cospgridIN%cloudLiq - rttovIN%cldIce => cospgridIN%cloudIce - rttovIN%DeffLiq => cospgridIN%DeffLiq - rttovIN%DeffIce => cospgridIN%DeffIce - rttovIN%fl_rain => cospgridIN%fl_rain ! Keep in case of RTTOV-SCATT implementation. - rttovIN%fl_snow => cospgridIN%fl_snow ! Keep in case of RTTOV-SCATT implementation. - endif - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! 4) Call subcolumn simulators - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - ! ISCCP (icarus) subcolumn simulator - if (Lisccp_subcolumn .or. Lmodis_subcolumn) then - if (isccpIN%Npoints .gt. 0) then - allocate(isccpLEVMATCH(isccpIN%Npoints,isccpIN%Ncolumns), & - isccp_boxttop(isccpIN%Npoints,isccpIN%Ncolumns), & - isccp_boxptop(isccpIN%Npoints,isccpIN%Ncolumns), & - isccp_boxtau(isccpIN%Npoints,isccpIN%Ncolumns), & - isccp_meantbclr(isccpIN%Npoints)) - ! Call simulator - call icarus_subcolumn(isccpIN%npoints,isccpIN%ncolumns,isccpIN%nlevels, & - isccpIN%sunlit,isccpIN%dtau,isccpIN%dem,isccpIN%skt, & - isccpIN%emsfc_lw,isccpIN%qv,isccpIN%at,isccpIN%pfull, & - isccpIN%phalf,isccpIN%frac_out,isccpLEVMATCH, & - isccp_boxtau(:,:),isccp_boxptop(:,:), & - isccp_boxttop(:,:),isccp_meantbclr(:)) - if (cospIN % cospswathsIN(1) % N_inst_swaths .gt. 0) then - ! Decode outputs from swaths when reading into cospOUT fields - cospOUT%isccp_boxtau(ij:ik,:) = R_UNDEF - cospOUT%isccp_boxptop(ij:ik,:) = R_UNDEF - cospOUT%isccp_meantbclr(ij:ik) = R_UNDEF - if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(ij+int(ISCCP_MASK_INDICES)-1,:) = isccp_boxtau(:,:) - if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(ij+int(ISCCP_MASK_INDICES)-1,:) = isccp_boxptop(:,:) - if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(ij+int(ISCCP_MASK_INDICES)-1) = isccp_meantbclr(:) - else - if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(ij:ik,:) = isccp_boxtau - if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(ij:ik,:) = isccp_boxptop - if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(ij:ik) = isccp_meantbclr - end if - else - cospOUT%isccp_boxtau(ij:ik,:) = R_UNDEF - cospOUT%isccp_boxptop(ij:ik,:) = R_UNDEF - cospOUT%isccp_meantbclr(ij:ik) = R_UNDEF - end if - end if - - ! MISR subcolumn simulator - if (Lmisr_subcolumn) then - if (misrIN%Npoints .gt. 0) then - ! Allocate space for local variables. - allocate(misr_boxztop(misrIN%Npoints,misrIN%Ncolumns), & - misr_boxtau(misrIN%Npoints,misrIN%Ncolumns), & - misr_dist_model_layertops(misrIN%Npoints,numMISRHgtBins)) - ! Call simulator - call misr_subcolumn(misrIN%Npoints,misrIN%Ncolumns,misrIN%Nlevels,misrIN%dtau, & - misrIN%zfull,misrIN%at,misrIN%sunlit,misr_boxtau, & - misr_dist_model_layertops,misr_boxztop) - if (cospIN % cospswathsIN(2) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - ! Decode outputs from swaths when reading into cospOUT fields - cospOUT%misr_dist_model_layertops(ij:ik,:) = R_UNDEF - if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(ij+int(MISR_MASK_INDICES)-1,:) = misr_dist_model_layertops(:,:) - else - if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(ij:ik,:) = misr_dist_model_layertops - end if - else - cospOUT%misr_dist_model_layertops(ij:ik,:) = R_UNDEF - end if - end if - - ! Calipso subcolumn simulator - if (Lcalipso_subcolumn) then - if (calipsoIN%Npoints .gt. 0) then - ! Allocate space for local variables - allocate(calipso_beta_mol(calipsoIN%Npoints,calipsoIN%Nlevels), & - calipso_beta_tot(calipsoIN%Npoints,calipsoIN%Ncolumns,calipsoIN%Nlevels),& - calipso_betaperp_tot(calipsoIN%Npoints,calipsoIN%Ncolumns,calipsoIN%Nlevels)) - ! Call simulator - call lidar_subcolumn(calipsoIN%npoints, calipsoIN%ncolumns, calipsoIN%nlevels, .false., & - calipsoIN%beta_mol, calipsoIN%tau_mol, calipsoIN%betatot, calipsoIN%tautot, & - calipso_beta_mol(:,:), calipso_beta_tot(:,:,:), calipsoIN%betatot_ice, & - calipsoIN%tautot_ice, calipsoIN%betatot_liq, calipsoIN%tautot_liq, & - calipso_betaperp_tot(:,:,:)) - if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - ! Decode outputs from swaths when reading into cospOUT fields - cospOUT%calipso_beta_mol(ij:ik,:) = R_UNDEF - cospOUT%calipso_beta_tot(ij:ik,:,:) = R_UNDEF - cospOUT%calipso_betaperp_tot(ij:ik,:,:) = R_UNDEF - if (associated(cospOUT%calipso_beta_mol)) cospOUT%calipso_beta_mol(ij+int(CSCAL_MASK_INDICES)-1,calipsoIN%Nlevels:1:-1) = calipso_beta_mol(:,:) - if (associated(cospOUT%calipso_beta_tot)) cospOUT%calipso_beta_tot(ij+int(CSCAL_MASK_INDICES)-1,:,calipsoIN%Nlevels:1:-1) = calipso_beta_tot(:,:,:) - if (associated(cospOUT%calipso_betaperp_tot)) cospOUT%calipso_betaperp_tot(ij+int(CSCAL_MASK_INDICES)-1,:,:) = calipso_betaperp_tot(:,:,:) - else ! Proceed normally - ! Store output (if requested) - if (associated(cospOUT%calipso_beta_mol)) cospOUT%calipso_beta_mol(ij:ik,calipsoIN%Nlevels:1:-1) = calipso_beta_mol - if (associated(cospOUT%calipso_beta_tot)) cospOUT%calipso_beta_tot(ij:ik,:,calipsoIN%Nlevels:1:-1) = calipso_beta_tot - if (associated(cospOUT%calipso_betaperp_tot)) cospOUT%calipso_betaperp_tot(ij:ik,:,:) = calipso_betaperp_tot - endif - else - cospOUT%calipso_beta_mol(ij:ik,:) = R_UNDEF - cospOUT%calipso_beta_tot(ij:ik,:,:) = R_UNDEF - cospOUT%calipso_betaperp_tot(ij:ik,:,:) = R_UNDEF - endif - endif - - ! GROUND LIDAR subcolumn simulator - if (LgrLidar532_subcolumn) then - ! Allocate space for local variables - allocate(grLidar532_beta_mol(grLidar532IN%Npoints,grLidar532IN%Nlevels), & - grLidar532_beta_tot(grLidar532IN%Npoints,grLidar532IN%Ncolumns,grLidar532IN%Nlevels)) - ! Call simulator - call lidar_subcolumn(grLidar532IN%npoints, grLidar532IN%ncolumns, grLidar532IN%nlevels,& - .true., grLidar532IN%beta_mol, grLidar532IN%tau_mol, grLidar532IN%betatot,& - grLidar532IN%tautot, grLidar532_beta_mol(:,:), grLidar532_beta_tot(:,:,:)) - ! Store output (if requested) - if (associated(cospOUT%grLidar532_beta_mol)) & - cospOUT%grLidar532_beta_mol(ij:ik,grLidar532IN%Nlevels:1:-1) = grLidar532_beta_mol - if (associated(cospOUT%grLidar532_beta_tot)) & - cospOUT%grLidar532_beta_tot(ij:ik,:,grLidar532IN%Nlevels:1:-1) = grLidar532_beta_tot - endif - - ! ATLID subcolumn simulator - if (Latlid_subcolumn) then - if (atlidIN%Npoints .gt. 0) then - ! Allocate space for local variables - allocate(atlid_beta_mol(atlidIN%Npoints,atlidIN%Nlevels), & - atlid_beta_tot(atlidIN%Npoints,atlidIN%Ncolumns,atlidIN%Nlevels)) - ! Call simulator - call lidar_subcolumn(atlidIN%npoints, atlidIN%ncolumns, atlidIN%nlevels, & - .false., atlidIN%beta_mol_atlid, atlidIN%tau_mol_atlid, atlidIN%betatot_atlid, & - atlidIN%tautot_atlid, atlid_beta_mol(:,:), atlid_beta_tot(:,:,:)) - ! Decode outputs from swaths when reading into cospOUT fields - if (cospIN % cospswathsIN(4) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - cospOUT%atlid_beta_mol(ij:ik,:) = R_UNDEF - cospOUT%atlid_beta_tot(ij:ik,:,:) = R_UNDEF - if (associated(cospOUT%atlid_beta_mol)) cospOUT%atlid_beta_mol(ij+int(ATLID_MASK_INDICES)-1,atlidIN%Nlevels:1:-1) = atlid_beta_mol(:,:) - if (associated(cospOUT%atlid_beta_tot)) cospOUT%atlid_beta_tot(ij+int(ATLID_MASK_INDICES)-1,:,atlidIN%Nlevels:1:-1) = atlid_beta_tot(:,:,:) - else - ! Store output (if requested) - if (associated(cospOUT%atlid_beta_mol)) & - cospOUT%atlid_beta_mol(ij:ik,atlidIN%Nlevels:1:-1) = atlid_beta_mol - if (associated(cospOUT%atlid_beta_tot)) & - cospOUT%atlid_beta_tot(ij:ik,:,atlidIN%Nlevels:1:-1) = atlid_beta_tot - end if - else - cospOUT%atlid_beta_mol(ij:ik,:) = R_UNDEF - cospOUT%atlid_beta_tot(ij:ik,:,:) = R_UNDEF - endif - endif - - ! PARASOL subcolumn simulator - if (Lparasol_subcolumn) then - if (parasolIN%Npoints .gt. 0) then - ! Allocate space for local variables - allocate(parasolPix_refl(parasolIN%Npoints,parasolIN%Ncolumns,PARASOL_NREFL)) - ! Call simulator - do icol=1,parasolIN%Ncolumns - call parasol_subcolumn(parasolIN%npoints, PARASOL_NREFL, & - parasolIN%tautot_S_liq(1:parasolIN%Npoints,icol), & - parasolIN%tautot_S_ice(1:parasolIN%Npoints,icol), & - parasolPix_refl(:,icol,1:PARASOL_NREFL)) - ! Store output (if requested) - if (cospIN % cospswathsIN(5) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - cospOUT%parasolPix_refl(ij:ik,icol,1:PARASOL_NREFL) = R_UNDEF - if (associated(cospOUT%parasolPix_refl)) cospOUT%parasolPix_refl(ij+int(PARASOL_MASK_INDICES)-1,icol,1:PARASOL_NREFL) = parasolPix_refl(:,icol,1:PARASOL_NREFL) - else - if (associated(cospOUT%parasolPix_refl)) cospOUT%parasolPix_refl(ij:ik,icol,1:PARASOL_NREFL) = parasolPix_refl(:,icol,1:PARASOL_NREFL) - endif - enddo - else - cospOUT%parasolPix_refl(ij:ik,:,1:PARASOL_NREFL) = R_UNDEF - endif - endif - - ! Cloudsat (quickbeam) subcolumn simulator - if (Lcloudsat_subcolumn) then - ! Allocate space for local variables - if (cloudsatIN%Npoints .gt. 0) then - allocate(cloudsatDBZe(cloudsatIN%Npoints,cloudsatIN%Ncolumns,cloudsatIN%Nlevels), & - cloudsatZe_non(cloudsatIN%Npoints,cloudsatIN%Ncolumns,cloudsatIN%Nlevels)) - do icol=1,cloudsatIN%ncolumns - call quickbeam_subcolumn(cloudsatIN%rcfg,cloudsatIN%Npoints,cloudsatIN%Nlevels,& - cloudsatIN%hgt_matrix/1000._wp, & - cloudsatIN%z_vol(:,icol,:), & - cloudsatIN%kr_vol(:,icol,:), & - cloudsatIN%g_vol(:,1,:),cloudsatDBze(:,icol,:),cloudsatZe_non(:,icol,:)) - enddo - ! Store output (if requested) - if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - cospOUT%cloudsat_Ze_tot(ij:ik,:,:) = R_UNDEF - if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(ij+int(CSCAL_MASK_INDICES)-1,:,1:cloudsatIN%Nlevels) = cloudsatDBZe(:,:,1:cloudsatIN%Nlevels) - else - if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(ij:ik,:,:) = cloudsatDBZe(:,:,1:cloudsatIN%Nlevels) - endif - else - cospOUT%cloudsat_Ze_tot(ij:ik,:,:) = R_UNDEF - endif - endif - - ! MODIS subcolumn simulator - if (Lmodis_subcolumn) then - if (modisiN%nSunlit > 0) then - ! Allocate space for local variables - allocate(modisRetrievedTau(modisIN%nSunlit,modisIN%nColumns), & - modisRetrievedSize(modisIN%nSunlit,modisIN%nColumns), & - modisRetrievedPhase(modisIN%nSunlit,modisIN%nColumns), & - modisRetrievedCloudTopPressure(modisIN%nSunlit,modisIN%nColumns)) - if ((Lisccp_subcolumn .or. Lmodis_subcolumn) .and. (cospIN % cospswathsIN(1) % N_inst_swaths .gt. 0)) then ! If ISCCP is swathed must run ICARUS separately for MODIS - allocate(modisLEVMATCH(modisIN%Npoints,modisIN%Ncolumns), & - modis_boxptop(modisIN%Npoints,modisIN%Ncolumns), & - modis_boxttop(modisIN%Npoints,modisIN%Ncolumns), & - modis_boxtau(modisIN%Npoints,modisIN%Ncolumns), & - modis_meantbclr(modisIN%Npoints)) - if (.not. allocated(MODIS_SWATH_MASK)) then ! Allows to run when there is no swathing - allocate(MODIS_SWATH_MASK(Npoints)) - MODIS_SWATH_MASK(:) = .true. - end if - call icarus_subcolumn(modisIN%npoints,modisIN%ncolumns,modisIN%nlevels, & - int(MERGE(1,0,MASK=(cospgridIN%sunlit > 0) .and. MODIS_SWATH_MASK)), & - modisIN%tau,cospIN%emiss_11,cospgridIN%skt, & - cospIN%emsfc_lw,cospgridIN%qv,cospgridIN%at,cospgridIN%pfull, & - modisIN%pres,cospIN%frac_out,modisLEVMATCH, & - modis_boxtau(:,:),modis_boxptop(:,:), & - modis_boxttop(:,:),modis_meantbclr(:)) - deallocate(modis_boxtau,modis_boxttop,modis_meantbclr,modisLEVMATCH) - else ! If ISCCP runs fully, just use the cospOUT field indexed appropriately - allocate(modis_boxptop(modisIN%Npoints,modisIN%Ncolumns)) - modis_boxptop = cospOUT%isccp_boxptop(ij:ik,:) - end if - ! Call simulator one column at a time on sunlit columns - do i = 1, modisIN%nSunlit ! Just run on the sunlit columns, even though the modisIN DDT includes everything orbit swathed - call modis_subcolumn(modisIN%Ncolumns,modisIN%Nlevels, & - modisIN%pres(int(modisIN%sunlit(i)),:), & - modisIN%tau(int(modisIN%sunlit(i)),:,:), & - modisIN%liqFrac(int(modisIN%sunlit(i)),:,:), & - modisIN%g(int(modisIN%sunlit(i)),:,:), & - modisIN%w0(int(modisIN%sunlit(i)),:,:), & - modis_boxptop(int(modisIN%sunlit(i)),:), & - modisRetrievedPhase(i,:), & - modisRetrievedCloudTopPressure(i,:), & - modisRetrievedTau(i,:),modisRetrievedSize(i,:)) - end do - deallocate(modis_boxptop) - endif - endif - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! 5) Call column simulators - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - ! ISCCP - if (Lisccp_column) then - ! Check to see which outputs are requested. If not requested, use a local dummy array - if(.not. associated(cospOUT%isccp_meanalbedocld)) then - allocate(out1D_1(Npoints)) - cospOUT%isccp_meanalbedocld(ij:ik) => out1D_1 - endif - if(.not. associated(cospOUT%isccp_meanptop)) then - allocate(out1D_2(Npoints)) - cospOUT%isccp_meanptop(ij:ik) => out1D_2 - endif - if(.not. associated(cospOUT%isccp_meantaucld)) then - allocate(out1D_3(Npoints)) - cospOUT%isccp_meantaucld(ij:ik) => out1D_3 - endif - if(.not. associated(cospOUT%isccp_totalcldarea)) then - allocate(out1D_4(Npoints)) - cospOUT%isccp_totalcldarea(ij:ik) => out1D_4 - endif - if(.not. associated(cospOUT%isccp_meantb)) then - allocate(out1D_5(Npoints)) - cospOUT%isccp_meantb(ij:ik) => out1D_5 - endif - if(.not. associated(cospOUT%isccp_fq)) then - allocate(out1D_6(Npoints*numISCCPTauBins*numISCCPPresBins)) - cospOUT%isccp_fq(ij:ik,1:numISCCPTauBins,1:numISCCPPresBins) => out1D_6 - endif - - ! Call simulator - if (isccpIN%Npoints .gt. 0) then - allocate(temp_isccp_fq(isccpIN%Npoints,numISCCPTauBins,numISCCPPresBins), & - temp_isccp_meanalbedocld(isccpIN%Npoints), & - temp_isccp_meanptop(isccpIN%Npoints), & - temp_isccp_meantaucld(isccpIN%Npoints), & - temp_isccp_totalcldarea(isccpIN%Npoints), & - temp_isccp_meantb(isccpIN%Npoints)) - call icarus_column(isccpIN%npoints, isccpIN%ncolumns,isccp_boxtau(:,:), & - isccp_boxptop(:,:)/100._wp,isccpIN%sunlit,isccp_boxttop(:,:), & - temp_isccp_fq, & - temp_isccp_meanalbedocld, & - temp_isccp_meanptop,temp_isccp_meantaucld, & - temp_isccp_totalcldarea,temp_isccp_meantb) - if (cospIN % cospswathsIN(1) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - ! Decode back to the cospOUT shapes - cospOUT%isccp_fq(ij:ik,:,:) = R_UNDEF - cospOUT%isccp_meanalbedocld(ij:ik) = R_UNDEF - cospOUT%isccp_meanptop(ij:ik) = R_UNDEF - cospOUT%isccp_meantaucld(ij:ik) = R_UNDEF - cospOUT%isccp_totalcldarea(ij:ik) = R_UNDEF - cospOUT%isccp_meantb(ij:ik) = R_UNDEF - if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(ij+int(ISCCP_MASK_INDICES)-1,:,:) = temp_isccp_fq(:,:,:) - if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(ij+int(ISCCP_MASK_INDICES)-1) = temp_isccp_meanalbedocld(:) - if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(ij+int(ISCCP_MASK_INDICES)-1) = temp_isccp_meanptop(:) - if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(ij+int(ISCCP_MASK_INDICES)-1) = temp_isccp_meantaucld(:) - if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(ij+int(ISCCP_MASK_INDICES)-1) = temp_isccp_totalcldarea(:) - if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(ij+int(ISCCP_MASK_INDICES)-1) = temp_isccp_meantb(:) - else - if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(ij:ik,:,:) = temp_isccp_fq(:,:,:) - if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(ij:ik) = temp_isccp_meanalbedocld(:) - if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(ij:ik) = temp_isccp_meanptop(:) - if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(ij:ik) = temp_isccp_meantaucld(:) - if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(ij:ik) = temp_isccp_totalcldarea(:) - if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(ij:ik) = temp_isccp_meantb(:) - end if - deallocate(temp_isccp_fq,temp_isccp_meanalbedocld,temp_isccp_meanptop,temp_isccp_meantaucld,temp_isccp_totalcldarea,temp_isccp_meantb) - else - cospOUT%isccp_fq(ij:ik,:,:) = R_UNDEF - cospOUT%isccp_meanalbedocld(ij:ik) = R_UNDEF - cospOUT%isccp_meanptop(ij:ik) = R_UNDEF - cospOUT%isccp_meantaucld(ij:ik) = R_UNDEF - cospOUT%isccp_totalcldarea(ij:ik) = R_UNDEF - cospOUT%isccp_meantb(ij:ik) = R_UNDEF - end if - cospOUT%isccp_fq(ij:ik,:,:) = cospOUT%isccp_fq(ij:ik,:,7:1:-1) - - ! Check if there is any value slightly greater than 1 - where ((cospOUT%isccp_totalcldarea > 1.0-1.e-5) .and. & - (cospOUT%isccp_totalcldarea < 1.0+1.e-5)) - cospOUT%isccp_totalcldarea = 1.0 - endwhere - - ! Clear up memory (if necessary) - if (allocated(isccp_boxttop)) deallocate(isccp_boxttop) - if (allocated(isccp_boxptop)) deallocate(isccp_boxptop) - if (allocated(isccp_boxtau)) deallocate(isccp_boxtau) - if (allocated(isccp_meantbclr)) deallocate(isccp_meantbclr) - if (allocated(isccpLEVMATCH)) deallocate(isccpLEVMATCH) - if (allocated(ISCCP_MASK_INDICES)) deallocate(ISCCP_MASK_INDICES) - if (allocated(out1D_1)) then - deallocate(out1D_1) - nullify(cospOUT%isccp_meanalbedocld) - endif - if (allocated(out1D_2)) then - deallocate(out1D_2) - nullify(cospOUT%isccp_meanptop) - endif - if (allocated(out1D_3)) then - deallocate(out1D_3) - nullify(cospOUT%isccp_meantaucld) - endif - if (allocated(out1D_4)) then - deallocate(out1D_4) - nullify(cospOUT%isccp_totalcldarea) - endif - if (allocated(out1D_5)) then - deallocate(out1D_5) - nullify(cospOUT%isccp_meantb) - endif - if (allocated(out1D_6)) then - deallocate(out1D_6) - nullify(cospOUT%isccp_fq) - endif - endif - - ! MISR - if (Lmisr_column) then - ! Check to see which outputs are requested. If not requested, use a local dummy array - if (.not. associated(cospOUT%misr_cldarea)) then - allocate(out1D_1(Npoints)) - cospOUT%misr_cldarea(ij:ik) => out1D_1 - endif - if (.not. associated(cospOUT%misr_meanztop)) then - allocate(out1D_2(Npoints)) - cospOUT%misr_meanztop(ij:ik) => out1D_2 - endif - if (.not. associated(cospOUT%misr_fq)) then - allocate(out1D_3(Npoints*numMISRTauBins*numMISRHgtBins)) - cospOUT%misr_fq(ij:ik,1:numMISRTauBins,1:numMISRHgtBins) => out1D_3 - endif - - ! Call simulator - if (cospIN % cospswathsIN(2) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - if (misrIN%Npoints .gt. 0) then - ! Operate at the masked format. - allocate(temp_misr_cldarea(misrIN%Npoints), & - temp_misr_meanztop(misrIN%Npoints), & - temp_misr_fq(misrIN%Npoints,numMISRTauBins,numMISRHgtBins)) - call misr_column(misrIN%Npoints,misrIN%Ncolumns,misr_boxztop,misrIN%sunlit, & - misr_boxtau,temp_misr_cldarea(:), & - temp_misr_meanztop(:),temp_misr_fq(:,:,:)) - ! Decode back to the cospOUT shapes - cospOUT%misr_cldarea(ij:ik) = R_UNDEF - cospOUT%misr_meanztop(ij:ik) = R_UNDEF - cospOUT%misr_fq(ij:ik,:,:) = R_UNDEF - if (associated(cospOUT%misr_cldarea)) cospOUT%misr_cldarea(ij+int(MISR_MASK_INDICES)-1) = temp_misr_cldarea(:) - if (associated(cospOUT%misr_meanztop)) cospOUT%misr_meanztop(ij+int(MISR_MASK_INDICES)-1) = temp_misr_meanztop(:) - if (associated(cospOUT%misr_fq)) cospOUT%misr_fq(ij+int(MISR_MASK_INDICES)-1,:,:) = temp_misr_fq(:,:,:) - deallocate(temp_misr_cldarea,temp_misr_meanztop,temp_misr_fq) - else - cospOUT%misr_cldarea(ij:ik) = R_UNDEF - cospOUT%misr_meanztop(ij:ik) = R_UNDEF - cospOUT%misr_fq(ij:ik,:,:) = R_UNDEF - endif - else - call misr_column(misrIN%Npoints,misrIN%Ncolumns,misr_boxztop,misrIN%sunlit,& - misr_boxtau,cospOUT%misr_cldarea(ij:ik), & - cospOUT%misr_meanztop(ij:ik),cospOUT%misr_fq(ij:ik,:,:)) - endif - ! Clear up memory - if (allocated(misr_boxtau)) deallocate(misr_boxtau) - if (allocated(misr_boxztop)) deallocate(misr_boxztop) - if (allocated(misr_dist_model_layertops)) deallocate(misr_dist_model_layertops) - if (allocated(MISR_MASK_INDICES)) deallocate(MISR_MASK_INDICES) - if (allocated(out1D_1)) then - deallocate(out1D_1) - nullify(cospOUT%misr_cldarea) - endif - if (allocated(out1D_2)) then - deallocate(out1D_2) - nullify(cospOUT%misr_meanztop) - endif - if (allocated(out1D_3)) then - deallocate(out1D_3) - nullify(cospOUT%misr_fq) - endif - endif - - ! CALIPSO LIDAR Simulator - if (Lcalipso_column) then - ! Check to see which outputs are requested. If not requested, use a local dummy array - if (.not. associated(cospOUT%calipso_cfad_sr)) then - allocate(out1D_1(Npoints*SR_BINS*Nlvgrid)) - cospOUT%calipso_cfad_sr(ij:ik,1:SR_BINS,1:Nlvgrid) => out1D_1 - endif - if (.not. associated(cospOUT%calipso_lidarcld)) then - allocate(out1D_2(Npoints*Nlvgrid)) - cospOUT%calipso_lidarcld(ij:ik,1:Nlvgrid) => out1D_2 - endif - if (.not. associated(cospOUT%calipso_lidarcldphase)) then - allocate(out1D_3(Npoints*Nlvgrid*6)) - cospOUT%calipso_lidarcldphase(ij:ik,1:Nlvgrid,1:6) => out1D_3 - endif - if (.not. associated(cospOUT%calipso_cldlayer)) then - allocate(out1D_4(Npoints*LIDAR_NCAT)) - cospOUT%calipso_cldlayer(ij:ik,1:LIDAR_NCAT) => out1D_4 - endif - if (.not. associated(cospOUT%calipso_cldlayerphase)) then - allocate(out1D_5(Npoints*LIDAR_NCAT*6)) - cospOUT%calipso_cldlayerphase(ij:ik,1:LIDAR_NCAT,1:6) => out1D_5 - endif - if (.not. associated(cospOUT%calipso_lidarcldtmp)) then - allocate(out1D_6(Npoints*40*5)) - cospOUT%calipso_lidarcldtmp(ij:ik,1:40,1:5) => out1D_6 - endif - if (.not. associated(cospOUT%calipso_lidarcldtype)) then - allocate(out1D_7(Npoints*Nlvgrid*4)) - cospOUT%calipso_lidarcldtype(ij:ik,1:Nlvgrid,1:4) => out1D_7 - endif - if (.not. associated(cospOUT%calipso_cldtype)) then - allocate(out1D_8(Npoints*LIDAR_NTYPE)) - cospOUT%calipso_cldtype(ij:ik,1:LIDAR_NTYPE) => out1D_8 - endif - if (.not. associated(cospOUT%calipso_cldtypetemp)) then - allocate(out1D_9(Npoints*LIDAR_NTYPE)) - cospOUT%calipso_cldtypetemp(ij:ik,1:LIDAR_NTYPE) => out1D_9 - endif - if (.not. associated(cospOUT%calipso_cldtypemeanz)) then - allocate(out1D_10(Npoints*2)) - cospOUT%calipso_cldtypemeanz(ij:ik,1:2) => out1D_10 - endif - if (.not. associated(cospOUT%calipso_cldtypemeanzse)) then - allocate(out1D_12(Npoints*3)) - cospOUT%calipso_cldtypemeanzse(ij:ik,1:3) => out1D_12 - endif - if (.not. associated(cospOUT%calipso_cldthinemis)) then - allocate(out1D_11(Npoints)) - cospOUT%calipso_cldthinemis(ij:ik) => out1D_11 - endif - - ! Call simulator - if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - ! Operate at the masked format. - if (calipsoIN%Npoints .gt. 0) then - allocate(temp_calipso_cfad_sr(calipsoIN%Npoints,SR_BINS,Nlvgrid), & - temp_calipso_lidarcld(calipsoIN%Npoints,Nlvgrid), & - temp_calipso_cldlayer(calipsoIN%Npoints,LIDAR_NCAT), & - temp_calipso_lidarcldphase(calipsoIN%Npoints,Nlvgrid,6), & - temp_calipso_lidarcldtype(calipsoIN%Npoints,Nlvgrid,LIDAR_NTYPE+1), & - temp_calipso_cldtype(calipsoIN%Npoints,LIDAR_NTYPE), & - temp_calipso_cldtypetemp(calipsoIN%Npoints,LIDAR_NTYPE), & - temp_calipso_cldtypemeanz(calipsoIN%Npoints,2), & - temp_calipso_cldtypemeanzse(calipsoIN%Npoints,3), & - temp_calipso_cldthinemis(calipsoIN%Npoints), & - temp_calipso_cldlayerphase(calipsoIN%Npoints,LIDAR_NCAT,6), & - temp_calipso_lidarcldtmp(calipsoIN%Npoints,LIDAR_NTEMP,5)) - ok_lidar_cfad=.true. - call lidar_column(calipsoIN%Npoints, calipsoIN%Ncolumns, calipsoIN%Nlevels, & - Nlvgrid, SR_BINS, LIDAR_NTYPE, 'calipso',calipso_beta_tot(:,:,:), calipso_beta_mol(:,:), & - cospgridIN%phalf(int(CSCAL_MASK_INDICES),2:calipsoIN%Nlevels+1), & - cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES),:), & - cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES),:), vgrid_z(:), ok_lidar_cfad, LIDAR_NCAT, & - temp_calipso_cfad_sr(:,:,:), temp_calipso_lidarcld(:,:), temp_calipso_cldlayer(:,:), & - cospgridIN%at(int(CSCAL_MASK_INDICES),:), calipso_betaperp_tot(:,:,:), & - cospgridIN%surfelev(int(CSCAL_MASK_INDICES)), & - temp_calipso_lidarcldphase(:,:,:), & - temp_calipso_lidarcldtype(:,:,:), temp_calipso_cldtype(:,:), & - temp_calipso_cldtypetemp(:,:), temp_calipso_cldtypemeanz(:,:), & - temp_calipso_cldtypemeanzse(:,:), temp_calipso_cldthinemis(:), & - temp_calipso_cldlayerphase(:,:,:), temp_calipso_lidarcldtmp(:,:,:)) - ! Decode back to the cospOUT shapes - cospOUT%calipso_cfad_sr(ij:ik,:,:) = R_UNDEF - cospOUT%calipso_lidarcld(ij:ik,:) = R_UNDEF - cospOUT%calipso_cldlayer(ij:ik,:) = R_UNDEF - cospOUT%calipso_lidarcldphase(ij:ik,:,:) = R_UNDEF - cospOUT%calipso_lidarcldtype(ij:ik,:,:) = R_UNDEF - cospOUT%calipso_cldtype(ij:ik,:) = R_UNDEF - cospOUT%calipso_cldtypetemp(ij:ik,:) = R_UNDEF - cospOUT%calipso_cldtypemeanz(ij:ik,:) = R_UNDEF - cospOUT%calipso_cldtypemeanzse(ij:ik,:) = R_UNDEF - cospOUT%calipso_cldthinemis(ij:ik) = R_UNDEF - cospOUT%calipso_cldlayerphase(ij:ik,:,:) = R_UNDEF - cospOUT%calipso_lidarcldtmp(ij:ik,:,:) = R_UNDEF - ! Note: The active simulators use R_UNDEF to indicate unretrieved and clear-sky values. - ! Decisions on how to treat these values are delegeate to the host user, and fields - ! are often set to zero. - ! Using R_UNDEF in this way is incompatible with the swath approach, where R_UNDEF means - ! that a field should not be used in statistically averaging, etc. - ! To avoid this error, when swathing we set R_UNDEF value to zero here. - where (temp_calipso_cfad_sr(:,:,:) == R_UNDEF) temp_calipso_cfad_sr(:,:,:) = 0._wp - where (temp_calipso_lidarcldphase(:,:,:) == R_UNDEF) temp_calipso_lidarcldphase(:,:,:) = 0._wp - where (temp_calipso_lidarcld(:,:) == R_UNDEF) temp_calipso_lidarcld(:,:) = 0._wp - ! Unpack into the full lat-lon structure - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(ij+int(CSCAL_MASK_INDICES)-1,:,:) = temp_calipso_cfad_sr(:,:,:) - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_calipso_lidarcld(:,:) - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_calipso_cldlayer(:,:) - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(ij+int(CSCAL_MASK_INDICES)-1,:,:) = temp_calipso_lidarcldphase(:,:,:) - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(ij+int(CSCAL_MASK_INDICES)-1,:,:) = temp_calipso_lidarcldtype(:,:,:) - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_calipso_cldtype(:,:) - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_calipso_cldtypetemp(:,:) - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_calipso_cldtypemeanz(:,:) - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_calipso_cldtypemeanzse(:,:) - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(ij+int(CSCAL_MASK_INDICES)-1) = temp_calipso_cldthinemis(:) - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(ij+int(CSCAL_MASK_INDICES)-1,:,:) = temp_calipso_cldlayerphase(:,:,:) - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(ij+int(CSCAL_MASK_INDICES)-1,:,:) = temp_calipso_lidarcldtmp(:,:,:) - deallocate(temp_calipso_cfad_sr,temp_calipso_lidarcld,temp_calipso_cldlayer,temp_calipso_lidarcldphase, & - temp_calipso_lidarcldtype,temp_calipso_cldtype,temp_calipso_cldtypetemp,temp_calipso_cldtypemeanz, & - temp_calipso_cldtypemeanzse,temp_calipso_cldthinemis,temp_calipso_cldlayerphase,temp_calipso_lidarcldtmp) - else - cospOUT%calipso_cfad_sr(ij:ik,:,:) = R_UNDEF - cospOUT%calipso_lidarcld(ij:ik,:) = R_UNDEF - cospOUT%calipso_cldlayer(ij:ik,:) = R_UNDEF - cospOUT%calipso_lidarcldphase(ij:ik,:,:) = R_UNDEF - cospOUT%calipso_lidarcldtype(ij:ik,:,:) = R_UNDEF - cospOUT%calipso_cldtype(ij:ik,:) = R_UNDEF - cospOUT%calipso_cldtypetemp(ij:ik,:) = R_UNDEF - cospOUT%calipso_cldtypemeanz(ij:ik,:) = R_UNDEF - cospOUT%calipso_cldtypemeanzse(ij:ik,:) = R_UNDEF - cospOUT%calipso_cldthinemis(ij:ik) = R_UNDEF - cospOUT%calipso_cldlayerphase(ij:ik,:,:) = R_UNDEF - cospOUT%calipso_lidarcldtmp(ij:ik,:,:) = R_UNDEF - endif - else - ok_lidar_cfad=.true. - call lidar_column(calipsoIN%Npoints, calipsoIN%Ncolumns, calipsoIN%Nlevels, & - Nlvgrid, SR_BINS, LIDAR_NTYPE, 'calipso',calipso_beta_tot(:,:,:), calipso_beta_mol(:,:),& - cospgridIN%phalf(:,2:calipsoIN%Nlevels+1),cospgridIN%hgt_matrix, & - cospgridIN%hgt_matrix_half, vgrid_z(:), ok_lidar_cfad, LIDAR_NCAT, & - cospOUT%calipso_cfad_sr(ij:ik,:,:), cospOUT%calipso_lidarcld(ij:ik,:), & - cospOUT%calipso_cldlayer(ij:ik,:), & - cospgridIN%at(:,:), calipso_betaperp_tot(:,:,:), cospgridIN%surfelev, & - cospOUT%calipso_lidarcldphase(ij:ik,:,:), & - cospOUT%calipso_lidarcldtype(ij:ik,:,:), cospOUT%calipso_cldtype(ij:ik,:), & - cospOUT%calipso_cldtypetemp(ij:ik,:), cospOUT%calipso_cldtypemeanz(ij:ik,:), & - cospOUT%calipso_cldtypemeanzse(ij:ik,:), cospOUT%calipso_cldthinemis(ij:ik), & - cospOUT%calipso_cldlayerphase(ij:ik,:,:), cospOUT%calipso_lidarcldtmp(ij:ik,:,:)) - endif - - if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval = calipso_histBsct - - ! Free up memory (if necessary) - if (allocated(out1D_1)) then - deallocate(out1D_1) - nullify(cospOUT%calipso_cfad_sr) - endif - if (allocated(out1D_2)) then - deallocate(out1D_2) - nullify(cospOUT%calipso_lidarcld) - endif - if (allocated(out1D_3)) then - deallocate(out1D_3) - nullify(cospOUT%calipso_lidarcldphase) - endif - if (allocated(out1D_4)) then - deallocate(out1D_4) - nullify(cospOUT%calipso_cldlayer) - endif - if (allocated(out1D_5)) then - deallocate(out1D_5) - nullify(cospOUT%calipso_cldlayerphase) - endif - if (allocated(out1D_6)) then - deallocate(out1D_6) - nullify(cospOUT%calipso_lidarcldtmp) - endif - if (allocated(out1D_7)) then - deallocate(out1D_7) - nullify(cospOUT%calipso_lidarcldtype) - endif - if (allocated(out1D_8)) then - deallocate(out1D_8) - nullify(cospOUT%calipso_cldtype) - endif - if (allocated(out1D_9)) then - deallocate(out1D_9) - nullify(cospOUT%calipso_cldtypetemp) - endif - if (allocated(out1D_10)) then - deallocate(out1D_10) - nullify(cospOUT%calipso_cldtypemeanz) - endif - if (allocated(out1D_12)) then - deallocate(out1D_12) - nullify(cospOUT%calipso_cldtypemeanzse) - endif - if (allocated(out1D_11)) then - deallocate(out1D_11) - nullify(cospOUT%calipso_cldthinemis) - endif - - endif - - ! GROUND LIDAR Simulator - if (LgrLidar532_column) then - ! Check to see which outputs are requested. If not requested, use a local dummy array - if (.not. associated(cospOUT%grLidar532_cfad_sr)) then - allocate(out1D_1(Npoints*SR_BINS*Nlvgrid)) - cospOUT%grLidar532_cfad_sr(ij:ik,1:SR_BINS,1:Nlvgrid) => out1D_1 - endif - if (.not. associated(cospOUT%grLidar532_lidarcld)) then - allocate(out1D_2(Npoints*Nlvgrid)) - cospOUT%grLidar532_lidarcld(ij:ik,1:Nlvgrid) => out1D_2 - endif - if (.not. associated(cospOUT%grLidar532_cldlayer)) then - allocate(out1D_3(Npoints*LIDAR_NCAT)) - cospOUT%grLidar532_cldlayer(ij:ik,1:LIDAR_NCAT) => out1D_3 - endif - - ! Call simulator - ok_lidar_cfad_grLidar532=.true. - call lidar_column(grLidar532IN%Npoints, grLidar532IN%Ncolumns, grLidar532IN%Nlevels, & - Nlvgrid, SR_BINS, LIDAR_NTYPE, 'grlidar532',grLidar532_beta_tot(:,:,:), grLidar532_beta_mol(:,:),& - cospgridIN%phalf(:,2:grLidar532IN%Nlevels+1),cospgridIN%hgt_matrix, & - cospgridIN%hgt_matrix_half, vgrid_z(:), ok_lidar_cfad_grLidar532, LIDAR_NCAT, & - cospOUT%grLidar532_cfad_sr(ij:ik,:,:), cospOUT%grLidar532_lidarcld(ij:ik,:), & - cospOUT%grLidar532_cldlayer(ij:ik,:)) - - if (associated(cospOUT%grLidar532_srbval)) cospOUT%grLidar532_srbval = grLidar532_histBsct - - ! Free up memory (if necessary) - if (allocated(out1D_1)) then - deallocate(out1D_1) - nullify(cospOUT%grLidar532_cfad_sr) - endif - if (allocated(out1D_2)) then - deallocate(out1D_2) - nullify(cospOUT%grLidar532_lidarcld) - endif - if (allocated(out1D_3)) then - deallocate(out1D_3) - nullify(cospOUT%grLidar532_cldlayer) - endif - - endif - - ! ATLID Simulator - if (Latlid_column) then - ! Check to see which outputs are requested. If not requested, use a local dummy array - if (.not. associated(cospOUT%atlid_cfad_sr)) then - allocate(out1D_1(Npoints*SR_BINS*Nlvgrid)) - cospOUT%atlid_cfad_sr(ij:ik,1:SR_BINS,1:Nlvgrid) => out1D_1 - endif - if (.not. associated(cospOUT%atlid_lidarcld)) then - allocate(out1D_2(Npoints*Nlvgrid)) - cospOUT%atlid_lidarcld(ij:ik,1:Nlvgrid) => out1D_2 - endif - if (.not. associated(cospOUT%atlid_cldlayer)) then - allocate(out1D_3(Npoints*LIDAR_NCAT)) - cospOUT%atlid_cldlayer(ij:ik,1:LIDAR_NCAT) => out1D_3 - endif - ! Call simulator - ok_lidar_cfad_atlid=.true. - if (cospIN % cospswathsIN(4) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - if (atlidIN%Npoints .gt. 0) then - allocate(temp_atlid_cfad_sr(atlidIN%Npoints,SR_BINS,Nlvgrid), & - temp_atlid_lidarcld(atlidIN%Npoints,Nlvgrid), & - temp_atlid_cldlayer(atlidIN%Npoints,LIDAR_NCAT)) - call lidar_column(atlidIN%Npoints, atlidIN%Ncolumns, atlidIN%Nlevels, & - Nlvgrid, SR_BINS, LIDAR_NTYPE, 'atlid',atlid_beta_tot(:,:,:), & - atlid_beta_mol(:,:), cospgridIN%phalf(int(ATLID_MASK_INDICES),2:atlidIN%Nlevels+1), & - cospgridIN%hgt_matrix(int(ATLID_MASK_INDICES),:), & - cospgridIN%hgt_matrix_half(int(ATLID_MASK_INDICES),:), vgrid_z(:), & - ok_lidar_cfad_atlid, LIDAR_NCAT, temp_atlid_cfad_sr(:,:,:), & - temp_atlid_lidarcld(:,:), temp_atlid_cldlayer(:,:)) - ! Decode back to the cospOUT shapes - cospOUT%atlid_cfad_sr(ij:ik,:,:) = R_UNDEF - cospOUT%atlid_lidarcld(ij:ik,:) = R_UNDEF - cospOUT%atlid_cldlayer(ij:ik,:) = R_UNDEF - if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(ij+int(ATLID_MASK_INDICES)-1,:,:) = temp_atlid_cfad_sr(:,:,:) - if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(ij+int(ATLID_MASK_INDICES)-1,:) = temp_atlid_lidarcld(:,:) - if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(ij+int(ATLID_MASK_INDICES)-1,:) = temp_atlid_cldlayer(:,:) - deallocate(temp_atlid_cfad_sr,temp_atlid_lidarcld,temp_atlid_cldlayer) - else - cospOUT%atlid_cfad_sr(ij:ik,:,:) = R_UNDEF - cospOUT%atlid_lidarcld(ij:ik,:) = R_UNDEF - cospOUT%atlid_cldlayer(ij:ik,:) = R_UNDEF - endif - else - call lidar_column(atlidIN%Npoints, atlidIN%Ncolumns, atlidIN%Nlevels, & - Nlvgrid, SR_BINS, LIDAR_NTYPE, 'atlid',atlid_beta_tot(:,:,:), & - atlid_beta_mol(:,:), cospgridIN%phalf(:,2:atlidIN%Nlevels+1), & - cospgridIN%hgt_matrix, cospgridIN%hgt_matrix_half, vgrid_z(:), & - ok_lidar_cfad_atlid, LIDAR_NCAT, cospOUT%atlid_cfad_sr(ij:ik,:,:), & - cospOUT%atlid_lidarcld(ij:ik,:), cospOUT%atlid_cldlayer(ij:ik,:)) - endif - if (associated(cospOUT%atlid_srbval)) cospOUT%atlid_srbval = atlid_histBsct - - ! Free up memory (if necessary) - if (allocated(ATLID_MASK_INDICES)) deallocate(ATLID_MASK_INDICES) - if (allocated(out1D_1)) then - deallocate(out1D_1) - nullify(cospOUT%atlid_cfad_sr) - endif - if (allocated(out1D_2)) then - deallocate(out1D_2) - nullify(cospOUT%atlid_lidarcld) - endif - if (allocated(out1D_3)) then - deallocate(out1D_3) - nullify(cospOUT%atlid_cldlayer) - endif - - endif - - ! PARASOL - if (Lparasol_column) then - if (cospIN % cospswathsIN(5) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - if (parasolIN%Npoints .gt. 0) then - allocate(temp_parasolGrid_refl(parasolIN%Npoints,PARASOL_NREFL)) - call parasol_column(parasolIN%Npoints,PARASOL_NREFL,parasolIN%Ncolumns, & - cospgridIN%land(int(PARASOL_MASK_INDICES)),parasolPix_refl(:,:,:), & - temp_parasolGrid_refl(:,:)) - ! Decode back to the cospOUT shapes - cospOUT%parasolGrid_refl(ij:ik,:) = R_UNDEF - ! Note: The active simulators use R_UNDEF to indicate unretrieved and clear-sky values. - ! Decisions on how to treat these values are delegeate to the host user, and fields - ! are often set to zero. - ! Using R_UNDEF in this way is incompatible with the swath approach, where R_UNDEF means - ! that a field should not be used in statistically averaging, etc. - ! To avoid this error, when swathing we set R_UNDEF value to zero here. - where (temp_parasolGrid_refl(:,:) == R_UNDEF) temp_parasolGrid_refl(:,:) = 0._wp - if (associated(cospOUT%parasolGrid_refl)) cospOUT%parasolGrid_refl(ij+int(PARASOL_MASK_INDICES)-1,:) = temp_parasolGrid_refl(:,:) - deallocate(temp_parasolGrid_refl) - else - cospOUT%parasolGrid_refl(ij:ik,:) = R_UNDEF - endif - else - call parasol_column(parasolIN%Npoints,PARASOL_NREFL,parasolIN%Ncolumns, & - cospgridIN%land(:),parasolPix_refl(:,:,:), & - cospOUT%parasolGrid_refl(ij:ik,:)) - ! print*,'cospOUT%parasolGrid_refl: ',cospOUT%parasolGrid_refl ! Values not zeroed here. - endif - if (allocated(parasolPix_refl)) deallocate(parasolPix_refl) - if (allocated(PARASOL_MASK_INDICES)) deallocate(PARASOL_MASK_INDICES) - endif - - ! CLOUDSAT - if (Lcloudsat_column) then - ! Check to see which outputs are requested. If not requested, use a local dummy array - if (.not. associated(cospOUT%cloudsat_cfad_ze)) then - allocate(out1D_1(Npoints*cloudsat_DBZE_BINS*Nlvgrid)) - cospOUT%cloudsat_cfad_ze(ij:ik,1:cloudsat_DBZE_BINS,1:Nlvgrid) => out1D_1 - endif - - if (.not. associated(cospOUT%cloudsat_pia)) then - allocate(out1D_2(Npoints)) - cospOUT%cloudsat_pia(ij:ik) => out1D_2 - endif - if (.not. associated(cospOUT%cloudsat_precip_cover)) then - allocate(out1D_3(Npoints*nCloudsatPrecipClass)) - cospOUT%cloudsat_precip_cover(ij:ik,1:nCloudsatPrecipClass) => out1D_3 - endif - - ! Call simulator - if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - if (cloudsatIN%Npoints .gt. 0) then - allocate(temp_cloudsat_cfad_ze(cloudsatIN%Npoints,cloudsat_DBZE_BINS,Nlvgrid), & - temp_cloudsat_precip_cover(cloudsatIN%Npoints,nCloudsatPrecipClass), & - temp_cloudsat_pia(cloudsatIN%Npoints)) - call quickbeam_column(cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels, & - Nlvgrid, cloudsat_DBZE_BINS, 'cloudsat', cloudsatDBZe, cloudsatZe_non, & - cospgridIN%land(int(CSCAL_MASK_INDICES)), cospgridIN%surfelev(int(CSCAL_MASK_INDICES)), & - cospgridIN%at(int(CSCAL_MASK_INDICES),cospIN%Nlevels), cospIN%fracPrecipIce(int(CSCAL_MASK_INDICES),:), & - cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES),:), cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES),:), & - temp_cloudsat_cfad_ze(:,:,:), temp_cloudsat_precip_cover(:,:), temp_cloudsat_pia(:)) - ! Decode back to the cospOUT shapes - cospOUT%cloudsat_cfad_ze(ij:ik,:,:) = R_UNDEF - cospOUT%cloudsat_precip_cover(ij:ik,:) = R_UNDEF - cospOUT%cloudsat_pia(ij:ik) = R_UNDEF - ! Note: The active simulators use R_UNDEF to indicate unretrieved and clear-sky values. - ! Decisions on how to treat these values are delegeate to the host user, and fields - ! are often set to zero. - ! Using R_UNDEF in this way is incompatible with the swath approach, where R_UNDEF means - ! that a field should not be used in statistically averaging, etc. - ! To avoid this error, when swathing we set R_UNDEF value to zero here. - where (temp_cloudsat_cfad_ze(:,:,:) == R_UNDEF) temp_cloudsat_cfad_ze(:,:,:) = 0._wp - if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(ij+int(CSCAL_MASK_INDICES)-1,:,:) = temp_cloudsat_cfad_ze(:,:,:) - if (associated(cospOUT%cloudsat_precip_cover)) cospOUT%cloudsat_precip_cover(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_cloudsat_precip_cover(:,:) - if (associated(cospOUT%cloudsat_pia)) cospOUT%cloudsat_pia(ij+int(CSCAL_MASK_INDICES)-1) = temp_cloudsat_pia(:) - deallocate(temp_cloudsat_cfad_ze,temp_cloudsat_precip_cover,temp_cloudsat_pia) - if (allocated(CSCAL_SWATH_MASK)) deallocate(CSCAL_SWATH_MASK) - else - cospOUT%cloudsat_cfad_ze(ij:ik,:,:) = R_UNDEF - cospOUT%cloudsat_precip_cover(ij:ik,:) = R_UNDEF - cospOUT%cloudsat_pia(ij:ik) = R_UNDEF - endif - else - call quickbeam_column(cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels,& - Nlvgrid, cloudsat_DBZE_BINS, 'cloudsat', cloudsatDBZe, cloudsatZe_non, & - cospgridIN%land(:), cospgridIN%surfelev(:), cospgridIN%at(:,cospIN%Nlevels), & - cospIN%fracPrecipIce, cospgridIN%hgt_matrix, cospgridIN%hgt_matrix_half, & - cospOUT%cloudsat_cfad_ze(ij:ik,:,:), cospOUT%cloudsat_precip_cover(ij:ik,:), & - cospOUT%cloudsat_pia(ij:ik)) - endif - ! Free up memory (if necessary) - if (allocated(out1D_1)) then - deallocate(out1D_1) - nullify(cospOUT%cloudsat_cfad_ze) - endif - if (allocated(out1D_2)) then - deallocate(out1D_2) - nullify(cospOUT%cloudsat_pia) - endif - if (allocated(out1D_3)) then - deallocate(out1D_3) - nullify(cospOUT%cloudsat_precip_cover) - endif - - ! for DPLRW - if (Ldplrw) then - call quickbeam_dplrw(cospIN%Npoints, cospIN%Ncolumns, cospIN%Nlevels, & - cospIN%rcfg_cloudsat, & - cospgridIN%hgt_matrix, cospgridIN%hgt_matrix_half, cospgridIN%surfelev, & - cospgridIN%at, cospgridIN%pfull, & - cospgridIN%gwvel, cospgridIN%gcumf, & - cospIN%vfall, cospIN%vfsqu, cospIN%zehyd, & - cospIN%g_vol_cloudsat, cospIN%krhyd, & - cospIN%vtrm3, cospIN%vtrm0, cospIN%mmnt3, cospIN%mmnt0, & - cospOUT%gcumw(ij:ik,:), & - cospOUT%dplrw_Z(ij:ik,:,:,:), cospOUT%spwid_Z(ij:ik,:,:,:), & - cospOUT%Zef94_Z(ij:ik,:,:,:), & - cospOUT%dplrw_T(ij:ik,:,:,:), cospOUT%spwid_T(ij:ik,:,:,:), & - cospOUT%Zef94_T(ij:ik,:,:,:), & - cospOUT%ZefVd_2(ij:ik,:,:,:), & - cospOUT%vfall_Z(ij:ik,:,:,:,:), cospOUT%gridw_Z(ij:ik,:,:,:), & - cospOUT%vfall_T(ij:ik,:,:,:,:), cospOUT%gridw_T(ij:ik,:,:,:), & - cospOUT%ZefVf_2(ij:ik,:,:,:,:) ) - end if - endif - - ! MODIS - if (Lmodis_column) then - if (modisIN%nSunlit > 0) then - ! Allocate space for local variables - allocate(modisCftotal(modisIN%nSunlit), modisCfLiquid(modisIN%nSunlit), & - modisCfIce(modisIN%nSunlit),modisCfHigh(modisIN%nSunlit), & - modisCfMid(modisIN%nSunlit),modisCfLow(modisIN%nSunlit), & - modisMeanTauTotal(modisIN%nSunlit), & - modisMeanTauLiquid(modisIN%nSunlit),modisMeanTauIce(modisIN%nSunlit), & - modisMeanLogTauTotal(modisIN%nSunlit), & - modisMeanLogTauLiquid(modisIN%nSunlit), & - modisMeanLogTauIce(modisIN%nSunlit), & - modisMeanSizeLiquid(modisIN%nSunlit), & - modisMeanSizeIce(modisIN%nSunlit), & - modisMeanCloudTopPressure(modisIN%nSunlit), & - modisMeanLiquidWaterPath(modisIN%nSunlit), & - modisMeanIceWaterPath(modisIN%nSunlit), & - modisJointHistogram(modisIN%nSunlit,numMODISTauBins,numMODISPresBins),& - modisJointHistogramIce(modisIN%nSunlit,numModisTauBins,numMODISReffIceBins),& - modisJointHistogramLiq(modisIN%nSunlit,numModisTauBins,numMODISReffLiqBins),& - modisJointHistogram_CtpCodLiq(modisIN%nSunlit,numMODISTauBins,numMODISPresBins),& - modisJointHistogram_CtpCodIce(modisIN%nSunlit,numMODISTauBins,numMODISPresBins),& - modisJointHistogram_LwpRefLiq(modisIN%nSunlit,numMODISLWPBins,numMODISReffLiqBins), & - modisJointHistogram_IwpRefIce(modisIN%nSunlit,numMODISIWPBins,numMODISReffIceBins) & - ) - ! Call simulator - call modis_column(modisIN%nSunlit, modisIN%Ncolumns,modisRetrievedPhase, & - modisRetrievedCloudTopPressure,modisRetrievedTau, & - modisRetrievedSize, modisCfTotal, modisCfLiquid, modisCfIce,& - modisCfHigh, modisCfMid, modisCfLow, modisMeanTauTotal, & - modisMeanTauLiquid, modisMeanTauIce, modisMeanLogTauTotal, & - modisMeanLogTauLiquid, modisMeanLogTauIce, & - modisMeanSizeLiquid, modisMeanSizeIce, & - modisMeanCloudTopPressure, modisMeanLiquidWaterPath, & - modisMeanIceWaterPath, modisJointHistogram, & - modisJointHistogramIce,modisJointHistogramLiq, & - modisJointHistogram_CtpCodLiq, & - modisJointHistogram_CtpCodIce, & - modisJointHistogram_LwpRefLiq, & - modisJointHistogram_IwpRefIce & - ) - ! Store data (if requested) - if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) then - cospOUT%modis_Cloud_Fraction_Total_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisCfTotal - endif - if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) then - cospOUT%modis_Cloud_Fraction_Water_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisCfLiquid - endif - if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) then - cospOUT%modis_Cloud_Fraction_Ice_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisCfIce - endif - if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) then - cospOUT%modis_Cloud_Fraction_High_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisCfHigh - endif - if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) then - cospOUT%modis_Cloud_Fraction_Mid_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisCfMid - endif - if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) then - cospOUT%modis_Cloud_Fraction_Low_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisCfLow - endif - if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) then - cospOUT%modis_Optical_Thickness_Total_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisMeanTauTotal - endif - if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) then - cospOUT%modis_Optical_Thickness_Water_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisMeanTauLiquid - endif - if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) then - cospOUT%modis_Optical_Thickness_Ice_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisMeanTauIce - endif - if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) then - cospOUT%modis_Optical_Thickness_Total_LogMean(ij+int(modisIN%sunlit(:))-1)= & - modisMeanLogTauTotal - endif - if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) then - cospOUT%modis_Optical_Thickness_Water_LogMean(ij+int(modisIN%sunlit(:))-1) = & - modisMeanLogTauLiquid - endif - if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) then - cospOUT%modis_Optical_Thickness_Ice_LogMean(ij+int(modisIN%sunlit(:))-1) = & - modisMeanLogTauIce - endif - if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) then - cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisMeanSizeLiquid - endif - if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) then - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisMeanSizeIce - endif - if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) then - cospOUT%modis_Cloud_Top_Pressure_Total_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisMeanCloudTopPressure - endif - if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) then - cospOUT%modis_Liquid_Water_Path_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisMeanLiquidWaterPath - endif - if (associated(cospOUT%modis_Ice_Water_Path_Mean)) then - cospOUT%modis_Ice_Water_Path_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisMeanIceWaterPath - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) then - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(ij+ & - int(modisIN%sunlit(:))-1, 1:numModisTauBins, :) = modisJointHistogram(:, :, :) - ! Reorder pressure bins in joint histogram to go from surface to TOA - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(ij:ik,:,:) = & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(ij:ik,:,numMODISPresBins:1:-1) - endif - - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) then - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(ij+ & - int(modisIN%sunlit(:))-1, 1:numModisTauBins, :) = modisJointHistogram_CtpCodLiq(:, :, :) - ! Reorder pressure bins in joint histogram to go from surface to TOA - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(ij:ik,:,:) = & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(ij:ik,:,numMODISPresBins:1:-1) - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) then - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(ij+ & - int(modisIN%sunlit(:))-1, 1:numModisTauBins, :) = modisJointHistogram_CtpCodIce(:, :, :) - ! Reorder pressure bins in joint histogram to go from surface to TOA - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(ij:ik,:,:) = & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(ij:ik,:,numMODISPresBins:1:-1) - endif - if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) then - cospOUT%modis_LWP_vs_ReffLIQ(ij+int(modisIN%sunlit(:))-1, 1:numMODISLWPBins,:) = & - modisJointHistogram_LwpRefLiq(:,:,:) - endif - if (associated(cospOUT%modis_IWP_vs_ReffICE)) then - cospOUT%modis_IWP_vs_ReffICE(ij+int(modisIN%sunlit(:))-1, 1:numMODISIWPBins,:) = & - modisJointHistogram_IwpRefIce(:,:,:) - endif - - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffIce)) then - cospOUT%modis_Optical_Thickness_vs_ReffIce(ij:ik,1:numMODISTauBins,:) = 0.0 - cospOUT%modis_Optical_Thickness_vs_ReffIce(ij+int(modisIN%sunlit(:))-1, 1:numMODISTauBins,:) = & - modisJointHistogramIce(:,:,:) - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLiq)) then - cospOUT%modis_Optical_Thickness_vs_ReffLiq(ij:ik,:,:) = 0.0 - cospOUT%modis_Optical_Thickness_vs_ReffLiq(ij+int(modisIN%sunlit(:))-1, 1:numMODISTauBins,:) = & - modisJointHistogramLiq(:,:,:) - endif - - if(modisIN%nSunlit < modisIN%Npoints) then - ! Where it's night and we haven't done the retrievals the values are undefined - if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & - cospOUT%modis_Cloud_Fraction_Total_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & - cospOUT%modis_Cloud_Fraction_Water_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & - cospOUT%modis_Cloud_Fraction_Ice_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & - cospOUT%modis_Cloud_Fraction_High_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & - cospOUT%modis_Cloud_Fraction_Mid_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & - cospOUT%modis_Cloud_Fraction_Low_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & - cospOUT%modis_Optical_Thickness_Total_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & - cospOUT%modis_Optical_Thickness_Water_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & - cospOUT%modis_Optical_Thickness_Ice_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & - cospOUT%modis_Optical_Thickness_Total_LogMean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & - cospOUT%modis_Optical_Thickness_Water_LogMean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & - cospOUT%modis_Optical_Thickness_Ice_LogMean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & - cospOUT%modis_Cloud_Top_Pressure_Total_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & - cospOUT%modis_Liquid_Water_Path_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & - cospOUT%modis_Ice_Water_Path_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(ij+int(modisIN%notSunlit(:))-1, :, :) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(ij+int(modisIN%notSunlit(:))-1, :, :) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(ij+int(modisIN%notSunlit(:))-1, :, :) = R_UNDEF - end if - else - ! It's nightime everywhere - everything is undefined - if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & - cospOUT%modis_Cloud_Fraction_Total_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & - cospOUT%modis_Cloud_Fraction_Water_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & - cospOUT%modis_Cloud_Fraction_Ice_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & - cospOUT%modis_Cloud_Fraction_High_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & - cospOUT%modis_Cloud_Fraction_Mid_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & - cospOUT%modis_Cloud_Fraction_Low_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & - cospOUT%modis_Optical_Thickness_Total_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & - cospOUT%modis_Optical_Thickness_Water_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & - cospOUT%modis_Optical_Thickness_Ice_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & - cospOUT%modis_Optical_Thickness_Total_LogMean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & - cospOUT%modis_Optical_Thickness_Water_LogMean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & - cospOUT%modis_Optical_Thickness_Ice_LogMean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & - cospOUT%modis_Cloud_Top_Pressure_Total_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & - cospOUT%modis_Liquid_Water_Path_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & - cospOUT%modis_Ice_Water_Path_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(ij:ik, :, :) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(ij+int(modisIN%notSunlit(:))-1, :, :) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(ij+int(modisIN%notSunlit(:))-1, :, :) = R_UNDEF - endif - ! Free up memory (if necessary) - if (allocated(modisRetrievedTau)) deallocate(modisRetrievedTau) - if (allocated(modisRetrievedSize)) deallocate(modisRetrievedSize) - if (allocated(modisRetrievedPhase)) deallocate(modisRetrievedPhase) - if (allocated(modisRetrievedCloudTopPressure)) deallocate(modisRetrievedCloudTopPressure) - if (allocated(modisCftotal)) deallocate(modisCftotal) - if (allocated(modisCfLiquid)) deallocate(modisCfLiquid) - if (allocated(modisCfIce)) deallocate(modisCfIce) - if (allocated(modisCfHigh)) deallocate(modisCfHigh) - if (allocated(modisCfMid)) deallocate(modisCfMid) - if (allocated(modisCfLow)) deallocate(modisCfLow) - if (allocated(modisMeanTauTotal)) deallocate(modisMeanTauTotal) - if (allocated(modisMeanTauLiquid)) deallocate(modisMeanTauLiquid) - if (allocated(modisMeanTauIce)) deallocate(modisMeanTauIce) - if (allocated(modisMeanLogTauTotal)) deallocate(modisMeanLogTauTotal) - if (allocated(modisMeanLogTauLiquid)) deallocate(modisMeanLogTauLiquid) - if (allocated(modisMeanLogTauIce)) deallocate(modisMeanLogTauIce) - if (allocated(modisMeanSizeLiquid)) deallocate(modisMeanSizeLiquid) - if (allocated(modisMeanSizeIce)) deallocate(modisMeanSizeIce) - if (allocated(modisMeanCloudTopPressure)) deallocate(modisMeanCloudTopPressure) - if (allocated(modisMeanLiquidWaterPath)) deallocate(modisMeanLiquidWaterPath) - if (allocated(modisMeanIceWaterPath)) deallocate(modisMeanIceWaterPath) - if (allocated(modisJointHistogram)) deallocate(modisJointHistogram) - if (allocated(modisJointHistogram_CtpCodLiq)) deallocate(modisJointHistogram_CtpCodLiq) - if (allocated(modisJointHistogram_CtpCodIce)) deallocate(modisJointHistogram_CtpCodIce) - if (allocated(modisJointHistogram_LwpRefLiq)) deallocate(modisJointHistogram_LwpRefLiq) - if (allocated(modisJointHistogram_IwpRefIce)) deallocate(modisJointHistogram_IwpRefIce) - if (allocated(modisJointHistogramIce)) deallocate(modisJointHistogramIce) - if (allocated(modisJointHistogramLiq)) deallocate(modisJointHistogramLiq) - if (allocated(isccp_boxttop)) deallocate(isccp_boxttop) - if (allocated(isccp_boxptop)) deallocate(isccp_boxptop) - if (allocated(isccp_boxtau)) deallocate(isccp_boxtau) - if (allocated(isccp_meantbclr)) deallocate(isccp_meantbclr) - if (allocated(isccpLEVMATCH)) deallocate(isccpLEVMATCH) - if (allocated(MODIS_SWATH_MASK)) deallocate(MODIS_SWATH_MASK) - endif - - ! RTTOV multi-instrument - if (Lrttov_column) then - do i=1,cospIN%Ninst_rttov - ! Allocate memory for the outputs - I won't need all of these in every situation. - ! Only allocate clear-sky memory when PC-RTTOV is run. - if (cospIN % cfg_rttov(i) % Lrttov_pc) then - allocate(rttov_bt_clear(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! all-sky brightness temp - allocate(rttov_rad_clear(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! all-sky radiance - rttov_bt_clear(:,:) = R_UNDEF - rttov_rad_clear(:,:) = R_UNDEF - ! Run simulator - call cosp_rttov_simulate(rttovIN,cospIN%cfg_rttov(i), & ! Inputs - cosp_simulator(nError+1), & ! Error message holder - bt_clear=rttov_bt_clear, & ! Clear-sky BT - rad_clear=rttov_rad_clear) ! Clear-sky radiance - else - allocate(rttov_bt_total(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! all-sky brightness temp - allocate(rttov_bt_clear(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! clear-sky brightness temp - allocate(rttov_rad_total(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! all-sky brightness temp - allocate(rttov_rad_clear(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! clear-sky brightness temp - allocate(rttov_rad_cloudy(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! cloudy-sky brightness temp - allocate(rttov_refl_total(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! all-sky Bi-directional reflectance factor - allocate(rttov_refl_clear(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! clear-sky Bi-directional reflectance factor - ! Init to R_UNDEF - rttov_bt_total(:,:) = R_UNDEF - rttov_bt_clear(:,:) = R_UNDEF - rttov_rad_total(:,:) = R_UNDEF - rttov_rad_clear(:,:) = R_UNDEF - rttov_rad_cloudy(:,:) = R_UNDEF - rttov_refl_total(:,:) = R_UNDEF - rttov_refl_clear(:,:) = R_UNDEF - ! Run simulator - call cosp_rttov_simulate(rttovIN,cospIN%cfg_rttov(i), & ! Inputs - cosp_simulator(nError+1), & ! Error message holder - bt_total=rttov_bt_total, & ! Brightness Temp Outputs - bt_clear=rttov_bt_clear, & - rad_total=rttov_rad_total, & ! Radiance Outputs - rad_clear=rttov_rad_clear, & - rad_cloudy=rttov_rad_cloudy, & - refl_total=rttov_refl_total, & ! Reflectance Outputs - refl_clear=rttov_refl_clear, & - debug=verbose) - endif - - ! Write to cospOUT - if (associated(cospOUT % rttov_outputs(i) % channel_indices)) & - cospOUT % rttov_outputs(i) % channel_indices(:) = cospIN % cfg_rttov(i) % iChannel - if (cospIN % cfg_rttov(i) % Lrttov_pc) then - if (associated(cospOUT % rttov_outputs(i) % bt_total_pc)) & - cospOUT % rttov_outputs(i) % bt_total_pc(ij:ik,:) = rttov_bt_clear - if (associated(cospOUT % rttov_outputs(i) % rad_total_pc)) & - cospOUT % rttov_outputs(i) % rad_total_pc(ij:ik,:) = rttov_rad_clear - else - if (associated(cospOUT % rttov_outputs(i) % bt_total)) & - cospOUT % rttov_outputs(i) % bt_total(ij:ik,:) = rttov_bt_total - if (associated(cospOUT % rttov_outputs(i) % bt_clear)) & - cospOUT % rttov_outputs(i) % bt_clear(ij:ik,:) = rttov_bt_clear - if (associated(cospOUT % rttov_outputs(i) % rad_total)) & - cospOUT % rttov_outputs(i) % rad_total(ij:ik,:) = rttov_rad_total - if (associated(cospOUT % rttov_outputs(i) % rad_clear)) & - cospOUT % rttov_outputs(i) % rad_clear(ij:ik,:) = rttov_rad_clear - if (associated(cospOUT % rttov_outputs(i) % rad_cloudy)) & - cospOUT % rttov_outputs(i) % rad_cloudy(ij:ik,:) = rttov_rad_cloudy - if (associated(cospOUT % rttov_outputs(i) % refl_total)) & - cospOUT % rttov_outputs(i) % refl_total(ij:ik,:) = rttov_refl_total - if (associated(cospOUT % rttov_outputs(i) % refl_clear)) & - cospOUT % rttov_outputs(i) % refl_clear(ij:ik,:) = rttov_refl_clear - endif - - ! Free up memory from output (if necessary) - if (allocated(rttov_bt_total)) deallocate(rttov_bt_total) - if (allocated(rttov_bt_clear)) deallocate(rttov_bt_clear) - if (allocated(rttov_rad_total)) deallocate(rttov_rad_total) - if (allocated(rttov_rad_clear)) deallocate(rttov_rad_clear) - if (allocated(rttov_rad_cloudy)) deallocate(rttov_rad_cloudy) - if (allocated(rttov_refl_total)) deallocate(rttov_refl_total) - if (allocated(rttov_refl_clear)) deallocate(rttov_refl_clear) - - end do - - endif - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! 6) Compute multi-instrument products - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - ! CLOUDSAT/CALIPSO products - if (Lradar_lidar_tcc .or. Llidar_only_freq_cloud .or. Lcloudsat_tcc .or. Lcloudsat_tcc2) then - if (calipsoIN%Npoints .gt. 0) then - if (use_vgrid) then - allocate(lidar_only_freq_cloud(cloudsatIN%Npoints,Nlvgrid), & - radar_lidar_tcc(cloudsatIN%Npoints), cloudsat_tcc(cloudsatIN%Npoints), & - cloudsat_tcc2(cloudsatIN%Npoints)) - allocate(betamol_in(cloudsatIN%Npoints,1,cloudsatIN%Nlevels), & - betamolI(cloudsatIN%Npoints,1,Nlvgrid), & - pnormI(cloudsatIN%Npoints,cloudsatIN%Ncolumns,Nlvgrid), & - Ze_totI(cloudsatIN%Npoints,cloudsatIN%Ncolumns,Nlvgrid)) - - ! Regrid in the vertical (*NOTE* This routine requires SFC-2-TOA ordering, so flip - ! inputs and outputs to maintain TOA-2-SFC ordering convention in COSP2.) - ! Use CLOUDSAT masking array here (it is the same as calipso) - if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - betamol_in(:,1,:) = calipso_beta_mol(:,cloudsatIN%Nlevels:1:-1) - call cosp_change_vertical_grid(cloudsatIN%Npoints,1,cloudsatIN%Nlevels, & - cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & - cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1),betamol_in, & - Nlvgrid,vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1), & - betamolI(:,1,Nlvgrid:1:-1)) - call cosp_change_vertical_grid(cloudsatIN%Npoints,cloudsatIN%Ncolumns, & - cloudsatIN%Nlevels,cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & - cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & - calipso_beta_tot(:,:,cloudsatIN%Nlevels:1:-1),Nlvgrid, & - vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1),pnormI(:,:,Nlvgrid:1:-1)) - call cosp_change_vertical_grid(cloudsatIN%Npoints,cloudsatIN%Ncolumns, & - cloudsatIN%Nlevels,cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & - cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & - cloudsatDBZe(:,:,cloudsatIN%Nlevels:1:-1),Nlvgrid,vgrid_zl(Nlvgrid:1:-1), & - vgrid_zu(Nlvgrid:1:-1),Ze_totI(:,:,Nlvgrid:1:-1),log_units=.true.) - else - betamol_in(:,1,:) = calipso_beta_mol(:,cloudsatIN%Nlevels:1:-1) - call cosp_change_vertical_grid(cloudsatIN%Npoints,1,cloudsatIN%Nlevels, & - cospgridIN%hgt_matrix(:,cloudsatIN%Nlevels:1:-1), & - cospgridIN%hgt_matrix_half(:,cloudsatIN%Nlevels:1:-1),betamol_in, & - Nlvgrid,vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1), & - betamolI(:,1,Nlvgrid:1:-1)) - - call cosp_change_vertical_grid(cloudsatIN%Npoints,cloudsatIN%Ncolumns, & - cloudsatIN%Nlevels,cospgridIN%hgt_matrix(:,cloudsatIN%Nlevels:1:-1), & - cospgridIN%hgt_matrix_half(:,cloudsatIN%Nlevels:1:-1), & - calipso_beta_tot(:,:,cloudsatIN%Nlevels:1:-1),Nlvgrid, & - vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1),pnormI(:,:,Nlvgrid:1:-1)) - - call cosp_change_vertical_grid(cloudsatIN%Npoints,cloudsatIN%Ncolumns, & - cloudsatIN%Nlevels,cospgridIN%hgt_matrix(:,cloudsatIN%Nlevels:1:-1), & - cospgridIN%hgt_matrix_half(:,cloudsatIN%Nlevels:1:-1), & - cloudsatDBZe(:,:,cloudsatIN%Nlevels:1:-1),Nlvgrid,vgrid_zl(Nlvgrid:1:-1), & - vgrid_zu(Nlvgrid:1:-1),Ze_totI(:,:,Nlvgrid:1:-1),log_units=.true.) - end if - call cosp_lidar_only_cloud(cloudsatIN%Npoints, cloudsatIN%Ncolumns, Nlvgrid, & - pnormI, betamolI, Ze_totI, lidar_only_freq_cloud, radar_lidar_tcc, & - cloudsat_tcc, cloudsat_tcc2) - deallocate(betamol_in,betamolI,pnormI,ze_totI) - else - allocate(lidar_only_freq_cloud(cloudsatIN%Npoints,cloudsatIN%Nlevels), & - radar_lidar_tcc(cloudsatIN%Npoints), cloudsat_tcc(cloudsatIN%Npoints), & - cloudsat_tcc2(cloudsatIN%Npoints)) - call cosp_lidar_only_cloud(cloudsatIN%Npoints,cloudsatIN%Ncolumns, & - cospIN%Nlevels,calipso_beta_tot(:,:,cloudsatIN%Nlevels:1:-1), & - calipso_beta_mol(:,cloudsatIN%Nlevels:1:-1), & - cloudsatDBZe(:,:,cloudsatIN%Nlevels:1:-1),lidar_only_freq_cloud, & - radar_lidar_tcc, cloudsat_tcc, cloudsat_tcc2) - endif - endif - - ! Store, when necessary - if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - if (associated(cospOUT%lidar_only_freq_cloud)) then - cospOUT%lidar_only_freq_cloud(ij:ik,:) = R_UNDEF - cospOUT%lidar_only_freq_cloud(ij+int(CSCAL_MASK_INDICES(:))-1,:) = lidar_only_freq_cloud(:,:) - endif - if (associated(cospOUT%radar_lidar_tcc)) then - cospOUT%radar_lidar_tcc(ij:ik) = R_UNDEF - cospOUT%radar_lidar_tcc(ij+int(CSCAL_MASK_INDICES(:))-1) = radar_lidar_tcc(:) - endif - if (associated(cospOUT%cloudsat_tcc)) then - cospOUT%cloudsat_tcc(ij:ik) = R_UNDEF - cospOUT%cloudsat_tcc(ij+int(CSCAL_MASK_INDICES(:))-1) = cloudsat_tcc(:) - endif - if (associated(cospOUT%cloudsat_tcc2)) then - cospOUT%cloudsat_tcc2(ij:ik) = R_UNDEF - cospOUT%cloudsat_tcc2(ij+int(CSCAL_MASK_INDICES(:))-1) = cloudsat_tcc2(:) - endif - else - if (associated(cospOUT%lidar_only_freq_cloud)) then - cospOUT%lidar_only_freq_cloud(ij:ik,:) = lidar_only_freq_cloud - endif - if (associated(cospOUT%radar_lidar_tcc)) then - cospOUT%radar_lidar_tcc(ij:ik) = radar_lidar_tcc - endif - if (associated(cospOUT%cloudsat_tcc)) then - cospOUT%cloudsat_tcc(ij:ik) = cloudsat_tcc - endif - if (associated(cospOUT%cloudsat_tcc2)) then - cospOUT%cloudsat_tcc2(ij:ik) = cloudsat_tcc2 - endif - endif - endif - - ! CloudSat/MODIS joint products (CFODDs and Occurrence Frequency of Warm Clouds) - if (Lcloudsat_modis_wr) then - if (cloudsatIN%Npoints .gt. 0) then - allocate( cfodd_ntotal(cloudsatIN%Npoints, CFODD_NDBZE, CFODD_NICOD, CFODD_NCLASS) ) - allocate( wr_occfreq_ntotal(cloudsatIN%Npoints, WR_NREGIME) ) - - if ( use_vgrid ) then - !! interporation for fixed vertical grid: - allocate( zlev(cloudsatIN%Npoints,Nlvgrid), & - t_in(cloudsatIN%Npoints,1,cloudsatIN%Nlevels), & - tempI(cloudsatIN%Npoints,1,Nlvgrid), & - Ze_totI(cloudsatIN%Npoints,cloudsatIN%Ncolumns,Nlvgrid), & - frac_outI(cloudsatIN%Npoints,cloudsatIN%Ncolumns,Nlvgrid) ) - do k = 1, Nlvgrid - zlev(:,k) = vgrid_zu(k) - enddo - ! Use CLOUDSAT masking array here (it is the same as calipso) - if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - t_in(:,1,:) = cospgridIN%at(int(CSCAL_MASK_INDICES(:)),:) - call cosp_change_vertical_grid ( & - cloudsatIN%Npoints, 1, cloudsatIN%Nlevels, & - cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & - cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & - t_in(:,:,cloudsatIN%Nlevels:1:-1), Nlvgrid, & - vgrid_zl(Nlvgrid:1:-1), vgrid_zu(Nlvgrid:1:-1), & - tempI(:,:,Nlvgrid:1:-1) ) - call cosp_change_vertical_grid ( & - cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels, & - cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & - cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & - cloudsatDBZe(:,:,cloudsatIN%Nlevels:1:-1), Nlvgrid, & - vgrid_zl(Nlvgrid:1:-1), vgrid_zu(Nlvgrid:1:-1), & - Ze_totI(:,:,Nlvgrid:1:-1), log_units=.true. ) - call cosp_change_vertical_grid ( & - cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels, & - cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & - cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & - cospIN%frac_out(int(CSCAL_MASK_INDICES(:)),:,cloudsatIN%Nlevels:1:-1), Nlvgrid, & - vgrid_zl(Nlvgrid:1:-1), vgrid_zu(Nlvgrid:1:-1), & - frac_outI(:,:,Nlvgrid:1:-1) ) - call cosp_diag_warmrain( & - cloudsatIN%Npoints, cloudsatIN%Ncolumns, Nlvgrid, & !! in - tempI, zlev, & !! in - cospOUT%modis_Liquid_Water_Path_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Optical_Thickness_Water_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Cloud_Fraction_Water_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Ice_Water_Path_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Optical_Thickness_Ice_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Cloud_Fraction_Ice_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - frac_outI, & !! in - Ze_totI, & !! in - cfodd_ntotal, wr_occfreq_ntotal ) !! inout - else - t_in(:,1,:) = cospgridIN%at(:,:) - call cosp_change_vertical_grid ( & - cloudsatIN%Npoints, 1, cloudsatIN%Nlevels, & - cospgridIN%hgt_matrix(:,cloudsatIN%Nlevels:1:-1), & - cospgridIN%hgt_matrix_half(:,cloudsatIN%Nlevels:1:-1), & - t_in(:,:,cloudsatIN%Nlevels:1:-1), Nlvgrid, & - vgrid_zl(Nlvgrid:1:-1), vgrid_zu(Nlvgrid:1:-1), & - tempI(:,:,Nlvgrid:1:-1) ) - call cosp_change_vertical_grid ( & - cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels, & - cospgridIN%hgt_matrix(:,cloudsatIN%Nlevels:1:-1), & - cospgridIN%hgt_matrix_half(:,cloudsatIN%Nlevels:1:-1), & - cloudsatDBZe(:,:,cloudsatIN%Nlevels:1:-1), Nlvgrid, & - vgrid_zl(Nlvgrid:1:-1), vgrid_zu(Nlvgrid:1:-1), & - Ze_totI(:,:,Nlvgrid:1:-1), log_units=.true. ) - call cosp_change_vertical_grid ( & - cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels, & - cospgridIN%hgt_matrix(:,cloudsatIN%Nlevels:1:-1), & - cospgridIN%hgt_matrix_half(:,cloudsatIN%Nlevels:1:-1), & - cospIN%frac_out(:,:,cloudsatIN%Nlevels:1:-1), Nlvgrid, & - vgrid_zl(Nlvgrid:1:-1), vgrid_zu(Nlvgrid:1:-1), & - frac_outI(:,:,Nlvgrid:1:-1) ) - call cosp_diag_warmrain( & - cloudsatIN%Npoints, cloudsatIN%Ncolumns, Nlvgrid, & !! in - tempI, zlev, & !! in - cospOUT%modis_Liquid_Water_Path_Mean(ij:ik), & !! in - cospOUT%modis_Optical_Thickness_Water_Mean(ij:ik), & !! in - cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij:ik), & !! in - cospOUT%modis_Cloud_Fraction_Water_Mean(ij:ik), & !! in - cospOUT%modis_Ice_Water_Path_Mean(ij:ik), & !! in - cospOUT%modis_Optical_Thickness_Ice_Mean(ij:ik), & !! in - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij:ik), & !! in - cospOUT%modis_Cloud_Fraction_Ice_Mean(ij:ik), & !! in - frac_outI, & !! in - Ze_totI, & !! in - cfodd_ntotal, wr_occfreq_ntotal ) !! inout - endif - deallocate( zlev, t_in, tempI, frac_outI, Ze_totI ) - else ! do not use vgrid interporation ---------------------------------------! - !! original model grid - if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - call cosp_diag_warmrain( & - cloudsatIN%Npoints, cloudsatIN%Ncolumns, cospIN%Nlevels, & !! in - cospgridIN%at(int(CSCAL_MASK_INDICES(:)),:), & !! in - cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),:), & !! in - cospOUT%modis_Liquid_Water_Path_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Optical_Thickness_Water_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Cloud_Fraction_Water_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Ice_Water_Path_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Optical_Thickness_Ice_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Cloud_Fraction_Ice_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospIN%frac_out(int(CSCAL_MASK_INDICES(:)),:,:), & !! in - cloudsatDBZe, & !! in - cfodd_ntotal, wr_occfreq_ntotal ) !! inout - else - call cosp_diag_warmrain( & - cloudsatIN%Npoints, cloudsatIN%Ncolumns, cospIN%Nlevels, & !! in - cospgridIN%at, cospgridIN%hgt_matrix, & !! in - cospOUT%modis_Liquid_Water_Path_Mean(ij:ik), & !! in - cospOUT%modis_Optical_Thickness_Water_Mean(ij:ik), & !! in - cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij:ik), & !! in - cospOUT%modis_Cloud_Fraction_Water_Mean(ij:ik), & !! in - cospOUT%modis_Ice_Water_Path_Mean(ij:ik), & !! in - cospOUT%modis_Optical_Thickness_Ice_Mean(ij:ik), & !! in - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij:ik), & !! in - cospOUT%modis_Cloud_Fraction_Ice_Mean(ij:ik), & !! in - cospIN%frac_out, & !! in - cloudsatDBZe, & !! in - cfodd_ntotal, wr_occfreq_ntotal ) !! inout - endif - endif !! use_vgrid or not - - ! Store, when necessary - if (associated(cospOUT%lidar_only_freq_cloud)) then - if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - cospOUT%lidar_only_freq_cloud(ij+int(CSCAL_MASK_INDICES(:))-1,:) = lidar_only_freq_cloud(:,:) - else - cospOUT%lidar_only_freq_cloud(ij:ik,:) = lidar_only_freq_cloud - endif - endif - - if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays for CSCAL - if (cospIN % cospswathsIN(6) % N_inst_swaths .gt. 0) then ! If MODIS is also swathed then use the joint mask MODIS_CSCAL_MASK_INDICES for setting R_UNDEF - if ( associated(cospOUT%cfodd_ntotal) ) then - cospOUT%cfodd_ntotal(ij+int(CSCAL_MASK_INDICES(:))-1,:,:,:) = cfodd_ntotal - cospOUT%cfodd_ntotal(ij+int(MODIS_CSCAL_MASK_INDICES(:))-1,:,:,:) = R_UNDEF - endif - if ( associated(cospOUT%wr_occfreq_ntotal) ) then - cospOUT%wr_occfreq_ntotal(ij+int(CSCAL_MASK_INDICES(:))-1,:) = wr_occfreq_ntotal - cospOUT%wr_occfreq_ntotal(ij+int(MODIS_CSCAL_MASK_INDICES(:))-1,:) = R_UNDEF - endif - else - if ( associated(cospOUT%cfodd_ntotal) ) then - cospOUT%cfodd_ntotal(ij:ik,:,:,:) = R_UNDEF - cospOUT%cfodd_ntotal(ij+int(CSCAL_MASK_INDICES(:))-1,:,:,:) = cfodd_ntotal - endif - if ( associated(cospOUT%wr_occfreq_ntotal) ) then - cospOUT%wr_occfreq_ntotal(ij:ik,:) = R_UNDEF - cospOUT%wr_occfreq_ntotal(ij+int(CSCAL_MASK_INDICES(:))-1,:) = wr_occfreq_ntotal - endif - endif - else - if ( associated(cospOUT%cfodd_ntotal) ) then - cospOUT%cfodd_ntotal(ij:ik,:,:,:) = cfodd_ntotal - endif - if ( associated(cospOUT%wr_occfreq_ntotal) ) then - cospOUT%wr_occfreq_ntotal(ij:ik,:) = wr_occfreq_ntotal - endif - endif - else - if ( associated(cospOUT%cfodd_ntotal) ) cospOUT%cfodd_ntotal(ij:ik,:,:,:) = R_UNDEF - if ( associated(cospOUT%wr_occfreq_ntotal) ) cospOUT%wr_occfreq_ntotal(ij:ik,:) = R_UNDEF - endif - endif - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! 7) Cleanup - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (Lisccp_subcolumn .or. Lmodis_subcolumn) then - nullify(isccpIN%Ncolumns,isccpIN%Nlevels,isccpIN%emsfc_lw, & - isccpIN%skt,isccpIN%qv,isccpIN%at,isccpIN%frac_out,isccpIN%dtau, & - isccpIN%dem,isccpIN%phalf,isccpIN%sunlit,isccpIN%pfull) - call COSP_ASSIGN_isccpIN_CLEAN() - endif - - if (Lmisr_subcolumn) then - nullify(misrIN%Ncolumns,misrIN%Nlevels,misrIN%dtau,misrIN%sunlit, & - misrIN%zfull,misrIN%at) - call COSP_ASSIGN_misrIN_CLEAN() - endif - - if (Lcalipso_subcolumn) then - nullify(calipsoIN%Ncolumns,calipsoIN%Nlevels,calipsoIN%beta_mol,& - calipsoIN%betatot,calipsoIN%betatot_liq,calipsoIN%betatot_ice, & - calipsoIN%tau_mol,calipsoIN%tautot,calipsoIN%tautot_liq,calipsoIN%tautot_ice) - if (allocated(CSCAL_MASK_INDICES)) deallocate(CSCAL_MASK_INDICES) - if (allocated(CSCAL_SWATH_MASK)) deallocate(CSCAL_SWATH_MASK) - call COSP_ASSIGN_calipsoIN_CLEAN() - endif - - if (LgrLidar532_subcolumn) then - nullify(grLidar532IN%Npoints,grLidar532IN%Ncolumns,grLidar532IN%Nlevels,grLidar532IN%beta_mol, & - grLidar532IN%betatot,grLidar532IN%tau_mol,grLidar532IN%tautot) - endif - - if (Latlid_subcolumn) then - nullify(atlidIN%Ncolumns,atlidIN%Nlevels,atlidIN%beta_mol_atlid, & - atlidIN%betatot_atlid,atlidIN%tau_mol_atlid,atlidIN%tautot_atlid) - call COSP_ASSIGN_atlidIN_CLEAN() - endif - - if (Lparasol_subcolumn) then - nullify(parasolIN%Nlevels,parasolIN%Ncolumns,parasolIN%Nrefl, & - parasolIN%tautot_S_liq,parasolIN%tautot_S_ice) - call COSP_ASSIGN_parasolIN_CLEAN() - endif - - if (Lcloudsat_subcolumn) then - nullify(cloudsatIN%Nlevels,cloudsatIN%Ncolumns,cloudsatIN%rcfg,& - cloudsatIN%kr_vol,cloudsatIN%g_vol,cloudsatIN%z_vol,cloudsatIN%hgt_matrix) - call COSP_ASSIGN_cloudsatIN_CLEAN() - if (allocated(CSCAL_MASK_INDICES)) deallocate(CSCAL_MASK_INDICES) - if (allocated(CSCAL_SWATH_MASK)) deallocate(CSCAL_SWATH_MASK) - endif - - if (Lmodis_subcolumn) then - nullify(modisIN%Npoints,modisIN%Ncolumns,modisIN%Nlevels,modisIN%tau,modisIN%g, & - modisIN%liqFrac,modisIN%w0) - if (allocated(modisIN%sunlit)) deallocate(modisIN%sunlit) - if (allocated(modisIN%notSunlit)) deallocate(modisIN%notSunlit) - if (allocated(modisIN%pres)) deallocate(modisIN%pres) - if (allocated(MODIS_CSCAL_MASK_INDICES)) deallocate(MODIS_CSCAL_MASK_INDICES) - endif - - if (Lrttov_column) then - nullify(rttovIN%nPoints,rttovIN%nLevels,rttovIN%nSubCols,rttovIN%co2,rttovIN%ch4, & - rttovIN%n2o,rttovIN%co,rttovIN%h_surf,rttovIN%u_surf,rttovIN%v_surf, & - rttovIN%t_skin,rttovIN%p_surf,rttovIN%sfcmask,rttovIN%latitude, & - rttovIN%longitude,rttovIN%p,rttovIN%ph,rttovIN%q2m,rttovIN%t2m,rttovIN%t, & - rttovIN%q,rttovIN%o3,rttovIN%rttov_date,rttovIN%rttov_time,rttovIN%tca, & - rttovIN%cldLiq,rttovIN%cldIce,rttovIN%DeffLiq,rttovIN%DeffIce, & - rttovIN%fl_rain,rttovIN%fl_snow) - endif - - if (allocated(calipso_beta_tot)) deallocate(calipso_beta_tot) - if (allocated(grLidar532_beta_tot)) deallocate(grLidar532_beta_tot) - if (allocated(atlid_beta_tot)) deallocate(atlid_beta_tot) - if (allocated(calipso_beta_mol)) deallocate(calipso_beta_mol) - if (allocated(grLidar532_beta_mol)) deallocate(grLidar532_beta_mol) - if (allocated(atlid_beta_mol)) deallocate(atlid_beta_mol) - if (allocated(calipso_betaperp_tot)) deallocate(calipso_betaperp_tot) - if (allocated(cloudsatDBZe)) deallocate(cloudsatDBZe) - if (allocated(lidar_only_freq_cloud)) deallocate(lidar_only_freq_cloud) - if (allocated(radar_lidar_tcc)) deallocate(radar_lidar_tcc) - if (allocated(cloudsat_tcc)) deallocate(cloudsat_tcc) - if (allocated(cloudsat_tcc2)) deallocate(cloudsat_tcc2) - if (allocated(cfodd_ntotal)) deallocate(cfodd_ntotal) - if (allocated(wr_occfreq_ntotal)) deallocate(wr_occfreq_ntotal) - - end function COSP_SIMULATOR - ! ###################################################################################### - ! SUBROUTINE cosp_init - ! ###################################################################################### - SUBROUTINE COSP_INIT(Lisccp, Lmodis, Lmisr, Lcloudsat, Lcalipso, LgrLidar532, Latlid, Lparasol, Lrttov, & - cloudsat_radar_freq, cloudsat_k2, cloudsat_use_gas_abs, cloudsat_do_ray, & - isccp_top_height, isccp_top_height_direction, surface_radar, rcfg, lusevgrid, & - luseCSATvgrid, Nvgrid, Nlevels, cloudsat_micro_scheme, & - rttov_Ninstruments, rttov_instrument_namelists,rttov_configs,unitn,debug) - - ! INPUTS - logical,intent(in) :: Lisccp,Lmodis,Lmisr,Lcloudsat,Lcalipso,LgrLidar532,Latlid,Lparasol - logical,intent(inout) :: Lrttov - integer,intent(in) :: & - cloudsat_use_gas_abs, & ! - cloudsat_do_ray, & ! - isccp_top_height, & ! - isccp_top_height_direction, & ! - Nlevels, & ! - Nvgrid, & ! Number of levels for new L3 grid - surface_radar, & ! - rttov_Ninstruments - real(wp),intent(in) :: & - cloudsat_radar_freq, & ! - cloudsat_k2 ! - logical,intent(in) :: & - lusevgrid, & ! Switch to use different vertical grid - luseCSATvgrid ! Switch to use CLOUDSAT grid spacing for new - ! vertical grid - character(len=64),intent(in) :: & - cloudsat_micro_scheme ! Microphysical scheme used by CLOUDSAT - - type(character(len=256)), dimension(rttov_Ninstruments) :: & - rttov_instrument_namelists ! Array of paths to RTTOV instrument namelists - - ! OUTPUTS - type(radar_cfg) :: rcfg - type(rttov_cfg), dimension(:), allocatable,intent(inout) :: rttov_configs - - ! Optional args - integer,intent(in),Optional :: unitn ! Used for io limits - logical,intent(in),Optional :: debug - logical :: verbose = .false. - - ! Local variables - integer :: i - real(wp) :: zstep - - ! Init debug print statements: - if (present(debug)) verbose = debug - - ! Initialize MODIS optical-depth bin boundaries for joint-histogram. (defined in cosp_config.F90) - if (.not. allocated(modis_histTau)) then - allocate(modis_histTau(ntau+1),modis_histTauEdges(2,ntau),modis_histTauCenters(ntau)) - numMODISTauBins = ntau - modis_histTau = tau_binBounds - modis_histTauEdges = tau_binEdges - modis_histTauCenters = tau_binCenters - endif - - ! Set up vertical grid used by CALIPSO and CLOUDSAT L3 - use_vgrid = lusevgrid - - if (use_vgrid) then - Nlvgrid = Nvgrid - allocate(vgrid_zl(Nlvgrid),vgrid_zu(Nlvgrid),vgrid_z(Nlvgrid),dz(Nlvgrid)) - ! CloudSat grid requested - if (luseCSATvgrid) zstep = 480._wp - ! Other grid requested. Constant vertical spacing with top at 20 km - if (.not. luseCSATvgrid) zstep = 20000._wp/Nvgrid - do i=1,Nvgrid - vgrid_zl(Nlvgrid-i+1) = (i-1)*zstep - vgrid_zu(Nlvgrid-i+1) = i*zstep - enddo - vgrid_z = (vgrid_zl+vgrid_zu)/2._wp - dz = zstep - else - Nlvgrid = Nlevels - allocate(vgrid_zl(Nlvgrid),vgrid_zu(Nlvgrid),vgrid_z(Nlvgrid),dz(Nlvgrid)) - vgrid_zl = 0._wp - vgrid_zu = 0._wp - vgrid_z = 0._wp - dz = 0._wp - endif - - ! Initialize simulators - if (Lisccp) call cosp_isccp_init(isccp_top_height,isccp_top_height_direction) - if (Lmodis) call cosp_modis_init() - if (Lmisr) call cosp_misr_init() - - if (Lrttov) then - if (present(unitn)) then - call cosp_rttov_init(Lrttov,Nlevels,rttov_Ninstruments, & - rttov_instrument_namelists, & - rttov_configs,unitn=unitn, & - debug=verbose) - else - call cosp_rttov_init(Lrttov,Nlevels,rttov_Ninstruments, & - rttov_instrument_namelists, & - rttov_configs,debug=verbose) - end if - endif - - if (Lcloudsat) call cosp_cloudsat_init(cloudsat_radar_freq,cloudsat_k2, & - cloudsat_use_gas_abs,cloudsat_do_ray,R_UNDEF,N_HYDRO, surface_radar, & - rcfg,cloudsat_micro_scheme) - if (Lcalipso) call cosp_calipso_init() - if (LgrLidar532) call cosp_grLidar532_init() - if (Latlid) call cosp_atlid_init() - if (Lparasol) call cosp_parasol_init() - - linitialization = .FALSE. - END SUBROUTINE COSP_INIT - - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE cosp_errorCheck - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - subroutine cosp_errorCheck(cospgridIN, cospIN, Lisccp_subcolumn, Lisccp_column, & - Lmisr_subcolumn, Lmisr_column, Lmodis_subcolumn, Lmodis_column, Lcloudsat_subcolumn, & - Lcloudsat_column, Lcalipso_subcolumn, Lcalipso_column, Latlid_subcolumn, & - Latlid_column, LgrLidar532_subcolumn, LgrLidar532_column, & - Lrttov_column, Lparasol_subcolumn, Lparasol_column, Lradar_lidar_tcc, & - Llidar_only_freq_cloud, Lcloudsat_tcc, Lcloudsat_tcc2, Lcloudsat_modis_wr, & - cospOUT, errorMessage, nError) - - ! Inputs - type(cosp_column_inputs),intent(in) :: & - cospgridIN ! Model grid inputs to COSP - type(cosp_optical_inputs),intent(in) :: & - cospIN ! Derived (optical) input to COSP - - ! Outputs - logical,intent(inout) :: & - Lisccp_subcolumn, & ! ISCCP subcolumn simulator on/off switch - Lisccp_column, & ! ISCCP column simulator on/off switch - Lmisr_subcolumn, & ! MISR subcolumn simulator on/off switch - Lmisr_column, & ! MISR column simulator on/off switch - Lmodis_subcolumn, & ! MODIS subcolumn simulator on/off switch - Lmodis_column, & ! MODIS column simulator on/off switch - Lcloudsat_subcolumn, & ! CLOUDSAT subcolumn simulator on/off switch - Lcloudsat_column, & ! CLOUDSAT column simulator on/off switch - Lcalipso_subcolumn, & ! CALIPSO subcolumn simulator on/off switch - Lcalipso_column, & ! CALIPSO column simulator on/off switch - Latlid_subcolumn, & ! EarthCare subcolumn simulator on/off switch - Latlid_column, & ! EarthCare column simulator on/off switch - LgrLidar532_subcolumn, & ! Ground Lidar subcolumn simulator on/off switch - LgrLidar532_column, & ! Ground Lidar column simulator on/off switch - Lparasol_subcolumn, & ! PARASOL subcolumn simulator on/off switch - Lparasol_column, & ! PARASOL column simulator on/off switch - Lrttov_column, & ! RTTOV column simulator on/off switch - Lcloudsat_tcc, & ! - Lcloudsat_tcc2, & ! - Lradar_lidar_tcc, & ! On/Off switch for joint Calipso/Cloudsat product - Llidar_only_freq_cloud, & ! On/Off switch for joint Calipso/Cloudsat product - Lcloudsat_modis_wr ! On/Off switch for joint CloudSat/MODIS warm rain product - type(cosp_outputs),intent(inout) :: & - cospOUT ! COSP Outputs - character(len=256),dimension(100) :: errorMessage - integer,intent(out) :: nError - - ! Local variables - logical :: alloc_status - integer :: i - - nError = 0 - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! PART 0: Ensure that the inputs needed by the requested simulators are allocated. - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! ISCCP simulator - if (Lisccp_subcolumn .or. Lisccp_column) then - alloc_status = .true. - if (.not. allocated(cospgridIN%skt)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospgridIN%skt has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%qv)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospgridIN%qv has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%at)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospgridIN%at has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%frac_out)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospIN%frac_out has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%tau_067)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospIN%tau_067 has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%emiss_11)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospIN%emiss_11 has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%phalf)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospgridIN%phalf has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%sunlit)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospgridIN%sunlit has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%pfull)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospgridIN%pfull has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - Lisccp_subcolumn = .false. - Lisccp_column = .false. - if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF - if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF - if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF - if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF - if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF - if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF - if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF - if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF - if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF - endif - endif - - ! MISR simulator - if (Lmisr_subcolumn .or. Lmisr_column) then - alloc_status = .true. - if (.not. allocated(cospIN%tau_067)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (MISR simulator): cospIN%tau_067 has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%sunlit)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (MISR simulator): cospgridIN%sunlit has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%hgt_matrix)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (MISR simulator): cospgridIN%hgt_matrix has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%at)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (MISR simulator): cospgridIN%at has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - Lmisr_subcolumn = .false. - Lmisr_column = .false. - if (associated(cospOUT%misr_fq)) cospOUT%misr_fq(:,:,:) = R_UNDEF - if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(:,:) = R_UNDEF - if (associated(cospOUT%misr_meanztop)) cospOUT%misr_meanztop(:) = R_UNDEF - if (associated(cospOUT%misr_cldarea)) cospOUT%misr_cldarea(:) = R_UNDEF - endif - endif - - ! EarthCare Lidar simulator. - if (Latlid_subcolumn .or. Latlid_column) then - alloc_status = .true. - if (.not. allocated(cospIN%beta_mol_atlid)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospIN%beta_mol_atlid has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%betatot_atlid)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospIN%betatot_atlid has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%tau_mol_atlid)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospIN%tau_mol_atlid has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%tautot_atlid)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospIN%tautot_atlid has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - Latlid_subcolumn = .false. - Latlid_column = .false. - if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%atlid_beta_mol)) cospOUT%atlid_beta_mol(:,:) = R_UNDEF - if (associated(cospOUT%atlid_beta_tot)) cospOUT%atlid_beta_tot(:,:,:) = R_UNDEF - endif - - ! EarthCare column simulator requires additional inputs not required by the subcolumn simulator. - alloc_status = .true. - if (.not. allocated(cospgridIN%hgt_matrix)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospgridIN%hgt_matrix has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%hgt_matrix_half)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospgridIN%hgt_matrix_half has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%phalf)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospgridIN%phalf has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - Latlid_column = .false. - if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF - endif - endif - - ! Ground Lidar simulator. - if (LgrLidar532_subcolumn .or. LgrLidar532_column) then - alloc_status = .true. - if (.not. allocated(cospIN%beta_mol_grLidar532)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospIN%beta_mol_grLidar532 has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%betatot_grLidar532)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospIN%betatot_grLidar532 has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%tau_mol_grLidar532)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospIN%tau_mol_grLidar532 has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%tautot_grLidar532)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospIN%tautot_grLidar532 has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - LgrLidar532_subcolumn = .false. - LgrLidar532_column = .false. - if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_beta_mol)) cospOUT%grLidar532_beta_mol(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_beta_tot)) cospOUT%grLidar532_beta_tot(:,:,:) = R_UNDEF - endif - - ! Ground Lidar column simulator requires additional inputs not required by the subcolumn simulator. - alloc_status = .true. - if (.not. allocated(cospgridIN%hgt_matrix)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospgridIN%hgt_matrix has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%hgt_matrix_half)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospgridIN%hgt_matrix_half has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%phalf)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospgridIN%phalf has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - LgrLidar532_column = .false. - if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF - endif - endif - - ! Calipso Lidar simulator - if (Lcalipso_subcolumn .or. Lcalipso_column) then - alloc_status = .true. - if (.not. allocated(cospIN%beta_mol_calipso)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospIN%beta_mol_calipso has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%betatot_calipso)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospIN%betatot_calipso has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%betatot_liq_calipso)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator):'//& - ' cospIN%betatot_liq_calipso has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%betatot_ice_calipso)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator):'//& - ' cospIN%betatot_ice_calipso has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%tau_mol_calipso)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospIN%tau_mol_calipso has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%tautot_calipso)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospIN%tautot_calipso has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%tautot_liq_calipso)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator):'//& - ' cospIN%tautot_liq has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%tautot_ice_calipso)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator):'//& - ' cospIN%tautot_ice has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - Lcalipso_subcolumn = .false. - Lcalipso_column = .false. - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_beta_mol)) cospOUT%calipso_beta_mol(:,:) = R_UNDEF - if (associated(cospOUT%calipso_beta_tot)) cospOUT%calipso_beta_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_betaperp_tot)) cospOUT%calipso_betaperp_tot(:,:,:) = R_UNDEF - ! Also, turn-off joint-products - if (Lradar_lidar_tcc) then - Lradar_lidar_tcc = .false. - if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF - endif - if (Lcloudsat_tcc) then - Lcloudsat_tcc = .false. - if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF - endif - if (Lcloudsat_tcc2) then - Lcloudsat_tcc2 = .false. - if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF - endif - if (Llidar_only_freq_cloud) then - Llidar_only_freq_cloud = .false. - if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF - endif - endif - - ! Calipso column simulator requires additional inputs not required by the subcolumn simulator. - alloc_status = .true. - if (.not. allocated(cospgridIN%hgt_matrix)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator):'//& - ' cospgridIN%hgt_matrix has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%hgt_matrix_half)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator):'//& - ' cospgridIN%hgt_matrix_half has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%at)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospgridIN%at has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%surfelev)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospgridIN%surfelev has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%phalf)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospgridIN%phalf has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - Lcalipso_column = .false. - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (Lcloudsat_tcc) then - Lcloudsat_tcc = .false. - if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF - endif - if (Lcloudsat_tcc2) then - Lcloudsat_tcc2 = .false. - if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF - endif - ! Also, turn-off joint-products - if (Lradar_lidar_tcc) then - Lradar_lidar_tcc = .false. - if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF - endif - if (Llidar_only_freq_cloud) then - Llidar_only_freq_cloud = .false. - if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF - endif - endif - endif - - ! PARASOL simulator - if (Lparasol_subcolumn .or. Lparasol_column) then - alloc_status = .true. - if (.not. allocated(cospIN%tautot_S_liq)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (PARASOL simulator): cospIN%tautot_S_liq has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%tautot_S_ice)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (PARASOL simulator): cospIN%tautot_S_ice has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - Lparasol_subcolumn = .false. - Lparasol_column = .false. - if (associated(cospOUT%parasolPix_refl)) cospOUT%parasolPix_refl(:,:,:) = R_UNDEF - if (associated(cospOUT%parasolGrid_refl)) cospOUT%parasolGrid_refl(:,:) = R_UNDEF - endif - - ! PARASOL column simulator requires additional inputs not required by the subcolumn simulator. - alloc_status = .true. - if (.not. allocated(cospgridIN%land)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (PARASOL simulator): cospgridIN%land has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - Lparasol_column = .false. - if (associated(cospOUT%parasolGrid_refl)) cospOUT%parasolGrid_refl(:,:) = R_UNDEF - endif - endif - - ! Cloudsat radar simulator - if (Lcloudsat_subcolumn .or. Lcloudsat_column) then - alloc_status = .true. - if (.not. allocated(cospIN%z_vol_cloudsat)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Cloudsat radar simulator):'//& - ' cospIN%z_vol_cloudsat has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%kr_vol_cloudsat)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Cloudsat radar simulator):'//& - ' cospIN%kr_vol_cloudsat has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%g_vol_cloudsat)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Cloudsat radar simulator):'//& - ' cospIN%g_vol_cloudsat has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%hgt_matrix)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Cloudsat radar simulator):'//& - ' cospgridIN%hgt_matrix has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%surfelev)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Cloudsat radar simulator):'//& - ' cospgridIN%surfelev has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - Lcloudsat_subcolumn = .false. - Lcloudsat_column = .false. - if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF - if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(:,:,:) = R_UNDEF - if (Lcloudsat_tcc) then - Lcloudsat_tcc = .false. - if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF - endif - if (Lcloudsat_tcc2) then - Lcloudsat_tcc2 = .false. - if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF - endif - ! Also, turn-off joint-products - if (Lradar_lidar_tcc) then - Lradar_lidar_tcc = .false. - if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF - endif - if (Llidar_only_freq_cloud) then - Llidar_only_freq_cloud = .false. - if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF - endif - if (Lcloudsat_modis_wr) then - Lcloudsat_modis_wr = .false. - if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF - if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF - endif - endif - - ! Cloudsat column simulator requires additional inputs not required by the subcolumn simulator. - alloc_status = .true. - if (.not. allocated(cospgridIN%hgt_matrix_half)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Cloudsat radar simulator):'//& - ' cospgridIN%hgt_matrix_half has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - Lcloudsat_column = .false. - if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF - if (Lcloudsat_tcc) then - Lcloudsat_tcc = .false. - if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF - endif - if (Lcloudsat_tcc2) then - Lcloudsat_tcc2 = .false. - if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF - endif - ! Also, turn-off joint-products - if (Lradar_lidar_tcc) then - Lradar_lidar_tcc = .false. - if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF - endif - if (Llidar_only_freq_cloud) then - Llidar_only_freq_cloud = .false. - if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF - endif - if (Lcloudsat_modis_wr) then - Lcloudsat_modis_wr = .false. - if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF - if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF - endif - endif - endif - - ! MODIS simulator - if (Lmodis_subcolumn .or. Lmodis_column) then - alloc_status = .true. - if (.not. allocated(cospIN%fracLiq)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (MODIS simulator): cospIN%fracLiq has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%tau_067)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (MODIS simulator): cospIN%tau_067 has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%asym)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (MODIS simulator): cospIN%asym has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%ss_alb)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (MODIS simulator): cospIN%ss_alb has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%sunlit)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (MODIS simulator): cospgridIN%sunlit has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - Lmodis_subcolumn = .false. - Lmodis_column = .false. - if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & - cospOUT%modis_Cloud_Fraction_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & - cospOUT%modis_Cloud_Fraction_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & - cospOUT%modis_Cloud_Fraction_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & - cospOUT%modis_Cloud_Fraction_High_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & - cospOUT%modis_Cloud_Fraction_Mid_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & - cospOUT%modis_Cloud_Fraction_Low_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & - cospOUT%modis_Optical_Thickness_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & - cospOUT%modis_Optical_Thickness_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & - cospOUT%modis_Optical_Thickness_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & - cospOUT%modis_Optical_Thickness_Total_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & - cospOUT%modis_Optical_Thickness_Water_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & - cospOUT%modis_Optical_Thickness_Ice_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & - cospOUT%modis_Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & - cospOUT%modis_Liquid_Water_Path_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & - cospOUT%modis_Ice_Water_Path_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) & - cospOUT%modis_LWP_vs_ReffLIQ(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_IWP_vs_ReffICE)) & - cospOUT%modis_IWP_vs_ReffICE(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) & - cospOUT%modis_Optical_Thickness_vs_ReffICE(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) & - cospOUT%modis_Optical_Thickness_vs_ReffLIQ(:,:,:) = R_UNDEF - ! Also, turn-off joint-products - if (Lcloudsat_modis_wr) then - Lcloudsat_modis_wr = .false. - if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF - if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF - endif - endif - endif - - ! RTTOV - if (Lrttov_column) then - alloc_status = .true. -! if (.not. allocated(cospgridIN%emis_in)) then -! nError=nError+1 -! errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%emis_in has not been allocated' -! alloc_status = .false. -! endif -! if (.not. allocated(cospgridIN%refl_in)) then -! nError=nError+1 -! errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%refl_in has not been allocated' -! alloc_status = .false. -! endif - if (.not. allocated(cospgridIN%hgt_matrix_half)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%hgt_matrix_half has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%u_sfc)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%u_sfc has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%v_sfc)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%v_sfc has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%skt)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%skt has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%phalf)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%phalf has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%qv)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%qv has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%at)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%at has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%rttov_sfcmask)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV simulator): cospgridIN%rttov_sfcmask has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%lat)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%lat has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%lon)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%lon has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%pfull)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%pfull has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%phalf)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%phalf has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%at)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%at has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%qv)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%qv has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%o3)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%o3 has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%tca)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%tca has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%sza)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%sza has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%cloudIce)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%cloudIce has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%cloudLiq)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%cloudLiq has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%fl_rain)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%fl_rain has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%fl_snow)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%fl_snow has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%rttov_date)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%rttov_date has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%rttov_time)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%rttov_time has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - endif - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! PART 1: Check input array values for out-of-bounds values. When an out-of-bound value - ! is encountered, COSP outputs that are dependent on that input are filled with - ! an undefined value (set in cosp_config.f90) and if necessary, that simulator - ! is turned off. - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (any([Lisccp_subcolumn, Lisccp_column, Lmisr_subcolumn, Lmisr_column, & - Lmodis_subcolumn, Lmodis_column, Lcloudsat_modis_wr])) then - if (any(cospgridIN%sunlit .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%sunlit contains values out of range (0 or 1)' - Lisccp_subcolumn = .false. - Lisccp_column = .false. - Lmisr_subcolumn = .false. - Lmisr_column = .false. - Lmodis_subcolumn = .false. - Lmodis_column = .false. - Lcloudsat_modis_wr = .false. - if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF - if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF - if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF - if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF - if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF - if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF - if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF - if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF - if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF - if (associated(cospOUT%misr_fq)) cospOUT%misr_fq(:,:,:) = R_UNDEF - if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(:,:) = R_UNDEF - if (associated(cospOUT%misr_meanztop)) cospOUT%misr_meanztop(:) = R_UNDEF - if (associated(cospOUT%misr_cldarea)) cospOUT%misr_cldarea(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & - cospOUT%modis_Cloud_Fraction_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & - cospOUT%modis_Cloud_Fraction_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & - cospOUT%modis_Cloud_Fraction_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & - cospOUT%modis_Cloud_Fraction_High_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & - cospOUT%modis_Cloud_Fraction_Mid_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & - cospOUT%modis_Cloud_Fraction_Low_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & - cospOUT%modis_Optical_Thickness_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & - cospOUT%modis_Optical_Thickness_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & - cospOUT%modis_Optical_Thickness_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & - cospOUT%modis_Optical_Thickness_Total_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & - cospOUT%modis_Optical_Thickness_Water_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & - cospOUT%modis_Optical_Thickness_Ice_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & - cospOUT%modis_Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & - cospOUT%modis_Liquid_Water_Path_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & - cospOUT%modis_Ice_Water_Path_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) & - cospOUT%modis_LWP_vs_ReffLIQ(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_IWP_vs_ReffICE)) & - cospOUT%modis_IWP_vs_ReffICE(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) & - cospOUT%modis_Optical_Thickness_vs_ReffICE(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) & - cospOUT%modis_Optical_Thickness_vs_ReffLIQ(:,:,:) = R_UNDEF - if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF - if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF - endif - endif - - if (any([Lisccp_subcolumn, Lisccp_column, Lmisr_subcolumn, Lmisr_column, Lrttov_column,& - Lcalipso_column, Lcloudsat_column, Lradar_lidar_tcc,Llidar_only_freq_cloud, & - Lcloudsat_tcc, Lcloudsat_tcc2, Lcloudsat_modis_wr])) then - if (any(cospgridIN%at .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%at contains values out of range (at<0), expected units (K)' - Lisccp_subcolumn = .false. - Lisccp_column = .false. - Lmisr_subcolumn = .false. - Lmisr_column = .false. - Lrttov_column = .false. - Lcalipso_column = .false. - Lcloudsat_column = .false. - Lradar_lidar_tcc = .false. - Llidar_only_freq_cloud = .false. - Lcloudsat_tcc = .false. - Lcloudsat_tcc2 = .false. - Lcloudsat_modis_wr = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF - if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF - if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF - if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF - if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF - if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF - if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF - if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF - if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF - if (associated(cospOUT%misr_fq)) cospOUT%misr_fq(:,:,:) = R_UNDEF - if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(:,:) = R_UNDEF - if (associated(cospOUT%misr_meanztop)) cospOUT%misr_meanztop(:) = R_UNDEF - if (associated(cospOUT%misr_cldarea)) cospOUT%misr_cldarea(:) = R_UNDEF - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF - if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF - if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF - if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF - if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF - endif - endif - if (any([Lisccp_subcolumn, Lisccp_column, Lrttov_column])) then - if (any(cospgridIN%pfull .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%pfull contains values out of range' - Lisccp_subcolumn = .false. - Lisccp_column = .false. - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF - if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF - if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF - if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF - if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF - if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF - if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF - if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF - if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF - endif - endif - if (any([Lisccp_subcolumn,Lisccp_column,Lmodis_subcolumn,Lmodis_column,Lcalipso_column,Lrttov_column,& - LgrLidar532_column,Latlid_column])) then - if (any(cospgridIN%phalf .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%phalf contains values out of range' - Lisccp_subcolumn = .false. - Lisccp_column = .false. - Lmodis_subcolumn = .false. - Lmodis_column = .false. - Lcalipso_column = .false. - Lrttov_column = .false. - Latlid_column = .false. - LgrLidar532_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF - if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF - if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF - if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF - if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF - if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF - if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF - if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF - if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & - cospOUT%modis_Cloud_Fraction_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & - cospOUT%modis_Cloud_Fraction_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & - cospOUT%modis_Cloud_Fraction_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & - cospOUT%modis_Cloud_Fraction_High_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & - cospOUT%modis_Cloud_Fraction_Mid_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & - cospOUT%modis_Cloud_Fraction_Low_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & - cospOUT%modis_Optical_Thickness_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & - cospOUT%modis_Optical_Thickness_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & - cospOUT%modis_Optical_Thickness_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & - cospOUT%modis_Optical_Thickness_Total_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & - cospOUT%modis_Optical_Thickness_Water_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & - cospOUT%modis_Optical_Thickness_Ice_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & - cospOUT%modis_Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & - cospOUT%modis_Liquid_Water_Path_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & - cospOUT%modis_Ice_Water_Path_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) & - cospOUT%modis_LWP_vs_ReffLIQ(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_IWP_vs_ReffICE)) & - cospOUT%modis_IWP_vs_ReffICE(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) & - cospOUT%modis_Optical_Thickness_vs_ReffICE(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) & - cospOUT%modis_Optical_Thickness_vs_ReffLIQ(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - endif - endif - if (any([Lisccp_subcolumn,Lisccp_column,Lrttov_column])) then - if (any(cospgridIN%qv .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%qv contains values out of range' - Lisccp_subcolumn = .false. - Lisccp_column = .false. - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF - if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF - if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF - if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF - if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF - if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF - if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF - if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF - if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF - endif - endif - if (any([Lmisr_subcolumn,Lmisr_column,Lcloudsat_subcolumn,Lcloudsat_column,Lcalipso_column,Lradar_lidar_tcc,& - Llidar_only_freq_cloud,LgrLidar532_column,Latlid_column,Lcloudsat_tcc, Lcloudsat_tcc2, & - Lcloudsat_modis_wr])) then - if (any(cospgridIN%hgt_matrix .lt. -300)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%hgt_matrix contains values out of range' - Lmisr_subcolumn = .false. - Lmisr_column = .false. - Lcloudsat_subcolumn = .false. - Lcloudsat_column = .false. - Lcalipso_column = .false. - Lradar_lidar_tcc = .false. - Llidar_only_freq_cloud = .false. - Lcloudsat_tcc = .false. - Lcloudsat_tcc2 = .false. - Latlid_column = .false. - LgrLidar532_column = .false. - Lcloudsat_modis_wr = .false. - if (associated(cospOUT%misr_fq)) cospOUT%misr_fq(:,:,:) = R_UNDEF - if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(:,:) = R_UNDEF - if (associated(cospOUT%misr_meanztop)) cospOUT%misr_meanztop(:) = R_UNDEF - if (associated(cospOUT%misr_cldarea)) cospOUT%misr_cldarea(:) = R_UNDEF - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF - if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF - if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF - if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF - if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF - endif - endif - if (any([Lrttov_column,Lcloudsat_column,Lcalipso_column,Lradar_lidar_tcc,Llidar_only_freq_cloud, & - LgrLidar532_column, Latlid_column, Lcloudsat_tcc, Lcloudsat_tcc2, Lcloudsat_modis_wr])) then - if (any(cospgridIN%hgt_matrix_half .lt. -300)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%hgt_matrix_half contains values out of range' - Lrttov_column = .false. - Lcloudsat_column = .false. - Lcalipso_column = .false. - Lradar_lidar_tcc = .false. - Llidar_only_freq_cloud = .false. - Lcloudsat_tcc = .false. - Lcloudsat_tcc2 = .false. - Latlid_column = .false. - LgrLidar532_column = .false. - Lcloudsat_modis_wr = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF - if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF - if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF - if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF - if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF - endif - endif - if (any([Lrttov_column,Lcalipso_column,Lparasol_column])) then - if (any(cospgridIN%land .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%land contains values out of range' - Lrttov_column = .false. - Lcalipso_column = .false. - Lparasol_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - if (associated(cospOUT%parasolGrid_refl)) cospOUT%parasolGrid_refl(:,:) = R_UNDEF - endif - endif - if (any([Lisccp_subcolumn,Lisccp_column,Lrttov_column])) then - if (any(cospgridIN%skt .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%skt contains values out of range' - Lisccp_subcolumn = .false. - Lisccp_column = .false. - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF - if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF - if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF - if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF - if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF - if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF - if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF - if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF - if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF - endif - endif - - ! RTTOV Inputs - if (Lrttov_column) then - if (any(cospgridIN%co2 .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%co2 contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%ch4 .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%ch4 contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%n2o .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%n2o contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%co.lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%co contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%o3 .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%o3 contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif -! if (any(cospgridIN%emis_in .lt. 0. .OR. cospgridIN%emis_in .gt. 1)) then -! nError=nError+1 -! errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%emis_in contains values out of range' -! Lrttov_column = .false. -! if (allocated(cospOUT%rttov_outputs)) then -! do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument -! if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 -! if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF -! end do -! end if -! endif -! if (any(cospgridIN%refl_in .lt. 0. .OR. cospgridIN%refl_in .gt. 1)) then -! nError=nError+1 -! errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%refl_in contains values out of range' -! Lrttov_column = .false. -! if (allocated(cospOUT%rttov_outputs)) then -! do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument -! if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 -! if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF -! end do -! end if -! endif - if (any(cospgridIN%rttov_sfcmask .lt. 0 .or. cospgridIN%rttov_sfcmask .gt. 2)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%rttov_sfcmask contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%u_sfc .lt. -100. .OR. cospgridIN%u_sfc .gt. 100.)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%u_sfc contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%v_sfc .lt. -100. .OR. cospgridIN%v_sfc .gt. 100.)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%v_sfc contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%lat .lt. -90 .OR. cospgridIN%lat .gt. 90)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%lat contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%lon .lt. -180 .OR. cospgridIN%lon .gt. 360)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%lon contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%tca .lt. 0 .OR. cospgridIN%tca .gt. 1)) then ! tca on [0,1] - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tca contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%rttov_time(:,1) .lt. 0 .OR. cospgridIN%rttov_time(:,1) .gt. 24)) then ! rttov_time(1), hour on [0,24] - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%rttov_time(1) contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%rttov_time(:,2) .lt. 0 .OR. cospgridIN%rttov_time(:,2) .gt. 60)) then ! rttov_time(2), minute on [0,60] - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%rttov_time(2) contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%rttov_time(:,3) .lt. 0 .OR. cospgridIN%rttov_time(:,3) .gt. 60)) then ! rttov_time(3), second on [0,60] - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%rttov_time(3) contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%rttov_date(:,1) .lt. 0)) then ! rttov_date(1), year on [0,inf] - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%rttov_date(1) contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%rttov_date(:,2) .lt. 0 .OR. cospgridIN%rttov_date(:,2) .gt. 12)) then ! rttov_date(2), month on [0,12] - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%rttov_date(2) contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%rttov_date(:,3) .lt. 1 .OR. cospgridIN%rttov_date(:,3) .gt. 31)) then ! rttov_date(3), day on [1,31] - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%rttov_date(3) contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - endif - - ! COSP_INPUTS - if (any([Lisccp_subcolumn,Lisccp_column])) then - if (cospIN%emsfc_lw .lt. 0. .OR. cospIN%emsfc_lw .gt. 1.) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%emsfc_lw contains values out of range' - Lisccp_subcolumn = .false. - Lisccp_column = .false. - if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF - if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF - if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF - if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF - if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF - if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF - if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF - if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF - if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF - endif - endif - if (any([Lisccp_subcolumn,Lisccp_column,Lmisr_subcolumn,Lmisr_column,Lmodis_subcolumn,Lmodis_column])) then - if (any(cospIN%tau_067 .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tau_067 contains values out of range' - Lisccp_subcolumn = .false. - Lisccp_column = .false. - Lmisr_subcolumn = .false. - Lmisr_column = .false. - Lmodis_subcolumn = .false. - Lmodis_column = .false. - if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF - if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF - if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF - if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF - if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF - if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF - if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF - if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF - if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF - if (associated(cospOUT%misr_fq)) cospOUT%misr_fq(:,:,:) = R_UNDEF - if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(:,:) = R_UNDEF - if (associated(cospOUT%misr_meanztop)) cospOUT%misr_meanztop(:) = R_UNDEF - if (associated(cospOUT%misr_cldarea)) cospOUT%misr_cldarea(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & - cospOUT%modis_Cloud_Fraction_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & - cospOUT%modis_Cloud_Fraction_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & - cospOUT%modis_Cloud_Fraction_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & - cospOUT%modis_Cloud_Fraction_High_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & - cospOUT%modis_Cloud_Fraction_Mid_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & - cospOUT%modis_Cloud_Fraction_Low_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & - cospOUT%modis_Optical_Thickness_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & - cospOUT%modis_Optical_Thickness_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & - cospOUT%modis_Optical_Thickness_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & - cospOUT%modis_Optical_Thickness_Total_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & - cospOUT%modis_Optical_Thickness_Water_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & - cospOUT%modis_Optical_Thickness_Ice_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & - cospOUT%modis_Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & - cospOUT%modis_Liquid_Water_Path_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & - cospOUT%modis_Ice_Water_Path_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) & - cospOUT%modis_LWP_vs_ReffLIQ(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_IWP_vs_ReffICE)) & - cospOUT%modis_IWP_vs_ReffICE(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) & - cospOUT%modis_Optical_Thickness_vs_ReffICE(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) & - cospOUT%modis_Optical_Thickness_vs_ReffLIQ(:,:,:) = R_UNDEF - endif - endif - if (any([Lisccp_subcolumn,Lisccp_column])) then - if (any(cospIN%emiss_11 .lt. 0. .OR. cospIN%emiss_11 .gt. 1)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%emiss_11 contains values out of range' - Lisccp_subcolumn = .false. - Lisccp_column = .false. - if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF - if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF - if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF - if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF - if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF - if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF - if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF - if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF - if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF - endif - endif - if (any([Lmodis_subcolumn,Lmodis_column])) then - if (any(cospIN%asym .lt. -1. .OR. cospIN%asym .gt. 1)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%asym contains values out of range' - Lmodis_subcolumn = .false. - Lmodis_column = .false. - if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & - cospOUT%modis_Cloud_Fraction_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & - cospOUT%modis_Cloud_Fraction_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & - cospOUT%modis_Cloud_Fraction_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & - cospOUT%modis_Cloud_Fraction_High_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & - cospOUT%modis_Cloud_Fraction_Mid_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & - cospOUT%modis_Cloud_Fraction_Low_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & - cospOUT%modis_Optical_Thickness_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & - cospOUT%modis_Optical_Thickness_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & - cospOUT%modis_Optical_Thickness_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & - cospOUT%modis_Optical_Thickness_Total_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & - cospOUT%modis_Optical_Thickness_Water_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & - cospOUT%modis_Optical_Thickness_Ice_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & - cospOUT%modis_Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & - cospOUT%modis_Liquid_Water_Path_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & - cospOUT%modis_Ice_Water_Path_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) & - cospOUT%modis_LWP_vs_ReffLIQ(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_IWP_vs_ReffICE)) & - cospOUT%modis_IWP_vs_ReffICE(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) & - cospOUT%modis_Optical_Thickness_vs_ReffICE(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) & - cospOUT%modis_Optical_Thickness_vs_ReffLIQ(:,:,:) = R_UNDEF - endif - if (any(cospIN%ss_alb .lt. 0 .OR. cospIN%ss_alb .gt. 1)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%ss_alb contains values out of range' - Lmodis_subcolumn = .false. - Lmodis_column = .false. - if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & - cospOUT%modis_Cloud_Fraction_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & - cospOUT%modis_Cloud_Fraction_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & - cospOUT%modis_Cloud_Fraction_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & - cospOUT%modis_Cloud_Fraction_High_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & - cospOUT%modis_Cloud_Fraction_Mid_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & - cospOUT%modis_Cloud_Fraction_Low_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & - cospOUT%modis_Optical_Thickness_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & - cospOUT%modis_Optical_Thickness_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & - cospOUT%modis_Optical_Thickness_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & - cospOUT%modis_Optical_Thickness_Total_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & - cospOUT%modis_Optical_Thickness_Water_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & - cospOUT%modis_Optical_Thickness_Ice_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & - cospOUT%modis_Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & - cospOUT%modis_Liquid_Water_Path_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & - cospOUT%modis_Ice_Water_Path_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) & - cospOUT%modis_LWP_vs_ReffLIQ(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_IWP_vs_ReffICE)) & - cospOUT%modis_IWP_vs_ReffICE(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) & - cospOUT%modis_Optical_Thickness_vs_ReffICE(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) & - cospOUT%modis_Optical_Thickness_vs_ReffLIQ(:,:,:) = R_UNDEF - endif - endif - if (any([Latlid_subcolumn,Latlid_column])) then - if (any(cospIN%betatot_atlid .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%betatot_atlid contains values out of range' - Latlid_subcolumn = .false. - Latlid_column = .false. - if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%atlid_beta_tot)) cospOUT%atlid_beta_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_beta_mol)) cospOUT%atlid_beta_mol(:,:) = R_UNDEF - endif - if (any(cospIN%beta_mol_atlid .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%beta_mol_atlid contains values out of range' - Latlid_subcolumn = .false. - Latlid_column = .false. - if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%atlid_beta_tot)) cospOUT%atlid_beta_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_beta_mol)) cospOUT%atlid_beta_mol(:,:) = R_UNDEF - endif - if (any(cospIN%tautot_atlid .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tautot_atlid contains values out of range' - Latlid_subcolumn = .false. - Latlid_column = .false. - if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%atlid_beta_tot)) cospOUT%atlid_beta_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_beta_mol)) cospOUT%atlid_beta_mol(:,:) = R_UNDEF - endif - if (any(cospIN%tau_mol_atlid .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tau_mol_atlid contains values out of range' - Latlid_subcolumn = .false. - Latlid_column = .false. - if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%atlid_beta_tot)) cospOUT%atlid_beta_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_beta_mol)) cospOUT%atlid_beta_mol(:,:) = R_UNDEF - endif - endif - - if (any([LgrLidar532_subcolumn,LgrLidar532_column])) then - if (any(cospIN%betatot_grLidar532 .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%betatot_grLidar532 contains values out of range' - LgrLidar532_subcolumn = .false. - LgrLidar532_column = .false. - if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_beta_tot)) cospOUT%grLidar532_beta_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_beta_mol)) cospOUT%grLidar532_beta_mol(:,:) = R_UNDEF - endif - if (any(cospIN%beta_mol_grLidar532 .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%beta_mol_grLidar532 contains values out of range' - LgrLidar532_subcolumn = .false. - LgrLidar532_column = .false. - if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_beta_tot)) cospOUT%grLidar532_beta_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_beta_mol)) cospOUT%grLidar532_beta_mol(:,:) = R_UNDEF - endif - if (any(cospIN%tautot_grLidar532 .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tautot_grLidar532 contains values out of range' - LgrLidar532_subcolumn = .false. - LgrLidar532_column = .false. - if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_beta_tot)) cospOUT%grLidar532_beta_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_beta_mol)) cospOUT%grLidar532_beta_mol(:,:) = R_UNDEF - endif - if (any(cospIN%tau_mol_grLidar532 .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tau_mol_grLidar532 contains values out of range' - LgrLidar532_subcolumn = .false. - LgrLidar532_column = .false. - if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_beta_tot)) cospOUT%grLidar532_beta_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_beta_mol)) cospOUT%grLidar532_beta_mol(:,:) = R_UNDEF - endif - endif - - if (any([Lcalipso_subcolumn,Lcalipso_column])) then - if (any(cospIN%betatot_calipso .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%betatot_calipso contains values out of range' - Lcalipso_subcolumn = .false. - Lcalipso_column = .false. - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - endif - if (any(cospIN%betatot_liq_calipso .lt. 0)) then - nError=nError+1 - errorMessage(nError) = ('ERROR: COSP input variable: cospIN%betatot_liq_calipso contains values out of range') - Lcalipso_subcolumn = .false. - Lcalipso_column = .false. - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - endif - if (any(cospIN%betatot_ice_calipso .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%betatot_ice_calipso contains values out of range' - Lcalipso_subcolumn = .false. - Lcalipso_column = .false. - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - endif - if (any(cospIN%tautot_calipso .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tautot_calipso contains values out of range' - Lcalipso_subcolumn = .false. - Lcalipso_column = .false. - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - endif - if (any(cospIN%tautot_liq_calipso .lt. 0)) then - nError=nError+1 - errorMessage(nError) = ('ERROR: COSP input variable: cospIN%tautot_liq_calipso contains values out of range') - Lcalipso_subcolumn = .false. - Lcalipso_column = .false. - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - endif - if (any(cospIN%tautot_ice_calipso .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tautot_ice_calipso contains values out of range' - Lcalipso_subcolumn = .false. - Lcalipso_column = .false. - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - endif - if (any(cospIN%tau_mol_calipso .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tau_mol_calipso contains values out of range' - Lcalipso_subcolumn = .false. - Lcalipso_column = .false. - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - endif - endif - if (any([Lcalipso_subcolumn,Lcalipso_column,Lcloudsat_column,Lradar_lidar_tcc, & - Llidar_only_freq_cloud, Lcloudsat_tcc, Lcloudsat_tcc2])) then - if (any(cospIN%beta_mol_calipso .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%beta_mol_calipso contains values out of range' - Lcalipso_subcolumn = .false. - Lcalipso_column = .false. - Lcloudsat_column = .false. - Lradar_lidar_tcc = .false. - Llidar_only_freq_cloud = .false. - Lcloudsat_tcc = .false. - Lcloudsat_tcc2 = .false. - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF - if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF - if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF - if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - endif - endif - if (any([Lparasol_subcolumn,Lparasol_column])) then - if (any(cospIN%tautot_S_liq .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tautot_S_liq contains values out of range' - Lparasol_subcolumn = .false. - Lparasol_column = .false. - if (associated(cospOUT%parasolPix_refl)) cospOUT%parasolPix_refl(:,:,:) = R_UNDEF - if (associated(cospOUT%parasolGrid_refl)) cospOUT%parasolGrid_refl(:,:) = R_UNDEF - endif - if (any(cospIN%tautot_S_ice .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tautot_S_ice contains values out of range' - Lparasol_subcolumn = .false. - Lparasol_column = .false. - if (associated(cospOUT%parasolPix_refl)) cospOUT%parasolPix_refl(:,:,:) = R_UNDEF - if (associated(cospOUT%parasolGrid_refl)) cospOUT%parasolGrid_refl(:,:) = R_UNDEF - endif - endif - if (any([Lcloudsat_subcolumn,Lcloudsat_column,Lradar_lidar_tcc,Llidar_only_freq_cloud, & - Lcloudsat_tcc, Lcloudsat_tcc2, Lcloudsat_modis_wr])) then - if (any(cospIN%z_vol_cloudsat .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%z_vol_cloudsat contains values out of range' - Lcloudsat_subcolumn = .false. - Lcloudsat_column = .false. - Lradar_lidar_tcc = .false. - Llidar_only_freq_cloud = .false. - Lcloudsat_tcc = .false. - Lcloudsat_tcc2 = .false. - Lcloudsat_modis_wr = .false. - if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF - if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF - if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF - if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF - if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF - endif - if (any(cospIN%kr_vol_cloudsat .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%kr_vol_cloudsat contains values out of range' - Lcloudsat_subcolumn = .false. - Lcloudsat_column = .false. - Lradar_lidar_tcc = .false. - Llidar_only_freq_cloud = .false. - Lcloudsat_tcc = .false. - Lcloudsat_tcc2 = .false. - Lcloudsat_modis_wr = .false. - if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF - if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF - if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF - if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF - if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF - endif - if (any(cospIN%g_vol_cloudsat .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%g_vol_cloudsat contains values out of range' - Lcloudsat_subcolumn = .false. - Lcloudsat_column = .false. - Lradar_lidar_tcc = .false. - Llidar_only_freq_cloud = .false. - Lcloudsat_tcc = .false. - Lcloudsat_tcc2 = .false. - Lcloudsat_modis_wr = .false. - if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF - if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF - if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF - if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF - if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF - endif - endif - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Part 2: Check input fields array size for consistency. This needs to be done for each - ! simulator - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! ISCCP - if (Lisccp_subcolumn .or. Lisccp_column) then - if (size(cospIN%frac_out,1) .ne. cospIN%Npoints .OR. & - size(cospIN%tau_067,1) .ne. cospIN%Npoints .OR. & - size(cospIN%emiss_11,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%skt) .ne. cospIN%Npoints .OR. & - size(cospgridIN%qv,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%at,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%phalf,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%sunlit) .ne. cospIN%Npoints .OR. & - size(cospgridIN%pfull,1) .ne. cospIN%Npoints) then - Lisccp_subcolumn = .false. - Lisccp_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(isccp_simulator): The number of points in the input fields are inconsistent' - endif - if (size(cospIN%frac_out,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%tau_067,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%emiss_11,2) .ne. cospIN%Ncolumns) then - Lisccp_subcolumn = .false. - Lisccp_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(isccp_simulator): The number of sub-columns in the input fields are inconsistent' - endif - if (size(cospIN%frac_out,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%tau_067,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%emiss_11,3) .ne. cospIN%Nlevels .OR. & - size(cospgridIN%qv,2) .ne. cospIN%Nlevels .OR. & - size(cospgridIN%at,2) .ne. cospIN%Nlevels .OR. & - size(cospgridIN%pfull,2) .ne. cospIN%Nlevels .OR. & - size(cospgridIN%phalf,2) .ne. cospIN%Nlevels+1) then - Lisccp_subcolumn = .false. - Lisccp_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(isccp_simulator): The number of levels in the input fields are inconsistent' - endif - endif - - ! MISR - if (Lmisr_subcolumn .or. Lmisr_column) then - if (size(cospIN%tau_067,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%sunlit) .ne. cospIN%Npoints .OR. & - size(cospgridIN%hgt_matrix,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%at,1) .ne. cospIN%Npoints) then - Lmisr_subcolumn = .false. - Lmisr_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(misr_simulator): The number of points in the input fields are inconsistent' - endif - if (size(cospIN%tau_067,2) .ne. cospIN%Ncolumns) then - Lmisr_subcolumn = .false. - Lmisr_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(misr_simulator): The number of sub-columns in the input fields are inconsistent' - endif - if (size(cospIN%tau_067,3) .ne. cospIN%Nlevels .OR. & - size(cospgridIN%hgt_matrix,2) .ne. cospIN%Nlevels .OR. & - size(cospgridIN%at,2) .ne. cospIN%Nlevels) then - Lmisr_subcolumn = .false. - Lmisr_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(misr_simulator): The number of levels in the input fields are inconsistent' - endif - endif - - ! MODIS - if (Lmodis_subcolumn .or. Lmodis_column) then - if (size(cospIN%fracLiq,1) .ne. cospIN%Npoints .OR. & - size(cospIN%tau_067,1) .ne. cospIN%Npoints .OR. & - size(cospIN%asym,1) .ne. cospIN%Npoints .OR. & - size(cospIN%ss_alb,1) .ne. cospIN%Npoints) then - Lmodis_subcolumn = .false. - Lmodis_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(modis_simulator): The number of points in the input fields are inconsistent' - endif - if (size(cospIN%fracLiq,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%tau_067,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%asym,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%ss_alb,2) .ne. cospIN%Ncolumns) then - Lmodis_subcolumn = .false. - Lmodis_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(modis_simulator): The number of sub-columns in the input fields are inconsistent' - endif - if (size(cospIN%fracLiq,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%tau_067,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%asym,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%ss_alb,3) .ne. cospIN%Nlevels) then - Lmodis_subcolumn = .false. - Lmodis_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(modis_simulator): The number of levels in the input fields are inconsistent' - endif - endif - - ! CLOUDSAT - if (Lcloudsat_subcolumn .or. Lcloudsat_column) then - if (size(cospIN%z_vol_cloudsat,1) .ne. cospIN%Npoints .OR. & - size(cospIN%kr_vol_cloudsat,1) .ne. cospIN%Npoints .OR. & - size(cospIN%g_vol_cloudsat,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%hgt_matrix,1) .ne. cospIN%Npoints) then - Lcloudsat_subcolumn = .false. - Lcloudsat_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(cloudsat_simulator): The number of points in the input fields are inconsistent' - endif - if (size(cospIN%z_vol_cloudsat,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%kr_vol_cloudsat,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%g_vol_cloudsat,2) .ne. cospIN%Ncolumns) then - Lcloudsat_subcolumn = .false. - Lcloudsat_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(cloudsat_simulator): The number of sub-columns in the input fields are inconsistent' - endif - if (size(cospIN%z_vol_cloudsat,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%kr_vol_cloudsat,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%g_vol_cloudsat,3) .ne. cospIN%Nlevels .OR. & - size(cospgridIN%hgt_matrix,2) .ne. cospIN%Nlevels) then - Lcloudsat_subcolumn = .false. - Lcloudsat_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(cloudsat_simulator): The number of levels in the input fields are inconsistent' - endif - endif - - ! GROUND LIDAR @ 532nm - if (LgrLidar532_subcolumn .or. LgrLidar532_column) then - if (size(cospIN%beta_mol_grLidar532,1) .ne. cospIN%Npoints .OR. & - size(cospIN%betatot_grLidar532,1) .ne. cospIN%Npoints .OR. & - size(cospIN%tau_mol_grLidar532,1) .ne. cospIN%Npoints .OR. & - size(cospIN%tautot_grLidar532,1) .ne. cospIN%Npoints) then - LgrLidar532_subcolumn = .false. - LgrLidar532_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(grLidar532_simulator): The number of points in the input fields are inconsistent' - endif - if (size(cospIN%betatot_grLidar532,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%tautot_grLidar532,2) .ne. cospIN%Ncolumns) then - LgrLidar532_subcolumn = .false. - LgrLidar532_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(grLidar532_simulator): The number of sub-columns in the input fields are inconsistent' - endif - if (size(cospIN%beta_mol_grLidar532,2) .ne. cospIN%Nlevels .OR. & - size(cospIN%betatot_grLidar532,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%tau_mol_grLidar532,2) .ne. cospIN%Nlevels .OR. & - size(cospIN%tautot_grLidar532,3) .ne. cospIN%Nlevels) then - LgrLidar532_subcolumn = .false. - LgrLidar532_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(grLidar532_simulator): The number of levels in the input fields are inconsistent' - endif - endif - - ! ATLID - if (Latlid_subcolumn .or. Latlid_column) then - if (size(cospIN%beta_mol_atlid,1) .ne. cospIN%Npoints .OR. & - size(cospIN%betatot_atlid,1) .ne. cospIN%Npoints .OR. & - size(cospIN%tau_mol_atlid,1) .ne. cospIN%Npoints .OR. & - size(cospIN%tautot_atlid,1) .ne. cospIN%Npoints) then - Latlid_subcolumn = .false. - Latlid_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(atlid_simulator): The number of points in the input fields are inconsistent' - endif - if (size(cospIN%betatot_atlid,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%tautot_atlid,2) .ne. cospIN%Ncolumns) then - Latlid_subcolumn = .false. - Latlid_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(atlid_simulator): The number of sub-columns in the input fields are inconsistent' - endif - if (size(cospIN%beta_mol_atlid,2) .ne. cospIN%Nlevels .OR. & - size(cospIN%betatot_atlid,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%tau_mol_atlid,2) .ne. cospIN%Nlevels .OR. & - size(cospIN%tautot_atlid,3) .ne. cospIN%Nlevels) then - Latlid_subcolumn = .false. - Latlid_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(atlid_simulator): The number of levels in the input fields are inconsistent' - endif - endif - - ! CALIPSO - if (Lcalipso_subcolumn .or. Lcalipso_column) then - if (size(cospIN%beta_mol_calipso,1) .ne. cospIN%Npoints .OR. & - size(cospIN%betatot_calipso,1) .ne. cospIN%Npoints .OR. & - size(cospIN%betatot_liq_calipso,1) .ne. cospIN%Npoints .OR. & - size(cospIN%betatot_ice_calipso,1) .ne. cospIN%Npoints .OR. & - size(cospIN%tau_mol_calipso,1) .ne. cospIN%Npoints .OR. & - size(cospIN%tautot_calipso,1) .ne. cospIN%Npoints .OR. & - size(cospIN%tautot_liq_calipso,1) .ne. cospIN%Npoints .OR. & - size(cospIN%tautot_ice_calipso,1) .ne. cospIN%Npoints) then - Lcalipso_subcolumn = .false. - Lcalipso_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(calipso_simulator): The number of points in the input fields are inconsistent' - endif - if (size(cospIN%betatot_calipso,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%betatot_liq_calipso,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%betatot_ice_calipso,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%tautot_calipso,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%tautot_liq_calipso,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%tautot_ice_calipso,2) .ne. cospIN%Ncolumns) then - Lcalipso_subcolumn = .false. - Lcalipso_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(calipso_simulator): The number of sub-columns in the input fields are inconsistent' - endif - if (size(cospIN%beta_mol_calipso,2) .ne. cospIN%Nlevels .OR. & - size(cospIN%betatot_calipso,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%betatot_liq_calipso,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%betatot_ice_calipso,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%tau_mol_calipso,2) .ne. cospIN%Nlevels .OR. & - size(cospIN%tautot_calipso,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%tautot_liq_calipso,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%tautot_ice_calipso,3) .ne. cospIN%Nlevels) then - Lcalipso_subcolumn = .false. - Lcalipso_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(calipso_simulator): The number of levels in the input fields are inconsistent' - endif - endif - - ! PARASOL - if (Lparasol_subcolumn .or. Lparasol_column) then - if (size(cospIN%tautot_S_liq,1) .ne. cospIN%Npoints .OR. & - size(cospIN%tautot_S_ice,1) .ne. cospIN%Npoints) then - Lparasol_subcolumn = .false. - Lparasol_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(parasol_simulator): The number of points in the input fields are inconsistent' - endif - if (size(cospIN%tautot_S_liq,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%tautot_S_ice,2) .ne. cospIN%Ncolumns) then - Lparasol_subcolumn = .false. - Lparasol_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(parasol_simulator): The number of levels in the input fields are inconsistent' - endif - endif - - ! RTTOV - if (Lrttov_column) then - if (size(cospgridIN%pfull,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%at,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%qv,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%hgt_matrix_half,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%u_sfc) .ne. cospIN%Npoints .OR. & - size(cospgridIN%v_sfc) .ne. cospIN%Npoints .OR. & - size(cospgridIN%skt) .ne. cospIN%Npoints .OR. & - size(cospgridIN%phalf,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%cloudIce,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%cloudLiq,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%rttov_sfcmask) .ne. cospIN%Npoints .OR. & - size(cospgridIN%lon) .ne. cospIN%Npoints .OR. & - size(cospgridIN%lat) .ne. cospIN%Npoints) then - Lrttov_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(rttov_simulator): The number of points in the input fields are inconsistent' - endif - if (size(cospgridIN%pfull,2) .ne. cospIN%Nlevels .OR. & - size(cospgridIN%at,2) .ne. cospIN%Nlevels .OR. & - size(cospgridIN%qv,2) .ne. cospIN%Nlevels .OR. & - size(cospgridIN%hgt_matrix_half,2) .ne. cospIN%Nlevels .OR. & - size(cospgridIN%phalf,2) .ne. cospIN%Nlevels+1) then - Lrttov_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(rttov_simulator): The number of levels in the input fields are inconsistent' - endif - endif - end subroutine cosp_errorCheck - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! END MODULE - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -END MODULE MOD_COSP diff --git a/dplrw_src/cosp2_io.f90 b/dplrw_src/cosp2_io.f90 deleted file mode 100644 index 996a2c58cb..0000000000 --- a/dplrw_src/cosp2_io.f90 +++ /dev/null @@ -1,3109 +0,0 @@ -module mod_cosp_io - use cosp_kinds, only: wp - use mod_cosp, only: cosp_outputs - use netcdf - USE MOD_COSP_CONFIG, ONLY: Nlvgrid, LIDAR_NCAT, SR_BINS, PARASOL_NREFL, cloudsat_DBZE_BINS, & - numMODISReffIceBins, numMODISReffLiqBins, ntau, tau_binBounds, tau_binCenters, & - tau_binEdges,npres, pres_binBounds, pres_binCenters, pres_binEdges, nhgt, & - hgt_binBounds, hgt_binCenters, hgt_binEdges, vgrid_z, & - reffICE_binCenters, reffLIQ_binCenters, cloudsat_binCenters, PARASOL_SZA, & - calipso_binCenters, grLidar532_binCenters, atlid_binCenters, & - CFODD_NDBZE, CFODD_HISTDBZE, CFODD_HISTDBZEcenters, & - CFODD_NICOD, CFODD_HISTICOD, CFODD_HISTICODcenters - USE MOD_COSP_CONFIG, ONLY: Nlvtemp, NlvdBZe, Nlvdplr, Nlvspwd, & ! added by DPLRW - lvtemp_grid, lvdBZe_grid, lvdplr_grid, lvspwd_grid - implicit none - -contains - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE write_cosp2_output - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - subroutine write_cosp2_output(Npoints, Ncolumns, Nlevels, Ninst_rttov, lev, lon, lat, cospOUT, outFileName) - integer,intent(in) :: Npoints, Ncolumns, Nlevels, Ninst_rttov - real(wp),dimension(Npoints),intent(in) :: lon,lat - real(wp),dimension(Nlevels),intent(in) :: lev - type(cosp_outputs),intent(in) :: cospOUT - character(len=256),intent(in) :: outFileName - - integer :: fileID,status,ij,i,ii - integer,dimension(50) :: dimID - integer,dimension(250) :: varID - integer,dimension(Npoints) :: loc - integer,dimension(Ncolumns) :: cosp_scol - integer,dimension(2) :: bnds - character(len=8) :: & - fmt, & ! format descriptor for flexible RTTOV output - i_str - - loc=(/(ij,ij=1,Npoints)/) - cosp_scol=(/(ij,ij=1,Ncolumns)/) - bnds=(/(ij,ij=1,2)/) - fmt = '(I3.3)' ! an integer of width 3 with zeros at the left - - ! --------------------------------------------------------------------------------------- - ! Create output file. - ! --------------------------------------------------------------------------------------- - status = nf90_create(path=trim(outFileName),cmode=IOR(NF90_NETCDF4,NF90_CLOBBER),ncid=fileID) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - ! --------------------------------------------------------------------------------------- - ! Define GLOBAL attributes. - ! --------------------------------------------------------------------------------------- - status = nf90_put_att(fileID,NF90_GLOBAL,"Conventions","CF-1.6") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - ! --------------------------------------------------------------------------------------- - ! Define dimensions. - ! --------------------------------------------------------------------------------------- - status = nf90_def_dim(fileID,"loc",Npoints,dimID(1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"cosp_scol",Ncolumns,dimID(2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"lev",Nlevels,dimID(3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"levStat",Nlvgrid,dimID(4)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"tau7",ntau,dimID(5)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"bnds",2,dimID(6)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"pres7",npres,dimID(7)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"hgt16",nhgt,dimID(8)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"SR_BINS",SR_BINS,dimID(12)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"PARASOL_NREFL",PARASOL_NREFL,dimID(13)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"cloudsat_DBZE_BINS",cloudsat_DBZE_BINS,dimID(14)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"RELIQ_MODIS",numMODISReffLiqBins,dimID(15)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"REICE_MODIS",numMODISReffIceBins,dimID(16)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"CFODD_NDBZE",CFODD_NDBZE,dimID(17)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"CFODD_NICOD",CFODD_NICOD,dimID(18)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! added by DPLRW - status = nf90_def_dim(fileID,"Nlvtemp",Nlvtemp,dimID(19)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"NlvdBZe",NlvdBZe,dimID(20)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"Nlvdplr",Nlvdplr,dimID(21)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"Nlvspwd",Nlvspwd,dimID(22)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"regimeID",3,dimID(23)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"nrmlzdID",3,dimID(24)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - ! Define instrument channel indices for multiple RTTOV instruments - if (allocated(cospOUT%rttov_outputs)) then - do i=1,Ninst_rttov - write (i_str,fmt) i ! converting integer to string i_str using a 'internal file' - status = nf90_def_dim(fileID,"RTTOV_CHAN_INST"//trim(i_str),cospOUT % rttov_outputs(i) % nchan_out,dimID(24+i)) ! Start at 25 for RTTOV output channel dimensions - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - end do - end if - - ! --------------------------------------------------------------------------------------- - ! Define variables - ! --------------------------------------------------------------------------------------- - ! Longitude - status = nf90_def_var(fileID,"longitude", nf90_float, (/dimID(1)/),varID(1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(1),"long_name","longitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(1),"units", "degrees_east") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(1),"standard_name", "longitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Latitude - status = nf90_def_var(fileID,"latitude", nf90_float, (/dimID(1)/),varID(2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(2),"long_name","latitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(2),"units", "degrees_north") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(2),"standard_name", "latitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Joint-histogram axis - ! Tau - status = nf90_def_var(fileID,"tau7", nf90_float, (/dimID(5)/),varID(3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(3),"long_name","cloud_optical_depth_bin_centers") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(3),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(3),"standard_name", "atmosphere_optical_thickness_due_to_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Tau edges - status = nf90_def_var(fileID,"tau7_bnds", nf90_float, (/dimID(6),dimID(5)/),varID(4)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(4),"long_name","cloud_optical_depth_bin_edges") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(4),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(4),"standard_name", "atmosphere_optical_thickness_due_to_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Pressure - status = nf90_def_var(fileID,"pres7", nf90_float, (/dimID(7)/),varID(5)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(5),"long_name","air_pressure_bin_centers") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(5),"units", "Pa") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(5),"standard_name", "air_pressure") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Pressure Edges - status = nf90_def_var(fileID,"pres7_bnds", nf90_float, (/dimID(6),dimID(7)/),varID(6)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(6),"long_name","air_pressure_bin_edges") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(6),"units", "Pa") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(6),"standard_name", "air_pressure") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Height - status = nf90_def_var(fileID,"hgt16", nf90_float, (/dimID(8)/),varID(7)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(7),"long_name","altitude_bin_centers") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(7),"units", "m") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(7),"standard_name", "altitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Height Edges - status = nf90_def_var(fileID,"hgt16_bnds", nf90_float, (/dimID(6),dimID(8)/),varID(8)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(8),"long_name","altitude_bin_edges") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(8),"units", "m") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(8),"standard_name", "altitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Levels - status = nf90_def_var(fileID,"lev", nf90_float, (/dimID(3)/),varID(84)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(84),"long_name","level indices") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(84),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Levels for statistical diagnostics (lidar and radar) - status = nf90_def_var(fileID,"levStat", nf90_float, (/dimID(4)/),varID(85)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(85),"long_name","level indices") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(85),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - ! Subcolumms - status = nf90_def_var(fileID,"cosp_scol", nf90_float, (/dimID(2)/),varID(86)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(86),"long_name","subcolumn indices") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(86),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Bnds - status = nf90_def_var(fileID,"bnds", nf90_float, (/dimID(6)/),varID(82)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(82),"long_name","bounds") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(82),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! loc - status = nf90_def_var(fileID,"loc", nf90_float, (/dimID(1)/),varID(83)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(83),"long_name","loc") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(83),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - ! CALIPSO simulator output - if (associated(cospOUT%calipso_betaperp_tot)) then - status = nf90_def_var(fileID,"atb532_perp",nf90_float, (/dimID(1),dimID(2),dimID(3)/),varID(9)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(9),"long_name","CALIPSO Attenuated Total Perpendicular Backscatter (532nm)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(9),"units", "m-1 sr-1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(9),"standard_name", "volume_attenuated_backwards_scattering_function_in_air") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_beta_tot)) then - status = nf90_def_var(fileID,"atb532",nf90_float, (/dimID(1),dimID(2),dimID(3)/),varID(10)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(10),"long_name","CALIPSO Attenuated Total Backscatter (532nm)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(10),"units", "m-1 sr-1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(10),"standard_name", "volume_attenuated_backwards_scattering_function_in_air") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_lidarcldphase)) then - ! Ice - status = nf90_def_var(fileID,"clcalipsoice",nf90_float, (/dimID(1),dimID(4)/),varID(58)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(58),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(58),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(58),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Liquid - status = nf90_def_var(fileID,"clcalipsoliq",nf90_float, (/dimID(1),dimID(4)/),varID(59)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(59),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(59),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(59),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Undefined - status = nf90_def_var(fileID,"clcalipsoun",nf90_float, (/dimID(1),dimID(4)/),varID(60)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(60),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(60),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(60),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cldlayerphase)) then - ! Ice - status = nf90_def_var(fileID,"cllcalipsoice",nf90_float, (/dimID(1)/),varID(61)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(61),"long_name","CALIPSO Ice Low Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(61),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(61),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"clmcalipsoice",nf90_float, (/dimID(1)/),varID(62)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(62),"long_name","CALIPSO Ice Mid Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(62),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(62),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"clhcalipsoice",nf90_float, (/dimID(1)/),varID(63)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(63),"long_name","CALIPSO Ice High Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(63),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(63),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"cltcalipsoice",nf90_float, (/dimID(1)/),varID(64)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(64),"long_name","CALIPSO Ice Total Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(64),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(64),"standard_name", "cloud_area_fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Liquid - status = nf90_def_var(fileID,"cllcalipsoliq",nf90_float, (/dimID(1)/),varID(65)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(65),"long_name","CALIPSO Liquid Low Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(65),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(65),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"clmcalipsoliq",nf90_float, (/dimID(1)/),varID(66)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(66),"long_name","CALIPSO Liquid Mid Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(66),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(66),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"clhcalipsoliq",nf90_float, (/dimID(1)/),varID(67)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(67),"long_name","CALIPSO Liquid High Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(67),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(67),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"cltcalipsoliq",nf90_float, (/dimID(1)/),varID(68)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(68),"long_name","CALIPSO Liquid Total Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(68),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(68),"standard_name", "cloud_area_fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Undetermined - status = nf90_def_var(fileID,"cllcalipsoun",nf90_float, (/dimID(1)/),varID(69)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(69),"long_name","CALIPSO Undefined-Phase Low Level Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(69),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(69),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"clmcalipsoun",nf90_float, (/dimID(1)/),varID(70)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(70),"long_name","CALIPSO Undefined-Phase Mid Level Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(70),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(70),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"clhcalipsoun",nf90_float, (/dimID(1)/),varID(71)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(71),"long_name","CALIPSO Undefined-Phase High Level Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(71),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(71),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"cltcalipsoun",nf90_float, (/dimID(1)/),varID(72)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(72),"long_name","CALIPSO Undefined-Phase Total Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(72),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(72),"standard_name", "cloud_area_fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_lidarcldtmp)) then - status = nf90_def_var(fileID,"clcalipsotmp",nf90_float, (/dimID(1),dimID(4)/),varID(77)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(77),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(77),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(77),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"clcalipsotmpice",nf90_float, (/dimID(1),dimID(4)/),varID(78)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(78),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(78),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(78),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"clcalipsotmpliq",nf90_float, (/dimID(1),dimID(4)/),varID(79)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(79),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(79),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(79),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"clcalipsotmpun",nf90_float, (/dimID(1),dimID(4)/),varID(80)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(80),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(80),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(80),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cfad_sr)) then - status = nf90_def_var(fileID,"cfadLidarsr532",nf90_float, (/dimID(1),dimID(12),dimID(4)/),varID(15)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(15),"long_name","CALIPSO Scattering Ratio CFAD") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(15),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(15),"standard_name", "histogram_of_backscattering_ratio_over_height_above_reference_ellipsoid") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_lidarcld)) then - status = nf90_def_var(fileID,"clcalipso",nf90_float, (/dimID(1),dimID(4)/),varID(16)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(16),"long_name","CALIPSO Cloud Area Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(16),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(16),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cldlayer)) then - ! Low-level - status = nf90_def_var(fileID,"cllcalipso",nf90_float, (/dimID(1)/),varID(73)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(73),"long_name","CALIPSO Low Level Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(73),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(73),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Mid-level - status = nf90_def_var(fileID,"clmcalipso",nf90_float, (/dimID(1)/),varID(74)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(74),"long_name","CALIPSO Mid Level Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(74),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(74),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! High-level - status = nf90_def_var(fileID,"clhcalipso",nf90_float, (/dimID(1)/),varID(75)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(75),"long_name","CALIPSO High Level Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(75),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(75),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Total - status = nf90_def_var(fileID,"cltcalipso",nf90_float, (/dimID(1)/),varID(76)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(76),"long_name","CALIPSO Total Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(76),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(76),"standard_name", "cloud_area_fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_beta_mol)) then - status = nf90_def_var(fileID,"lidarBetaMol532",nf90_float, (/dimID(1),dimID(3)/),varID(18)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(18),"long_name","CALIPSO Molecular Backscatter Coefficient (532nm)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(18),"units", "m-1 sr-1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(18),"standard_name", "volume_attenuated_backwards_scattering_function_in_air_assuming_no_aerosol_or_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_srbval) .or. associated(cospOUT%calipso_cfad_sr)) then - status = nf90_def_var(fileID,"SR_BINS",nf90_float, (/dimID(12)/),varID(81)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(81),"long_name","CALIPSO Backscattering Ratio (SR) Bin Centers") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(81),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(81),"standard_name", "backscattering_ratio") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"SR_EDGES",nf90_float, (/dimID(6),dimID(12)/),varID(19)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(19),"long_name","CALIPSO Backscattering Ratio (SR) Bin Bounds") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(19),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(19),"standard_name", "backscattering_ratio") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - !OPAQ diagnostics - if (associated(cospOUT%calipso_cldtype)) then - ! Opaque cloud cover - status = nf90_def_var(fileID,"clopaquecalipso",nf90_float, (/dimID(1)/),varID(91)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(91),"long_name","CALIPSO Opaque Cloud Cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(91),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(91),"standard_name", "opaque_cloud_cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Thin cloud cover - status = nf90_def_var(fileID,"clthincalipso",nf90_float, (/dimID(1)/),varID(92)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(92),"long_name","CALIPSO Thin Cloud Cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(92),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(92),"standard_name", "thin_cloud_cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! z_opaque altitude - status = nf90_def_var(fileID,"clzopaquecalipso",nf90_float, (/dimID(1)/),varID(93)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(93),"long_name","CALIPSO z_opaque Altitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(93),"units", "m") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(93),"standard_name", "z_opaque") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - !3D cloud fractions - if (associated(cospOUT%calipso_lidarcldtype)) then - ! Opaque profiles cloud fraction - status = nf90_def_var(fileID,"clcalipsoopaque",nf90_float, (/dimID(1),dimID(4)/),varID(94)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(94),"long_name","CALIPSO Opaque Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(94),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(94),"standard_name", "opaque_cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Non-Opaque profiles cloud fraction - status = nf90_def_var(fileID,"clcalipsothin",nf90_float, (/dimID(1),dimID(4)/),varID(95)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(95),"long_name","CALIPSO Thin Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(95),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(95),"standard_name", "thin_cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! z_opaque fraction - status = nf90_def_var(fileID,"clcalipsozopaque",nf90_float, (/dimID(1),dimID(4)/),varID(96)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(96),"long_name","CALIPSO z_opaque Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(96),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(96),"standard_name", "z_opaque_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Lidar opacity fraction - status = nf90_def_var(fileID,"clcalipsoopacity",nf90_float, (/dimID(1),dimID(4)/),varID(97)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(97),"long_name","CALIPSO opacity Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(97),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(97),"standard_name", "opacity_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cldtypetemp)) then - ! Opaque cloud temperature - status = nf90_def_var(fileID,"clopaquetemp",nf90_float, (/dimID(1)/),varID(98)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(98),"long_name","CALIPSO Opaque Cloud Temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(98),"units", "K") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(98),"standard_name", "opaque_cloud_temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Thin cloud temperature - status = nf90_def_var(fileID,"clthintemp",nf90_float, (/dimID(1)/),varID(99)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(99),"long_name","CALIPSO Thin Cloud Temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(99),"units", "K") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(99),"standard_name", "thin_cloud_temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! z_opaque temperature - status = nf90_def_var(fileID,"clzopaquetemp",nf90_float, (/dimID(1)/),varID(100)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(100),"long_name","CALIPSO z_opaque Temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(100),"units", "K") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(100),"standard_name", "z_opaque_temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cldtypemeanz)) then - ! Opaque cloud altitude - status = nf90_def_var(fileID,"clopaquemeanz",nf90_float, (/dimID(1)/),varID(101)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(101),"long_name","CALIPSO Opaque Cloud Altitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(101),"units", "m") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(101),"standard_name", "opaque_cloud_altitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Thin cloud altitude - status = nf90_def_var(fileID,"clthinmeanz",nf90_float, (/dimID(1)/),varID(102)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(102),"long_name","CALIPSO Thin Cloud Altitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(102),"units", "m") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(102),"standard_name", "thin_cloud_altitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cldthinemis)) then - ! Thin cloud emissivity - status = nf90_def_var(fileID,"clthinemis",nf90_float, (/dimID(1)/),varID(103)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(103),"long_name","CALIPSO Thin Cloud Emissivity") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(103),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(103),"standard_name", "thin_cloud_emissivity") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cldtypemeanzse)) then - ! Opaque cloud altitude with respect to Surface Elevation - status = nf90_def_var(fileID,"clopaquemeanzse",nf90_float, (/dimID(1)/),varID(104)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(104),"long_name","CALIPSO Opaque Cloud Altitude with respect to SE") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(104),"units", "m") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(104),"standard_name", "opaque_cloud_altitude_se") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Thin cloud altitude with respect to Surface Elevation - status = nf90_def_var(fileID,"clthinmeanzse",nf90_float, (/dimID(1)/),varID(105)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(105),"long_name","CALIPSO Thin Cloud Altitude with respect to SE") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(105),"units", "m") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(105),"standard_name", "thin_cloud_altitude_se") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! z_opaque altitude with respect to Surface Elevation - status = nf90_def_var(fileID,"clzopaquecalipsose",nf90_float, (/dimID(1)/),varID(106)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(106),"long_name","CALIPSO z_opaque Altitude with respect to SE") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(106),"units", "m") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(106),"standard_name", "z_opaque_se") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - !GROUND LIDAR simulator output - if (associated(cospOUT%grLidar532_cldlayer)) then - ! Low-level cloud cover - status = nf90_def_var(fileID,"cllgrLidar532",nf90_float, (/dimID(1)/),varID(107)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(107),"long_name","GROUND LIDAR Low Level Cloud Cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(107),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(107),"standard_name", "grLidar532_low_cloud_cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Mid-level cloud cover - status = nf90_def_var(fileID,"clmgrLidar532",nf90_float, (/dimID(1)/),varID(108)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(108),"long_name","GROUND LIDAR Mid Level Cloud Cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(108),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(108),"standard_name", "grLidar532_mid_cloud_cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! High-level cloud cover - status = nf90_def_var(fileID,"clhgrLidar532",nf90_float, (/dimID(1)/),varID(109)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(109),"long_name","GROUND LIDAR High Level Cloud Cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(109),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(109),"standard_name", "grLidar532_high_cloud_cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Total cloud cover - status = nf90_def_var(fileID,"cltgrLidar532",nf90_float, (/dimID(1)/),varID(110)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(110),"long_name","GROUND LIDAR Total Cloud Cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(110),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(110),"standard_name", "grLidar532_total_cloud_cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - !3D cloud fraction - if (associated(cospOUT%grLidar532_lidarcld)) then - status = nf90_def_var(fileID,"clgrLidar532",nf90_float, (/dimID(1),dimID(4)/),varID(111)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(111),"long_name","GROUND LIDAR Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(111),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(111),"standard_name", "grLidar532_cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - !Molecular backscatter - if (associated(cospOUT%grLidar532_beta_mol)) then - status = nf90_def_var(fileID,"lidarBetaMol532gr",nf90_float, (/dimID(1),dimID(3)/),varID(112)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(112),"long_name","GROUND LIDAR Molecular Backscatter Coefficient (532nm)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(112),"units", "m-1 sr-1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(112),"standard_name", "grLidar532_volume_attenuated_backwards_scattering_function_in_air_assuming_no_aerosol_or_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - !Height-Intensity histogram (SR) - if (associated(cospOUT%grLidar532_cfad_sr)) then - status = nf90_def_var(fileID,"cfadLidarsr532gr",nf90_float, (/dimID(1),dimID(12),dimID(4)/),varID(113)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(113),"long_name","GROUND LIDAR Scattering Ratio CFAD") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(113),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(113),"standard_name", "grLidar532_histogram_of_backscattering_ratio_over_height_above_reference_ellipsoid") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%grLidar532_beta_tot)) then - status = nf90_def_var(fileID,"atb532gr",nf90_float, (/dimID(1),dimID(2),dimID(3)/),varID(114)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(114),"long_name","GROUND LIDAR Attenuated Total Backscatter (532nm)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(114),"units", "m-1 sr-1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(114),"standard_name", "volume_attenuated_backwards_scattering_function_in_air") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - if (associated(cospOUT%grLidar532_srbval) .or. associated(cospOUT%grLidar532_cfad_sr)) then - status = nf90_def_var(fileID,"SR_BINS_GR",nf90_float, (/dimID(12)/),varID(115)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(115),"long_name","GROUND LIDAR Backscattering Ratio (SR) Bin Centers") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(115),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(115),"standard_name", "backscattering_ratio") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"SR_EDGES_GR",nf90_float, (/dimID(6),dimID(12)/),varID(116)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(116),"long_name","GROUND LIDAR Backscattering Ratio (SR) Bin Bounds") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(116),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(116),"standard_name", "backscattering_ratio") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - !ATLID simulator output - if (associated(cospOUT%atlid_cldlayer)) then - ! Low-level cloud cover - status = nf90_def_var(fileID,"cllatlid",nf90_float, (/dimID(1)/),varID(117)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(117),"long_name","ATLID Low Level Cloud Cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(117),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(117),"standard_name", "atlid_low_cloud_cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Mid-level cloud cover - status = nf90_def_var(fileID,"clmatlid",nf90_float, (/dimID(1)/),varID(118)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(118),"long_name","ATLID Mid Level Cloud Cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(118),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(118),"standard_name", "atlid_mid_cloud_cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! High-level cloud cover - status = nf90_def_var(fileID,"clhatlid",nf90_float, (/dimID(1)/),varID(119)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(119),"long_name","ATLID High Level Cloud Cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(119),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(119),"standard_name", "atlid_high_cloud_cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Total cloud cover - status = nf90_def_var(fileID,"cltatlid",nf90_float, (/dimID(1)/),varID(120)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(120),"long_name","ATLID Total Cloud Cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(120),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(120),"standard_name", "atlid_total_cloud_cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - !3D cloud fraction - if (associated(cospOUT%atlid_lidarcld)) then - status = nf90_def_var(fileID,"clatlid",nf90_float, (/dimID(1),dimID(4)/),varID(121)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(121),"long_name","ATLID Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(121),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(121),"standard_name", "atlid_cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - !Molecular backscatter - if (associated(cospOUT%atlid_beta_mol)) then - status = nf90_def_var(fileID,"lidarBetaMol355",nf90_float, (/dimID(1),dimID(3)/),varID(122)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(122),"long_name","ATLID Molecular Backscatter Coefficient (355nm)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(122),"units", "m-1 sr-1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(122),"standard_name", "atlid_volume_attenuated_backwards_scattering_function_in_air_assuming_no_aerosol_or_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - !Height-Intensity histogram (SR) - if (associated(cospOUT%atlid_cfad_sr)) then - status = nf90_def_var(fileID,"cfadLidarsr355",nf90_float, (/dimID(1),dimID(12),dimID(4)/),varID(123)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(123),"long_name","ATLID Scattering Ratio CFAD") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(123),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(123),"standard_name", "atlid_histogram_of_backscattering_ratio_over_height_above_reference_ellipsoid") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%atlid_beta_tot)) then - status = nf90_def_var(fileID,"atb355",nf90_float, (/dimID(1),dimID(2),dimID(3)/),varID(124)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(124),"long_name","ATLID Attenuated Total Backscatter (355nm)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(124),"units", "m-1 sr-1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(124),"standard_name", "volume_attenuated_backwards_scattering_function_in_air") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - if (associated(cospOUT%atlid_srbval) .or. associated(cospOUT%atlid_cfad_sr)) then - status = nf90_def_var(fileID,"SR_BINS_ATLID",nf90_float, (/dimID(12)/),varID(125)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(125),"long_name","ATLID Backscattering Ratio (SR) Bin Centers") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(125),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(125),"standard_name", "backscattering_ratio") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"SR_EDGES_ATLID",nf90_float, (/dimID(6),dimID(12)/),varID(126)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(126),"long_name","ATLID Backscattering Ratio (SR) Bin Bounds") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(126),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(126),"standard_name", "backscattering_ratio") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! PARASOL simulator output - if (associated(cospOUT%parasolPix_refl)) then - status = nf90_def_var(fileID,"parasolPix_refl",nf90_float, (/dimID(1),dimID(2),dimID(13)/),varID(20)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(20),"long_name","PARASOL Subcolumn Reflectance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(20),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(20),"standard_name", "toa_bidirectional_reflectance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%parasolGrid_refl)) then - status = nf90_def_var(fileID,"parasolGrid_refl",nf90_float, (/dimID(1),dimID(13)/),varID(21)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(21),"long_name","PARASOL Reflectance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(21),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(21),"standard_name", "toa_bidirectional_reflectance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%parasolPix_refl) .or.associated(cospOUT%parasolGrid_refl)) then - status = nf90_def_var(fileID,"PARASOL_NREFL",nf90_float, (/dimID(13)/),varID(87)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(87),"long_name","PARASOL Solar Zenith Angle") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(87),"units", "degree") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(87),"standard_name", "solar_zenith_angle") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! Cloudsat simulator output - if (associated(cospOUT%cloudsat_Ze_tot)) then - status = nf90_def_var(fileID,"dbze94",nf90_float, (/dimID(1),dimID(2),dimID(3)/),varID(22)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(22),"long_name","CloudSat Radar Reflectivity") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(22),"units", "dBZ") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(22),"standard_name", "equivalent_reflectivity_factor") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%cloudsat_cfad_ze)) then - status = nf90_def_var(fileID,"cfadDbze94",nf90_float, (/dimID(1),dimID(14),dimID(4)/),varID(23)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(23),"long_name","CloudSat Radar reflectivity CFAD") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(23),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(23),"standard_name", "histogram_of_equivalent_reflectivity_factor_over_height_above_reference_ellipsoid") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"cloudsat_DBZE_BINS",nf90_float, (/dimID(14)/),varID(88)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(88),"long_name","CloudSat simulator equivalent radar reflectivity factor") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(88),"units", "dBZ") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(88),"standard_name", "equivalent_reflectivity_factor") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%cloudsat_precip_cover)) then - status = nf90_def_var(fileID,"ptcloudsatflag0",nf90_float, (/dimID(1)/),varID(127)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(127),"long_name","Cloudsat precipitation cover for flag0") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(127),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"ptcloudsatflag1",nf90_float, (/dimID(1)/),varID(128)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(128),"long_name","Cloudsat precipitation cover for flag1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(128),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"ptcloudsatflag2",nf90_float, (/dimID(1)/),varID(129)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(129),"long_name","Cloudsat precipitation cover for flag2") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(129),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"ptcloudsatflag3",nf90_float, (/dimID(1)/),varID(130)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(130),"long_name","Cloudsat precipitation cover for flag3") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(130),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"ptcloudsatflag4",nf90_float, (/dimID(1)/),varID(131)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(131),"long_name","Cloudsat precipitation cover for flag4") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(131),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"ptcloudsatflag5",nf90_float, (/dimID(1)/),varID(132)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(132),"long_name","Cloudsat precipitation cover for flag5") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(132),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"ptcloudsatflag6",nf90_float, (/dimID(1)/),varID(133)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(133),"long_name","Cloudsat precipitation cover for flag6") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(133),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"ptcloudsatflag7",nf90_float, (/dimID(1)/),varID(134)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(134),"long_name","Cloudsat precipitation cover for flag7") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(134),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"ptcloudsatflag8",nf90_float, (/dimID(1)/),varID(135)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(135),"long_name","Cloudsat precipitation cover for flag8") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(135),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"ptcloudsatflag9",nf90_float, (/dimID(1)/),varID(136)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(136),"long_name","Cloudsat precipitation cover for flag9") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(136),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%cloudsat_pia)) then - status = nf90_def_var(fileID,"cloudsatpia",nf90_float, (/dimID(1)/),varID(137)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(137),"long_name","Cloudsat path integrated attenuation") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(137),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! ISCCP simulator outputs - if (associated(cospOUT%isccp_totalcldarea)) then - status = nf90_def_var(fileID,"cltisccp",nf90_float, (/dimID(1)/),varID(24)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(24),"long_name","ISCCP Total Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(24),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(24),"standard_name", "cloud_area_fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_meantb)) then - status = nf90_def_var(fileID,"meantbisccp",nf90_float, (/dimID(1)/),varID(25)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(25),"long_name","ISCCP all-sky 10.5 micron brightness temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(25),"units", "K") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(25),"standard_name", "toa_brightness_temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_meantbclr)) then - status = nf90_def_var(fileID,"meantbclrisccp",nf90_float, (/dimID(1)/),varID(26)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(26),"long_name","ISCCP clear-sky 10.5 micron brightness temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(26),"units", "K") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(26),"standard_name", "toa_brightness_temperature_assuming_clear_sky") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_meanptop)) then - status = nf90_def_var(fileID,"pctisccp",nf90_float, (/dimID(1)/),varID(27)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(27),"long_name","ISCCP Mean Cloud Top Pressure") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(27),"units", "hPa") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(27),"standard_name", "air_pressure_at_cloud_top") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_meantaucld)) then - status = nf90_def_var(fileID,"tauisccp",nf90_float, (/dimID(1)/),varID(28)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(28),"long_name","ISCCP Mean Optical Depth") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(28),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(28),"standard_name", "atmosphere_optical_thickness_due_to_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_meanalbedocld)) then - status = nf90_def_var(fileID,"albisccp",nf90_float, (/dimID(1)/),varID(29)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(29),"long_name","ISCCP Mean Cloud Albedo") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(29),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(29),"standard_name", "cloud_albedo") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_boxtau)) then - status = nf90_def_var(fileID,"boxtauisccp",nf90_float, (/dimID(1),dimID(2)/),varID(30)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(30),"long_name","ISCCP Subcolumn Optical Depth") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(30),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(30),"standard_name", "atmosphere_optical_thickness_due_to_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_boxptop)) then - status = nf90_def_var(fileID,"boxptopisccp",nf90_float, (/dimID(1),dimID(2)/),varID(31)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(31),"long_name","ISCCP Subcolumn Cloud Top Pressure") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(31),"units", "Pa") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(31),"standard_name", "air_pressure_at_cloud_top") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_fq)) then - status = nf90_def_var(fileID,"clisccp",nf90_float, (/dimID(1),dimID(5),dimID(7)/),varID(32)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(32),"long_name","ISCCP joint-PDF of cloud top pressure and optical depth") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(32),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(32),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! MISR simulator output - if (associated(cospOUT%misr_fq)) then - status = nf90_def_var(fileID,"clMISR",nf90_float, (/dimID(1),dimID(5),dimID(8)/),varID(33)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(33),"long_name","MISR joint-PDF of cloud top pressure and optical depth") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(33),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(33),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%misr_meanztop)) then - status = nf90_def_var(fileID,"misr_meanztop",nf90_float, (/dimID(1)/),varID(34)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(34),"long_name","MISR Mean Cloud Top Height") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(34),"units", "m") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(34),"standard_name", "cloud_top_altitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%misr_cldarea)) then - status = nf90_def_var(fileID,"misr_cldarea",nf90_float, (/dimID(1)/),varID(35)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(35),"long_name","MISR cloud cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(35),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(35),"standard_name", "cloud_area_fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! MODIS simulator output - if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) then - status = nf90_def_var(fileID,"cltmodis",nf90_float, (/dimID(1)/),varID(36)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(36),"long_name","MODIS Total Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(36),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(36),"standard_name", "cloud_area_fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) then - status = nf90_def_var(fileID,"clwmodis",nf90_float, (/dimID(1)/),varID(37)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(37),"long_name","MODIS Liquid Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(37),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(37),"standard_name", "cloud_area_fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) then - status = nf90_def_var(fileID,"climodis",nf90_float, (/dimID(1)/),varID(38)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(38),"long_name","MODIS Ice Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(38),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(38),"standard_name", "cloud_area_fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) then - status = nf90_def_var(fileID,"clhmodis",nf90_float, (/dimID(1)/),varID(39)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(39),"long_name","MODIS High Level Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(39),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(39),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) then - status = nf90_def_var(fileID,"clmmodis",nf90_float, (/dimID(1)/),varID(40)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(40),"long_name","MODIS Mid Level Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(40),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(40),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) then - status = nf90_def_var(fileID,"cllmodis",nf90_float, (/dimID(1)/),varID(41)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(41),"long_name","MODIS Low Level Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(41),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(41),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) then - status = nf90_def_var(fileID,"tautmodis",nf90_float, (/dimID(1)/),varID(42)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(42),"long_name","MODIS Total Cloud Optical Thickness") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(42),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(42),"standard_name", "atmosphere_optical_thickness_due_to_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) then - status = nf90_def_var(fileID,"tauwmodis",nf90_float, (/dimID(1)/),varID(43)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(43),"long_name","MODIS Liquid Cloud Optical Thickness") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(43),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(43),"standard_name", "atmosphere_optical_thickness_due_to_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) then - status = nf90_def_var(fileID,"tauimodis",nf90_float, (/dimID(1)/),varID(44)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(44),"long_name","MODIS Ice Cloud Optical Thickness") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(44),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(44),"standard_name", "atmosphere_optical_thickness_due_to_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_Total_logMean)) then - status = nf90_def_var(fileID,"tautlogmodis",nf90_float, (/dimID(1)/),varID(45)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(45),"long_name","MODIS Total Cloud Optical Thickness (Log10 Mean)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(45),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(45),"standard_name", "atmosphere_optical_thickness_due_to_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_Water_logMean)) then - status = nf90_def_var(fileID,"tauwlogmodis",nf90_float, (/dimID(1)/),varID(46)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(46),"long_name","MODIS Liquid Cloud Optical Thickness (Log10 Mean)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(46),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(46),"standard_name", "atmosphere_optical_thickness_due_to_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_Ice_logMean)) then - status = nf90_def_var(fileID,"tauilogmodis",nf90_float, (/dimID(1)/),varID(47)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(47),"long_name","MODIS Ice Cloud Optical Thickness (Log10 Mean)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(47),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(47),"standard_name", "atmosphere_optical_thickness_due_to_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) then - status = nf90_def_var(fileID,"reffclwmodis",nf90_float, (/dimID(1)/),varID(48)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(48),"long_name","MODIS Liquid Cloud Particle Size") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(48),"units", "m") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(48),"standard_name", "effective_radius_of_cloud_liquid_water_particle") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) then - status = nf90_def_var(fileID,"reffclimodis",nf90_float, (/dimID(1)/),varID(49)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(49),"long_name","MODIS Ice Cloud Particle Size") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(49),"units", "m") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(49),"standard_name", "effective_radius_of_cloud_liquid_water_particle") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) then - status = nf90_def_var(fileID,"pctmodis",nf90_float, (/dimID(1)/),varID(50)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(50),"long_name","MODIS Cloud Top Pressure") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(50),"units", "hPa") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(50),"standard_name", "air_pressure_at_cloud_top") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) then - status = nf90_def_var(fileID,"lwpmodis",nf90_float, (/dimID(1)/),varID(51)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(51),"long_name","MODIS Cloud Liquid Water Path") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(51),"units", "kg m-2") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(51),"standard_name", "atmosphere_cloud_liquid_water_content") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Ice_Water_Path_Mean)) then - status = nf90_def_var(fileID,"iwpmodis",nf90_float, (/dimID(1)/),varID(52)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(52),"long_name","MODIS Cloud Ice Water Path") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(52),"units", "kg m-2") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(52),"standard_name", "atmosphere_mass_content_of_cloud_ice") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) then - status = nf90_def_var(fileID,"clmodis",nf90_float, (/dimID(1),dimID(5),dimID(7)/),varID(53)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(53),"long_name","MODIS joint-PDF of cloud top pressure and optical depth") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(53),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(53),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) then - status = nf90_def_var(fileID,"clmodis_liq",nf90_float, (/dimID(1),dimID(5),dimID(7)/),varID(148)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(148),"long_name","MODIS joint-PDF of liquid cloud top pressure and optical depth") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(148),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(148),"standard_name", "cloud_area_fraction_in_atmosphere_layer_liq") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) then - status = nf90_def_var(fileID,"clmodis_ice",nf90_float, (/dimID(1),dimID(5),dimID(7)/),varID(149)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(149),"long_name","MODIS joint-PDF of ice cloud top pressure and optical depth") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(149),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(149),"standard_name", "cloud_area_fraction_in_atmosphere_layer_ice") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) then - status = nf90_def_var(fileID,"modis_Optical_Thickness_vs_ReffICE",nf90_float, (/dimID(1),dimID(5),dimID(16)/),varID(54)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(54),"long_name","MODIS Joint-PDF of optical-depth and ice particle size") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(54),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"REICE_MODIS",nf90_float, (/dimID(16)/),varID(89)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(89),"long_name","MODIS Joint-PDF ice particle size bin centers") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(89),"units", "meters") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) then - status = nf90_def_var(fileID,"modis_Optical_Thickness_vs_ReffLIQ",nf90_float, (/dimID(1),dimID(5),dimID(15)/),varID(55)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(55),"long_name","MODIS Joint-PDF of optical-depth and liquid particle size") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(55),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"RELIQ_MODIS",nf90_float, (/dimID(15)/),varID(90)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(90),"long_name","MODIS Joint-PDF liquid particle size bin centers") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(90),"units", "meters") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! Joint simulator products. - if (associated(cospOUT%lidar_only_freq_cloud)) then - status = nf90_def_var(fileID,"clcalipso2",nf90_float, (/dimID(1),dimID(4)/),varID(56)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(56),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(56),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(56),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%radar_lidar_tcc)) then - status = nf90_def_var(fileID,"cltlidarradar",nf90_float, (/dimID(1)/),varID(57)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(57),"long_name","CALIPSO and CloudSat Total Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(57),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(57),"standard_name", "cloud_area_fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%cloudsat_tcc)) then - status = nf90_def_var(fileID,"cloudsat_tcc",nf90_float, (/dimID(1)/),varID(138)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(138),"long_name","CloudSat Total Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(138),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(138),"standard_name", "cloud_area_fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%cloudsat_tcc2)) then - status = nf90_def_var(fileID,"cloudsat_tcc2",nf90_float, (/dimID(1)/),varID(139)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(139),"long_name","CloudSat Total Cloud Fraction (no 1km)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(139),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(139),"standard_name", "cloud_area_fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - ! warm-rain occurrence frequency diagnostics - if (associated(cospOUT%wr_occfreq_ntotal)) then - status = nf90_def_var(fileID,"npdfcld",nf90_float, (/dimID(1)/),varID(140)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(140),"long_name","# of Non-Precipitating Clouds") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(140),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(140),"standard_name", "number_of_slwc_nonprecip") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"npdfdrz",nf90_float, (/dimID(1)/),varID(141)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(141),"long_name","# of Drizzling Clouds") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(141),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(141),"standard_name", "number_of_slwc_drizzle") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"npdfrain",nf90_float, (/dimID(1)/),varID(142)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(142),"long_name","# of Precipitating Clouds") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(142),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(142),"standard_name", "number_of_slwc_precip") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - ! Contoured Frequency by Optical Depth Diagram (CFODD) - if (associated(cospOUT%cfodd_ntotal)) then - status = nf90_def_var(fileID,"ncfodd1",nf90_float, (/dimID(1),dimID(17),dimID(18)/),varID(143)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(143),"long_name","# of CFODD (05 < Reff < 12 micron)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(143),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(143),"standard_name", "cfodd_reff_small") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"ncfodd2",nf90_float, (/dimID(1),dimID(17),dimID(18)/),varID(144)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(144),"long_name","# of CFODD (12 < Reff < 18 micron)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(144),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(144),"standard_name", "cfodd_reff_medium") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"ncfodd3",nf90_float, (/dimID(1),dimID(17),dimID(18)/),varID(145)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(145),"long_name","# of CFODD (18 < Reff < 35 micron)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(145),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(145),"standard_name", "cfodd_reff_large") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - !! axes for CFODD - status = nf90_def_var(fileID,"CFODD_NDBZE",nf90_float,(/dimID(17)/),varID(146)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(146),"long_name","CloudSat+MODIS dBZe vs ICOD joint PDF X-axis") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(146),"units", "dBZ") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(146),"standard_name", "cloudsat_quivalent_reflectivity_factor") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"CFODD_NICOD",nf90_float,(/dimID(18)/),varID(147)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(147),"long_name","CloudSat+MODIS dBZe vs ICOD joint PDF Y-axis") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(147),"units", "none") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(147),"standard_name", "modis_in-cloud_optical_depth") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! added by DPLRW - if (associated(cospOUT%dplrw_Z)) then - ! axes - status = nf90_def_var(fileID,"lvtemp_grid",nf90_float,(/dimID(19)/),varID(150)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(150),"long_name","Temperature axis for DPLRW CFED") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(150),"units", "degree C") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"lvdBZe_grid",nf90_float,(/dimID(20)/),varID(151)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(151),"long_name","dBZe axis for DPLRW CFED") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(151),"units", "dBZe") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"lvdplr_grid",nf90_float,(/dimID(21)/),varID(152)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(152),"long_name","Doppler velocity axis for DPLRW CFED") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(152),"units", "m/s") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"lvspwd_grid",nf90_float,(/dimID(22)/),varID(153)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(153),"long_name","spectrum width axis for DPLRW CFED") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(153),"units", "m/s") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"regimeID",nf90_INT,(/dimID(23)/),varID(154)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(154),"long_name","regime ID: 0=ALL, 1=LS, 2=CU") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(154),"units", "None") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"nrmlzdID",nf90_INT,(/dimID(24)/),varID(155)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(155),"long_name","normalized ID: 1=Ze, 2=mass, 3=number") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(155),"units", "None") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - ! variables - status = nf90_def_var(fileID,"dplrw_Z",nf90_float,(/dimID(1),dimID(21),dimID(4),dimID(23)/),varID(156)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(156),"long_name","Number of samples onto histogram, Doppler velocity/Altitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(156),"units", "#") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"spwid_Z",nf90_float,(/dimID(1),dimID(22),dimID(4),dimID(23)/),varID(157)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(157),"long_name","Number of samples onto histogram, Spectrum width/Altitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(157),"units", "#") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"Zef94_Z",nf90_float,(/dimID(1),dimID(20),dimID(4),dimID(23)/),varID(158)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(158),"long_name","Number of samples onto histogram, Radar reflectivity/Altitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(158),"units", "#") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - status = nf90_def_var(fileID,"dplrw_T",nf90_float,(/dimID(1),dimID(21),dimID(19),dimID(23)/),varID(159)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(159),"long_name","Number of samples onto histogram, Doppler velocity/Temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(159),"units", "#") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"spwid_T",nf90_float,(/dimID(1),dimID(22),dimID(19),dimID(23)/),varID(160)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(160),"long_name","Number of samples onto histogram, Spectrum width/Temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(160),"units", "#") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"Zef94_T",nf90_float,(/dimID(1),dimID(20),dimID(19),dimID(23)/),varID(161)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(161),"long_name","Number of samples onto histogram, Radar reflectivity/Temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(161),"units", "#") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - status = nf90_def_var(fileID,"ZefVd_2",nf90_float,(/dimID(1),dimID(21),dimID(20),dimID(23)/),varID(162)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(162),"long_name","Number of samples onto histogram, Radar reflectivity/Doppler velocity") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(162),"units", "#") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - status = nf90_def_var(fileID,"gwcum",nf90_float,(/dimID(1),dimID(3)/),varID(163)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(163),"long_name","in-cloud cumulus upward velocity") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(163),"units", "m/s") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - !~~~ - status = nf90_def_var(fileID,"vfall_Z",nf90_float,(/dimID(1),dimID(21),dimID(4),dimID(23),dimID(24)/),varID(164)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(164),"long_name","Number of samples onto histogram, terminal velocity/Altitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(164),"units", "#") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"gridw_Z",nf90_float,(/dimID(1),dimID(21),dimID(4),dimID(23)/),varID(165)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(165),"long_name","Number of samples onto histogram, grid w velocity/Altitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(165),"units", "#") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - status = nf90_def_var(fileID,"vfall_T",nf90_float,(/dimID(1),dimID(21),dimID(19),dimID(23),dimID(24)/),varID(166)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(166),"long_name","Number of samples onto histogram, terminal velocity/Temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(166),"units", "#") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"gridw_T",nf90_float,(/dimID(1),dimID(21),dimID(19),dimID(23)/),varID(167)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(167),"long_name","Number of samples onto histogram, grid w velocity/Temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(167),"units", "#") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - status = nf90_def_var(fileID,"ZefVf_2",nf90_float,(/dimID(1),dimID(21),dimID(20),dimID(23),dimID(24)/),varID(168)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(168),"long_name","Number of samples onto histogram, Radar reflectivity/terminal velocity") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(168),"units", "#") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - end if - - - ! --------------------------------------------------------------------------------------- - ! RTTOV - JKS - ! --------------------------------------------------------------------------------------- - - ! Define instrument channel indices for multiple RTTOV instruments - ii = 169 ! RTTOV variable indices start at 170 - if (allocated(cospOUT%rttov_outputs)) then - do i=1,Ninst_rttov - write (i_str,fmt) i ! converting integer to string i_str using a 'internal file' - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) then - ii = ii + 1 - status = nf90_def_var(fileID,"RTTOV_CHAN_INST"//trim(i_str),nf90_float, (/dimID(24+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Channel Indices") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_ichan") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%bt_total)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_bt_total_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV All-sky Brightness Temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "Degrees Kelvin") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_allsky_bt") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_bt_clear_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Clear-sky Brightness Temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "Degrees Kelvin") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_clearsky_bt") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%rad_total)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_rad_total_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV All-sky Radiance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_allsky_rad") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_rad_clear_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Clear-sky Radiance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_clearsky_rad") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_rad_cloudy_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Cloudy-sky Radiance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_cloudysky_rad") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%refl_total)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_refl_total_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV All-sky Reflectance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "unitless") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "bleh") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_refl_clear_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Clear-sky Reflectance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "unitless") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_allsky_refl") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_bt_clear_pc_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","PC-RTTOV Clear-sky Brightness Temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "Degrees Kelvin") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "pcrttov_clearsky_bt") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_rad_clear_pc_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(24+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","PC-RTTOV Clear-sky Radiance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "pcrttov_clearsky_rad") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - end do - end if - - - ! --------------------------------------------------------------------------------------- - ! RTTOV - JKS - ! --------------------------------------------------------------------------------------- - - ! Define instrument channel indices for multiple RTTOV instruments - ii = 165 ! RTTOV variable indices start at 165 - if (allocated(cospOUT%rttov_outputs)) then - do i=1,Ninst_rttov - write (i_str,fmt) i ! converting integer to string i_str using a 'internal file' - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) then - ii = ii + 1 - status = nf90_def_var(fileID,"RTTOV_CHAN_INST"//trim(i_str),nf90_float, (/dimID(20+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Channel Indices") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_ichan") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%bt_total)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_bt_total_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV All-sky Brightness Temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "Degrees Kelvin") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_allsky_bt") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_bt_clear_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Clear-sky Brightness Temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "Degrees Kelvin") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_clearsky_bt") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%rad_total)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_rad_total_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV All-sky Radiance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_allsky_rad") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_rad_clear_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Clear-sky Radiance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_clearsky_rad") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_rad_cloudy_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Cloudy-sky Radiance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_cloudysky_rad") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%refl_total)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_refl_total_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV All-sky Reflectance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "unitless") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "bleh") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_refl_clear_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Clear-sky Reflectance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "unitless") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_allsky_refl") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_bt_clear_pc_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","PC-RTTOV Clear-sky Brightness Temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "Degrees Kelvin") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "pcrttov_clearsky_bt") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_rad_clear_pc_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","PC-RTTOV Clear-sky Radiance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "pcrttov_clearsky_rad") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - end do - end if - - ! --------------------------------------------------------------------------------------- - ! Exit define mode - ! --------------------------------------------------------------------------------------- - status = nf90_enddef(fileID) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - ! --------------------------------------------------------------------------------------- - ! Populate outputs - ! --------------------------------------------------------------------------------------- - ! Geo - status = nf90_put_var(fileID,varID(1),lon) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(2),lat) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Joint-histogram axis variables - status = nf90_put_var(fileID,varID(3),tau_binCenters) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(4),tau_binEdges) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(5),pres_binCenters) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(6),pres_binEdges) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(7),hgt_binCenters) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(8),hgt_binEdges) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(84),lev) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(85),vgrid_z) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(86),cosp_scol) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(82),bnds) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(83),loc) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! added by DPLRW - status = nf90_put_var(fileID,varID(150),lvtemp_grid) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(151),lvdBZe_grid) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(152),lvdplr_grid) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(153),lvspwd_grid) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(154),(/0,1,2/) ) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(155),(/1,2,3/) ) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - ! CALIPSO simulator output - if (associated(cospOUT%calipso_betaperp_tot)) then - status = nf90_put_var(fileID,varID(9),cospOUT%calipso_betaperp_tot) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_beta_tot)) then - status = nf90_put_var(fileID,varID(10),cospOUT%calipso_beta_tot) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_lidarcldphase)) then - status = nf90_put_var(fileID,varID(58),cospOUT%calipso_lidarcldphase(:,:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(59),cospOUT%calipso_lidarcldphase(:,:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(60),cospOUT%calipso_lidarcldphase(:,:,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cldlayerphase)) then - ! Ice - status = nf90_put_var(fileID,varID(61),cospOUT%calipso_cldlayerphase(:,1,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(62),cospOUT%calipso_cldlayerphase(:,2,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(63),cospOUT%calipso_cldlayerphase(:,3,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(64),cospOUT%calipso_cldlayerphase(:,4,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Liquid - status = nf90_put_var(fileID,varID(65),cospOUT%calipso_cldlayerphase(:,1,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(66),cospOUT%calipso_cldlayerphase(:,2,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(67),cospOUT%calipso_cldlayerphase(:,3,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(68),cospOUT%calipso_cldlayerphase(:,4,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Undetermined - status = nf90_put_var(fileID,varID(69),cospOUT%calipso_cldlayerphase(:,1,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(70),cospOUT%calipso_cldlayerphase(:,2,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(71),cospOUT%calipso_cldlayerphase(:,3,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(72),cospOUT%calipso_cldlayerphase(:,4,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_lidarcldtmp)) then - status = nf90_put_var(fileID,varID(77),cospOUT%calipso_lidarcldtmp(:,:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(78),cospOUT%calipso_lidarcldtmp(:,:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(79),cospOUT%calipso_lidarcldtmp(:,:,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(80),cospOUT%calipso_lidarcldtmp(:,:,4)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cfad_sr)) then - status = nf90_put_var(fileID,varID(15),cospOUT%calipso_cfad_sr) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_lidarcld)) then - status = nf90_put_var(fileID,varID(16),cospOUT%calipso_lidarcld) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cldlayer)) then - status = nf90_put_var(fileID,varID(73),cospOUT%calipso_cldlayer(:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(74),cospOUT%calipso_cldlayer(:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(75),cospOUT%calipso_cldlayer(:,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(76),cospOUT%calipso_cldlayer(:,4)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_beta_mol)) then - status = nf90_put_var(fileID,varID(18),cospOUT%calipso_beta_mol) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_srbval)) then - status = nf90_put_var(fileID,varID(19),reshape([cospOUT%calipso_srbval(1:SR_BINS),cospOUT%calipso_srbval(2:SR_BINS+1)],(/2,SR_BINS/))) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_srbval) .or. associated(cospOUT%calipso_cfad_sr)) then - status = nf90_put_var(fileID,varID(81),calipso_binCenters) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - !OPAQ diagnostics - if (associated(cospOUT%calipso_cldtype)) then - status = nf90_put_var(fileID,varID(91),cospOUT%calipso_cldtype(:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(92),cospOUT%calipso_cldtype(:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(93),cospOUT%calipso_cldtype(:,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_lidarcldtype)) then - status = nf90_put_var(fileID,varID(94),cospOUT%calipso_lidarcldtype(:,:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(95),cospOUT%calipso_lidarcldtype(:,:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(96),cospOUT%calipso_lidarcldtype(:,:,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(97),cospOUT%calipso_lidarcldtype(:,:,4)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cldtypetemp)) then - status = nf90_put_var(fileID,varID(98),cospOUT%calipso_cldtypetemp(:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(99),cospOUT%calipso_cldtypetemp(:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(100),cospOUT%calipso_cldtypetemp(:,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cldtypemeanz)) then - status = nf90_put_var(fileID,varID(101),cospOUT%calipso_cldtypemeanz(:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(102),cospOUT%calipso_cldtypemeanz(:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cldthinemis)) then - status = nf90_put_var(fileID,varID(103),cospOUT%calipso_cldthinemis) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cldtypemeanzse)) then - status = nf90_put_var(fileID,varID(104),cospOUT%calipso_cldtypemeanzse(:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(105),cospOUT%calipso_cldtypemeanzse(:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(106),cospOUT%calipso_cldtypemeanzse(:,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! GROUND LIDAR simulator output - if (associated(cospOUT%grLidar532_cldlayer)) then - status = nf90_put_var(fileID,varID(107),cospOUT%grLidar532_cldlayer(:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(108),cospOUT%grLidar532_cldlayer(:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(109),cospOUT%grLidar532_cldlayer(:,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(110),cospOUT%grLidar532_cldlayer(:,4)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%grLidar532_lidarcld)) then - status = nf90_put_var(fileID,varID(111),cospOUT%grLidar532_lidarcld) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%grLidar532_beta_mol)) then - status = nf90_put_var(fileID,varID(112),cospOUT%grLidar532_beta_mol) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%grLidar532_cfad_sr)) then - status = nf90_put_var(fileID,varID(113),cospOUT%grLidar532_cfad_sr) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%grLidar532_beta_tot)) then - status = nf90_put_var(fileID,varID(114),cospOUT%grLidar532_beta_tot) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - if (associated(cospOUT%grLidar532_srbval)) then - status = nf90_put_var(fileID,varID(116),reshape([cospOUT%grLidar532_srbval(1:SR_BINS),cospOUT%grLidar532_srbval(2:SR_BINS+1)],(/2,SR_BINS/))) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%grLidar532_srbval) .or. associated(cospOUT%grLidar532_cfad_sr)) then - status = nf90_put_var(fileID,varID(115),grLidar532_binCenters) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! ATLID simulator output - if (associated(cospOUT%atlid_cldlayer)) then - status = nf90_put_var(fileID,varID(117),cospOUT%atlid_cldlayer(:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(118),cospOUT%atlid_cldlayer(:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(119),cospOUT%atlid_cldlayer(:,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(120),cospOUT%atlid_cldlayer(:,4)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%atlid_lidarcld)) then - status = nf90_put_var(fileID,varID(121),cospOUT%atlid_lidarcld) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%atlid_beta_mol)) then - status = nf90_put_var(fileID,varID(122),cospOUT%atlid_beta_mol) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%atlid_cfad_sr)) then - status = nf90_put_var(fileID,varID(123),cospOUT%atlid_cfad_sr) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%atlid_beta_tot)) then - status = nf90_put_var(fileID,varID(124),cospOUT%atlid_beta_tot) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - if (associated(cospOUT%atlid_srbval)) then - status = nf90_put_var(fileID,varID(126),reshape([cospOUT%atlid_srbval(1:SR_BINS),cospOUT%atlid_srbval(2:SR_BINS+1)],(/2,SR_BINS/))) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%atlid_srbval) .or. associated(cospOUT%atlid_cfad_sr)) then - status = nf90_put_var(fileID,varID(125),atlid_binCenters) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! PARASOL simulator output - if (associated(cospOUT%parasolPix_refl)) then - status = nf90_put_var(fileID,varID(20),cospOUT%parasolPix_refl) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%parasolGrid_refl)) then - status = nf90_put_var(fileID,varID(21),cospOUT%parasolGrid_refl) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%parasolPix_refl) .or.associated(cospOUT%parasolGrid_refl)) then - status = nf90_put_var(fileID,varID(87),PARASOL_SZA) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! Cloudsat simulator output - if (associated(cospOUT%cloudsat_Ze_tot)) then - status = nf90_put_var(fileID,varID(22),cospOUT%cloudsat_Ze_tot) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%cloudsat_cfad_ze)) then - status = nf90_put_var(fileID,varID(23),cospOUT%cloudsat_cfad_ze) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(88),cloudsat_binCenters) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%cloudsat_precip_cover)) then - status = nf90_put_var(fileID,varID(127),cospOUT%cloudsat_precip_cover(:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(128),cospOUT%cloudsat_precip_cover(:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(129),cospOUT%cloudsat_precip_cover(:,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(130),cospOUT%cloudsat_precip_cover(:,4)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(131),cospOUT%cloudsat_precip_cover(:,5)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(132),cospOUT%cloudsat_precip_cover(:,6)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(133),cospOUT%cloudsat_precip_cover(:,7)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(134),cospOUT%cloudsat_precip_cover(:,8)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(135),cospOUT%cloudsat_precip_cover(:,9)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(136),cospOUT%cloudsat_precip_cover(:,10)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%cloudsat_pia)) then - status = nf90_put_var(fileID,varID(137),cospOUT%cloudsat_pia) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - if (associated(cospOUT%isccp_totalcldarea)) then - status = nf90_put_var(fileID,varID(24),cospOUT%isccp_totalcldarea) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_meantb)) then - status = nf90_put_var(fileID,varID(25),cospOUT%isccp_meantb) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_meantbclr)) then - status = nf90_put_var(fileID,varID(26),cospOUT%isccp_meantbclr) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_meanptop)) then - status = nf90_put_var(fileID,varID(27),cospOUT%isccp_meanptop) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_meantaucld)) then - status = nf90_put_var(fileID,varID(28),cospOUT%isccp_meantaucld) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_meanalbedocld)) then - status = nf90_put_var(fileID,varID(29),cospOUT%isccp_meanalbedocld) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_boxtau)) then - status = nf90_put_var(fileID,varID(30),cospOUT%isccp_boxtau) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_boxptop)) then - status = nf90_put_var(fileID,varID(31),cospOUT%isccp_boxptop) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_fq)) then - status = nf90_put_var(fileID,varID(32),cospOUT%isccp_fq) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - ! MISR simulator output - if (associated(cospOUT%misr_fq)) then - status = nf90_put_var(fileID,varID(33),cospOUT%misr_fq) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%misr_meanztop)) then - status = nf90_put_var(fileID,varID(34),cospOUT%misr_meanztop) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%misr_cldarea)) then - status = nf90_put_var(fileID,varID(35),cospOUT%misr_cldarea) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - ! MODIS simulator output - if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) then - status = nf90_put_var(fileID,varID(36),cospOUT%modis_Cloud_Fraction_Total_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) then - status = nf90_put_var(fileID,varID(37),cospOUT%modis_Cloud_Fraction_Water_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) then - status = nf90_put_var(fileID,varID(38),cospOUT%modis_Cloud_Fraction_Ice_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) then - status = nf90_put_var(fileID,varID(39),cospOUT%modis_Cloud_Fraction_High_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) then - status = nf90_put_var(fileID,varID(40),cospOUT%modis_Cloud_Fraction_Mid_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) then - status = nf90_put_var(fileID,varID(41),cospOUT%modis_Cloud_Fraction_Low_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) then - status = nf90_put_var(fileID,varID(42),cospOUT%modis_Optical_Thickness_Total_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) then - status = nf90_put_var(fileID,varID(43),cospOUT%modis_Optical_Thickness_Water_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) then - status = nf90_put_var(fileID,varID(44),cospOUT%modis_Optical_Thickness_Ice_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) then - status = nf90_put_var(fileID,varID(45),cospOUT%modis_Optical_Thickness_Total_LogMean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) then - status = nf90_put_var(fileID,varID(46),cospOUT%modis_Optical_Thickness_Water_LogMean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) then - status = nf90_put_var(fileID,varID(47),cospOUT%modis_Optical_Thickness_Ice_LogMean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) then - status = nf90_put_var(fileID,varID(48),cospOUT%modis_Cloud_Particle_Size_Water_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) then - status = nf90_put_var(fileID,varID(49),cospOUT%modis_Cloud_Particle_Size_Ice_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) then - status = nf90_put_var(fileID,varID(50),cospOUT%modis_Cloud_Top_Pressure_Total_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) then - status = nf90_put_var(fileID,varID(51),cospOUT%modis_Liquid_Water_Path_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Ice_Water_Path_Mean)) then - status = nf90_put_var(fileID,varID(52),cospOUT%modis_Ice_Water_Path_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) then - status = nf90_put_var(fileID,varID(53),cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) then - status = nf90_put_var(fileID,varID(148),cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) then - status = nf90_put_var(fileID,varID(149),cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) then - status = nf90_put_var(fileID,varID(54),cospOUT%modis_Optical_Thickness_vs_ReffICE) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(89),reffICE_binCenters) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) then - status = nf90_put_var(fileID,varID(55),cospOUT%modis_Optical_Thickness_vs_ReffLIQ) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(90),reffLIQ_binCenters) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - if (associated(cospOUT%lidar_only_freq_cloud)) then - status = nf90_put_var(fileID,varID(56),cospOUT%lidar_only_freq_cloud) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%radar_lidar_tcc)) then - status = nf90_put_var(fileID,varID(57),cospOUT%radar_lidar_tcc) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%cloudsat_tcc)) then - status = nf90_put_var(fileID,varID(138),cospOUT%cloudsat_tcc) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%cloudsat_tcc2)) then - status = nf90_put_var(fileID,varID(139),cospOUT%cloudsat_tcc2) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! Cloudsat+MODIS Joint simulators output - !! warm-rain occurrence frequency diagnostics - if (associated(cospOUT%wr_occfreq_ntotal)) then - status = nf90_put_var(fileID,varID(140),cospOUT%wr_occfreq_ntotal(:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(141),cospOUT%wr_occfreq_ntotal(:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(142),cospOUT%wr_occfreq_ntotal(:,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - !! Contoured Frequency by Optical Depth Diagram (CFODD) - if (associated(cospOUT%cfodd_ntotal)) then - status = nf90_put_var(fileID,varID(143),cospOUT%cfodd_ntotal(:,:,:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(144),cospOUT%cfodd_ntotal(:,:,:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(145),cospOUT%cfodd_ntotal(:,:,:,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(146),CFODD_HISTDBZEcenters) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(147),CFODD_HISTICODcenters) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! added by DPLRW - if (associated(cospOUT%dplrw_Z))then - status = nf90_put_var(fileID,varID(156),cospOUT%dplrw_Z) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(157),cospOUT%spwid_Z) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(158),cospOUT%Zef94_Z) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - status = nf90_put_var(fileID,varID(159),cospOUT%dplrw_T) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(160),cospOUT%spwid_T) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(161),cospOUT%Zef94_T) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - status = nf90_put_var(fileID,varID(162),cospOUT%ZefVd_2) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - status = nf90_put_var(fileID,varID(163),cospOUT%gcumw) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - status = nf90_put_var(fileID,varID(164),cospOUT%vfall_Z) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(165),cospOUT%gridw_Z) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - status = nf90_put_var(fileID,varID(166),cospOUT%vfall_T) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(167),cospOUT%gridw_T) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - status = nf90_put_var(fileID,varID(168),cospOUT%ZefVf_2) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - end if - - ! Define instrument channel indices for multiple RTTOV instruments - ii = 169 ! RTTOV variable indices start at 170 - if (allocated(cospOUT%rttov_outputs)) then - do i=1,Ninst_rttov - write (i_str,fmt) i ! converting integer to string i_str using a 'internal file' - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) then - ii = ii + 1 - status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%channel_indices) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%bt_total)) then - ii = ii + 1 - status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%bt_total) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) then - ii = ii + 1 - status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%bt_clear) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%rad_total)) then - ii = ii + 1 - status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%rad_total) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) then - ii = ii + 1 - status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%rad_clear) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) then - ii = ii + 1 - status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%rad_cloudy) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%refl_total)) then - ii = ii + 1 - status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%refl_total) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) then - ii = ii + 1 - status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%refl_clear) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) then - ii = ii + 1 - status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%bt_total_pc) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) then - ii = ii + 1 - status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%rad_total_pc) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - end do - end if - - ! Close file - status = nf90_close(fileID) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - end subroutine write_cosp2_output - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE nc_read_input_file - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - SUBROUTINE NC_READ_INPUT_FILE(fname,Npnts,Nl,Nhydro,lon,lat,p,ph,z,zh,T,qv,rh,tca,cca, & - mr_lsliq,mr_lsice,mr_ccliq,mr_ccice,fl_lsrain,fl_lssnow, & - fl_lsgrpl,fl_ccrain,fl_ccsnow,Reff,dtau_s,dtau_c,dem_s, & - dem_c,skt,psfc,landmask,mr_ozone,u_wind,v_wind,sunlit, & - gwvel, gcumf, & ! added by DPLRW - mr_lsrain, mr_lssnow, & ! adjust to prognostic precipitation - emsfc_lw,mode,Nlon,Nlat,surfelev, & - year,month,day,hour,minute,seconds) - - ! Arguments - character(len=512),intent(in) :: fname ! File name - integer,intent(in) :: Npnts,Nl,Nhydro - real(wp),dimension(Npnts),intent(out) :: lon,lat - real(wp),dimension(Npnts,Nl),target,intent(out) :: p,ph,z,zh,T,qv,rh,tca,cca, & - mr_lsliq,mr_lsice,mr_ccliq,mr_ccice,fl_lsrain,fl_lssnow,fl_lsgrpl, & - fl_ccrain,fl_ccsnow,dtau_s,dtau_c,dem_s,dem_c,mr_ozone - real(wp),dimension(Npnts,Nl,Nhydro),intent(out) :: Reff - real(wp),dimension(Npnts),intent(out) :: skt,psfc,landmask,u_wind,v_wind,sunlit,surfelev, & - year,month,day,hour,minute,seconds - real(wp),dimension(Npnts,Nl),intent(out) :: gwvel,gcumf ! added by DPLRW - real(wp),dimension(Npnts,Nl),intent(out) :: mr_lsrain,mr_lssnow ! adjust to prognostic precipitation - real(wp),intent(out) :: emsfc_lw - integer,intent(out) :: mode,Nlon,Nlat - - ! Local variables - integer,parameter :: NMAX_DIM=5 - integer :: Npoints,Nlevels,i,j,k,vrank,vdimid(NMAX_DIM),ncid,vid,ndims,nvars,ngatts, & - recdim,dimsize(NMAX_DIM),errst,Na,Nb,Nc,Nd,Ne - integer,dimension(:),allocatable :: plon,plat - logical :: Llat,Llon,Lpoint - real(wp),dimension(Npnts) :: ll - real(wp),allocatable :: x1(:),x2(:,:),x3(:,:,:),x4(:,:,:,:),x5(:,:,:,:,:) ! Temporary arrays - character(len=128) :: vname - character(len=256) :: dimname(NMAX_DIM) ! 256 hardcoded, instead of MAXNCNAM. This works for NetCDF 3 and 4. - character(len=64) :: routine_name='NC_READ_INPUT_FILE' - character(len=128) :: errmsg,straux - - mode = 0 - Nlon = 0 - Nlat = 0 - - Npoints = Npnts - Nlevels = Nl - - ! Open file - errst = nf90_open(fname, nf90_nowrite, ncid) - if (errst /= 0) then - errmsg="Couldn't open "//trim(fname) - call cosp_error(routine_name,errmsg) - endif - - ! Get information about dimensions. Curtain mode or lat/lon mode? - Llat =.false. - Llon =.false. - Lpoint=.false. - errst = nf90_inquire(ncid, ndims, nvars, ngatts, recdim) - if (errst /= 0) then - errmsg="Error in nf90_inquire" - call cosp_error(routine_name,errmsg,errcode=errst) - endif - do i = 1,ndims - errst = nf90_Inquire_Dimension(ncid,i,name=dimname(i),len=dimsize(i)) - if (errst /= 0) then - write(straux, *) i - errmsg="Error in nf90_Inquire_Dimension, i: "//trim(straux) - call cosp_error(routine_name,errmsg) - endif - if ((trim(dimname(i)).eq.'level').and.(Nlevels > dimsize(i))) then - errmsg='Number of levels selected is greater than in input file '//trim(fname) - call cosp_error(routine_name,errmsg) - endif - if (trim(dimname(i)).eq.'point') then - Lpoint = .true. - if (Npnts > dimsize(i)) then - errmsg='Number of points selected is greater than in input file '//trim(fname) - call cosp_error(routine_name,errmsg) - endif - endif - if (trim(dimname(i)).eq.'lon') then - Llon = .true. - Nlon = dimsize(i) - endif - if (trim(dimname(i)).eq.'lat') then - Llat = .true. - Nlat = dimsize(i) - endif - enddo - - ! Get lon and lat - if (Llon.and.Llat) then ! 2D mode - if ((Npnts) > Nlon*Nlat) Npoints=Nlon*Nlat - lon = -1.0E30 - lat = -1.0E30 - mode = 2 ! Don't know yet if (lon,lat) or (lat,lon) at this point - else if (Lpoint) then ! 1D mode - Nlon = Npoints - Nlat = Npoints - mode = 1 - else - errmsg= trim(fname)//' file contains wrong dimensions' - call cosp_error(routine_name,errmsg) - endif - errst = nf90_inq_varid(ncid, 'lon', vid) - if (errst /= 0) then - errmsg="Error in nf90_inq_varid, var: lon" - call cosp_error(routine_name,errmsg,errcode=errst) - endif - errst = nf90_get_var(ncid, vid, lon, start = (/1/), count = (/Nlon/)) - if (errst /= 0) then - errmsg="Error in nf90_get_var, var: lon" - call cosp_error(routine_name,errmsg,errcode=errst) - endif - errst = nf90_inq_varid(ncid, 'lat', vid) - if (errst /= 0) then - errmsg="Error in nf90_inq_varid, var: lat" - call cosp_error(routine_name,errmsg,errcode=errst) - endif - errst = nf90_get_var(ncid, vid, lat, start = (/1/), count = (/Nlat/)) - if (errst /= 0) then - errmsg="Error in nf90_get_var, var: lat" - call cosp_error(routine_name,errmsg,errcode=errst) - endif - - ! Get all variables - do vid = 1,nvars - vdimid=0 - errst = nf90_Inquire_Variable(ncid, vid, name=vname, ndims=vrank, dimids=vdimid) - if (errst /= 0) then - write(straux, *) vid - errmsg='Error in nf90_Inquire_Variable, vid '//trim(straux) - call cosp_error(routine_name,errmsg,errcode=errst) - endif - ! Read in into temporary array of correct shape - if (vrank == 1) then - Na = dimsize(vdimid(1)) - allocate(x1(Na)) - errst = nf90_get_var(ncid, vid, x1, start=(/1/), count=(/Na/)) - endif - if (vrank == 2) then - Na = dimsize(vdimid(1)) - Nb = dimsize(vdimid(2)) - allocate(x2(Na,Nb)) - errst = nf90_get_var(ncid, vid, x2, start=(/1,1/), count=(/Na,Nb/)) - endif - if (vrank == 3) then - Na = dimsize(vdimid(1)) - Nb = dimsize(vdimid(2)) - Nc = dimsize(vdimid(3)) - allocate(x3(Na,Nb,Nc)) - errst = nf90_get_var(ncid, vid, x3, start=(/1,1,1/), count=(/Na,Nb,Nc/)) - if ((mode == 2).or.(mode == 3)) then - if ((Na == Nlon).and.(Nb == Nlat)) then - mode = 2 - else if ((Na == Nlat).and.(Nb == Nlon)) then - mode = 3 - else - errmsg='Wrong mode for variable '//trim(vname) - call cosp_error(routine_name,errmsg) - endif - endif - endif - if (vrank == 4) then - Na = dimsize(vdimid(1)) - Nb = dimsize(vdimid(2)) - Nc = dimsize(vdimid(3)) - Nd = dimsize(vdimid(4)) - allocate(x4(Na,Nb,Nc,Nd)) - errst = nf90_get_var(ncid, vid, x4, start=(/1,1,1,1/), count=(/Na,Nb,Nc,Nd/)) - endif - if (vrank == 5) then - Na = dimsize(vdimid(1)) - Nb = dimsize(vdimid(2)) - Nc = dimsize(vdimid(3)) - Nd = dimsize(vdimid(4)) - Ne = dimsize(vdimid(5)) - allocate(x5(Na,Nb,Nc,Nd,Ne)) - errst = nf90_get_var(ncid, vid, x5, start=(/1,1,1,1,1/), count=(/Na,Nb,Nc,Nd,Ne/)) - endif - if (errst /= 0) then - write(straux, *) vid - errmsg='Error in nf90_get_var, vid '//trim(straux) - call cosp_error(routine_name,errmsg,errcode=errst) - endif - ! Map to the right input argument - select case (trim(vname)) - case ('pfull') - if (Lpoint) then - p(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=p) - endif - case ('phalf') - if (Lpoint) then - ph(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=ph) - endif - case ('height') - if (Lpoint) then - z(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=z) - endif - case ('height_half') - if (Lpoint) then - zh(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=zh) - endif - case ('T_abs') - if (Lpoint) then - T(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=T) - endif - case ('qv') - if (Lpoint) then - qv(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=qv) - endif - case ('rh') - if (Lpoint) then - rh(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=rh) - endif - case ('tca') - if (Lpoint) then - tca(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=tca) - endif - tca = tca - case ('cca') - if (Lpoint) then - cca(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=cca) - endif - cca = cca - case ('mr_lsliq') - if (Lpoint) then - mr_lsliq(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_lsliq) - endif - case ('mr_lsice') - if (Lpoint) then - mr_lsice(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_lsice) - endif - case ('mr_ccliq') - if (Lpoint) then - mr_ccliq(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_ccliq) - endif - case ('mr_ccice') - if (Lpoint) then - mr_ccice(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_ccice) - endif - case ('fl_lsrain') - if (Lpoint) then - fl_lsrain(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=fl_lsrain) - endif - case ('fl_lssnow') - if (Lpoint) then - fl_lssnow(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=fl_lssnow) - endif - case ('mr_lsrain') - if (Lpoint) then - mr_lsrain(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_lsrain) - endif - case ('mr_lssnow') - if (Lpoint) then - mr_lssnow(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_lssnow) - endif - case ('fl_lsgrpl') - if (Lpoint) then - fl_lsgrpl(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=fl_lsgrpl) - endif - case ('fl_ccrain') - if (Lpoint) then - fl_ccrain(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=fl_ccrain) - endif - case ('fl_ccsnow') - if (Lpoint) then - fl_ccsnow(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=fl_ccsnow) - endif - case ('dtau_s') - if (Lpoint) then - dtau_s(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=dtau_s) - endif - case ('dtau_c') - if (Lpoint) then - dtau_c(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=dtau_c) - endif - case ('dem_s') - if (Lpoint) then - dem_s(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=dem_s) - endif - case ('dem_c') - if (Lpoint) then - dem_c(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=dem_c) - endif - case ('Reff') - if (Lpoint) then - Reff(1:Npoints,:,:) = x3(1:Npoints,1:Nlevels,:) - else - call map_ll_to_point(Na,Nb,Npoints,x4=x4,y3=Reff) - endif - case ('skt') - if (Lpoint) then - skt(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=skt) - endif - case ('psfc') - if (Lpoint) then - psfc(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=psfc) - endif - case ('orography') - if (Lpoint) then - surfelev(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=surfelev) - endif - case ('landmask') - if (Lpoint) then - landmask(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=landmask) - endif - case ('mr_ozone') - if (Lpoint) then - mr_ozone(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_ozone) - endif - case ('u_wind') - if (Lpoint) then - u_wind(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=u_wind) - endif - case ('v_wind') - if (Lpoint) then - v_wind(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=v_wind) - endif - case ('sunlit') - if (Lpoint) then - sunlit(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=sunlit) - endif - - case ('gwvel') ! added by DPLRW - if (Lpoint) then - gwvel(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=gwvel) - endif - case ('gcumf') - if (Lpoint) then - gcumf(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=gcumf) - endif - - case ('year') - if (Lpoint) then - year(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=year) - endif - case ('month') - if (Lpoint) then - month(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=month) - endif - case ('day') - if (Lpoint) then - day(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=day) - endif - case ('hour') - if (Lpoint) then - hour(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=hour) - endif - case ('minute') - if (Lpoint) then - minute(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=minute) - endif - case ('second') - if (Lpoint) then - seconds(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=seconds) - endif - - end select - ! Free memory - if (vrank == 1) deallocate(x1) - if (vrank == 2) deallocate(x2) - if (vrank == 3) deallocate(x3) - if (vrank == 4) deallocate(x4) - if (vrank == 5) deallocate(x5) - enddo - - ! SFC emissivity - errst = nf90_inq_varid(ncid, 'emsfc_lw', vid) - if (errst /= 0) then - if (errst == nf90_enotvar) then ! Does not exist, use 1.0 - emsfc_lw = 1.0 - print *, ' ********* COSP Warning: emsfc_lw does not exist in input file. Set to 1.0.' - else ! Other error, stop - errmsg='Error in nf90_inq_varid, var: emsfc_lw' - call cosp_error(routine_name,errmsg,errcode=errst) - endif - else - errst = nf90_get_var(ncid, vid, emsfc_lw) - if (errst /= 0) then - errmsg='Error in nf90_get_var, var: emsfc_lw' - call cosp_error(routine_name,errmsg,errcode=errst) - endif - endif - - - ! Fill in the lat/lon vectors with the right values for 2D modes - ! This might be helpful if the inputs are 2D (gridded) and - ! you want outputs in 1D mode - allocate(plon(Npoints),plat(Npoints)) - if (mode == 2) then !(lon,lat) - ll = lat - do j=1,Nb - do i=1,Na - k = (j-1)*Na + i - plon(k) = i - plat(k) = j - enddo - enddo - lon(1:Npoints) = lon(plon(1:Npoints)) - lat(1:Npoints) = ll(plat(1:Npoints)) - else if (mode == 3) then !(lat,lon) - ll = lon - do j=1,Nb - do i=1,Na - k = (j-1)*Na + i - lon(k) = ll(j) - lat(k) = lat(i) - enddo - enddo - lon(1:Npoints) = ll(plon(1:Npoints)) - lat(1:Npoints) = lat(plat(1:Npoints)) - endif - deallocate(plon,plat) - - ! Close file - errst = nf90_close(ncid) - if (errst /= 0) then - errmsg='Error in nf90_close' - call cosp_error(routine_name,errmsg,errcode=errst) - endif - END SUBROUTINE NC_READ_INPUT_FILE - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE map_ll_to_point - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - SUBROUTINE MAP_LL_TO_POINT(Nx,Ny,Np,x2,x3,x4,x5,y1,y2,y3,y4) - ! Input arguments - integer,intent(in) :: Nx,Ny,Np - real(wp),intent(in),optional :: x2(:,:),x3(:,:,:), & - x4(:,:,:,:),x5(:,:,:,:,:) - real(wp),intent(out),optional :: y1(:),y2(:,:),y3(:,:,:), & - y4(:,:,:,:) - ! Local variables - integer :: px(Nx*Ny),py(Nx*Ny) - integer :: i,j,k,l,m - integer :: Ni,Nj,Nk,Nl,Nm - integer :: Mi,Mj,Mk,Ml - character(len=128) :: proname='MAP_LL_TO_POINT' - - px=0 - py=0 - if (Nx*Ny < Np) then - print *, ' -- '//trim(proname)//': Nx*Ny < Np' - stop - endif - do j=1,Ny - do i=1,Nx - k = (j-1)*Nx+i - px(k) = i - py(k) = j - enddo - enddo - - if (present(x2).and.present(y1)) then - Ni = size(x2,1) - Nj = size(x2,2) - Mi = size(y1,1) - if (Ni*Nj < Mi) then - print *, ' -- '//trim(proname)//': Nlon*Nlat < Npoints (opt 1)' - stop - endif - do j=1,Np - y1(j) = x2(px(j),py(j)) - enddo - else if (present(x3).and.present(y2)) then - Ni = size(x3,1) - Nj = size(x3,2) - Nk = size(x3,3) - Mi = size(y2,1) - Mj = size(y2,2) - if (Ni*Nj < Mi) then - print *, ' -- '//trim(proname)//': Nlon*Nlat < Npoints (opt 2)' - stop - endif - if (Nk /= Mj) then - print *, ' -- '//trim(proname)//': Nk /= Mj (opt 2)' - stop - endif - do k=1,Nk - do j=1,Np - y2(j,k) = x3(px(j),py(j),k) - enddo - enddo - else if (present(x4).and.present(y3)) then - Ni = size(x4,1) - Nj = size(x4,2) - Nk = size(x4,3) - Nl = size(x4,4) - Mi = size(y3,1) - Mj = size(y3,2) - Mk = size(y3,3) - if (Ni*Nj < Mi) then - print *, ' -- '//trim(proname)//': Nlon*Nlat < Npoints (opt 3)' - stop - endif - if (Nk /= Mj) then - print *, ' -- '//trim(proname)//': Nk /= Mj (opt 3)' - stop - endif - if (Nl /= Mk) then - print *, ' -- '//trim(proname)//': Nl /= Mk (opt 3)' - stop - endif - do l=1,Nl - do k=1,Nk - do j=1,Np - y3(j,k,l) = x4(px(j),py(j),k,l) - enddo - enddo - enddo - else if (present(x5).and.present(y4)) then - Ni = size(x5,1) - Nj = size(x5,2) - Nk = size(x5,3) - Nl = size(x5,4) - Nm = size(x5,5) - Mi = size(y4,1) - Mj = size(y4,2) - Mk = size(y4,3) - Ml = size(y4,4) - if (Ni*Nj < Mi) then - print *, ' -- '//trim(proname)//': Nlon*Nlat < Npoints (opt 4)' - stop - endif - if (Nk /= Mj) then - print *, ' -- '//trim(proname)//': Nk /= Mj (opt 4)' - stop - endif - if (Nl /= Mk) then - print *, ' -- '//trim(proname)//': Nl /= Mk (opt 4)' - stop - endif - if (Nm /= Ml) then - print *, ' -- '//trim(proname)//': Nm /= Ml (opt 4)' - stop - endif - do m=1,Nm - do l=1,Nl - do k=1,Nk - do j=1,Np - y4(j,k,l,m) = x5(px(j),py(j),k,l,m) - enddo - enddo - enddo - enddo - else - print *, ' -- '//trim(proname)//': wrong option' - stop - endif - END SUBROUTINE MAP_LL_TO_POINT - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Subrotuine cosp_error - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - SUBROUTINE COSP_ERROR(routine_name,message,errcode) - character(len = *), intent(in) :: routine_name - character(len = *), intent(in) :: message - integer,optional :: errcode - - write(6, *) " ********** Failure in ", trim(routine_name) - write(6, *) " ********** ", trim(message) - if (present(errcode)) write(6, *) " ********** errcode: ", errcode - flush(6) - stop - END SUBROUTINE COSP_ERROR - end module mod_cosp_io diff --git a/dplrw_src/cosp2_test.F90 b/dplrw_src/cosp2_test.F90 deleted file mode 100755 index 7b6d14df27..0000000000 --- a/dplrw_src/cosp2_test.F90 +++ /dev/null @@ -1,2231 +0,0 @@ -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -! Copyright (c) 2016, Regents of the University of Colorado -! All rights reserved. -! -! Redistribution and use in source and binary forms, with or without modification, are -! permitted provided that the following conditions are met: -! -! 1. Redistributions of source code must retain the above copyright notice, this list of -! conditions and the following disclaimer. -! -! 2. Redistributions in binary form must reproduce the above copyright notice, this list -! of conditions and the following disclaimer in the documentation and/or other -! materials provided with the distribution. -! -! 3. Neither the name of the copyright holder nor the names of its contributors may be -! used to endorse or promote products derived from this software without specific prior -! written permission. -! -! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL -! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT -! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -! -! History -! March 2016 - D. Swales - Original version -! April 2018 - R. Guzman - Added OPAQ diagnostics and Ground LIDar (GLID) simulator -! April 2018 - R. Guzman - Added ATLID simulator -! Nov 2018 - T. Michibata - Added CloudSat+MODIS Warmrain Diagnostics -! June 2025 - J.K. Shaw - Added COSP-RTTOV integration and swathing -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -program cosp2_test - use cosp_kinds, only: wp - USE MOD_COSP_CONFIG, ONLY: R_UNDEF,PARASOL_NREFL,LIDAR_NCAT,LIDAR_NTYPE,SR_BINS, & - N_HYDRO,numMISRHgtBins, & - cloudsat_DBZE_BINS,LIDAR_NTEMP,calipso_histBsct, & - CFODD_NDBZE, CFODD_NICOD, & - CFODD_BNDRE, CFODD_NCLASS, & - CFODD_DBZE_MIN, CFODD_DBZE_MAX, & - CFODD_ICOD_MIN, CFODD_ICOD_MAX, & - CFODD_DBZE_WIDTH, CFODD_ICOD_WIDTH, & - WR_NREGIME, & - numMODISTauBins,numMODISPresBins, & - numMODISReffIceBins,numMODISReffLiqBins, & - numISCCPTauBins,numISCCPPresBins,numMISRTauBins, & - ntau,modis_histTau,tau_binBounds, & - modis_histTauEdges,tau_binEdges, & - modis_histTauCenters,tau_binCenters,ntauV1p4, & - tau_binBoundsV1p4,tau_binEdgesV1p4, tau_binCentersV1p4, & - grLidar532_histBsct,atlid_histBsct,vgrid_zu,vgrid_zl, & - Nlvgrid_local => Nlvgrid, & - vgrid_z,cloudsat_preclvl - use cosp_phys_constants, only: amw,amd,amO3,amCO2,amCH4,amN2O,amCO - use mod_cosp_io, only: nc_read_input_file,write_cosp2_output - USE mod_quickbeam_optics,only: size_distribution,hydro_class_init,quickbeam_optics, & - quickbeam_optics_init,gases - use mod_cosp, only: cosp_init, & - cosp_outputs,swath_inputs,cosp_simulator - USE mod_rng, ONLY: rng_state, init_rng - USE mod_scops, ONLY: scops - USE mod_prec_scops, ONLY: prec_scops - USE MOD_COSP_UTILS, ONLY: cosp_precip_mxratio - use MOD_COSP_RTTOV_UTIL, only: rttov_cfg, rttov_output - use cosp_optics, ONLY: cosp_simulator_optics,lidar_optics,modis_optics, & - modis_optics_partition - use mod_cosp_stats, ONLY: COSP_CHANGE_VERTICAL_GRID,cosp_optical_inputs, & - cosp_column_inputs,radar_cfg,cosp_cleanUp - use mod_cosp_config, ONLY: Nlvdplr, Nlvspwd, NlvdBZe, Nlvtemp ! added by DPLRW - - implicit none - - ! Input/Output driver file control - character(len=256) :: cosp_input_namelist - character(len=64) :: cosp_output_namelist = 'cosp2_output_nl.txt' - - ! Test data - integer :: & - Nlon,Nlat,geomode - real(wp) :: & - emsfc_lw - real(wp),dimension(:),allocatable,target :: & - lon, & ! Longitude (deg) - lat, & ! Latitude (deg) - skt, & ! Skin temperature (K) - psfc, & ! Surface Pressure (Pa) - surfelev, & ! Surface Elevation (m) - landmask, & ! Land/sea mask (0/1) - u_wind, & ! U-component of wind (m/s) - v_wind, & ! V-component of wind (m/s) - sunlit ! Sunlit flag - real(wp),dimension(:),allocatable :: & - year, & ! Year (CE) - month, & ! Month [1,12] - day, & ! Day [1,31] - hour, & ! Hour [0,24] - minute, & ! Minute [0,60] - seconds ! Second [0,60] - real(wp),dimension(:,:),allocatable,target :: & - p, & ! Model pressure levels (pa) - ph, & ! Model pressure @ half levels (pa) - zlev, & ! Model level height (m) - zlev_half, & ! Model level height @ half-levels (m) - T, & ! Temperature (K) - sh, & ! Specific humidity (kg/kg) - rh, & ! Relative humidity (1) - tca, & ! Total cloud fraction (1) - cca, & ! Convective cloud fraction (1) - mr_lsliq, & ! Mass mixing ratio for stratiform cloud liquid (kg/kg) - mr_lsice, & ! Mass mixing ratio for stratiform cloud ice (kg/kg) - mr_ccliq, & ! Mass mixing ratio for convective cloud liquid (kg/kg) - mr_ccice, & ! Mass mixing ratio for convective cloud ice (kg/kg) - mr_ozone, & ! Mass mixing ratio for ozone (kg/kg) - fl_lsrain, & ! Precipitation flux (rain) for stratiform cloud (kg/m^2/s) - fl_lssnow, & ! Precipitation flux (snow) for stratiform cloud (kg/m^2/s) - fl_lsgrpl, & ! Precipitation flux (groupel) for stratiform cloud (kg/m^2/s) - fl_ccrain, & ! Precipitation flux (rain) for convective cloud (kg/m^2/s) - fl_ccsnow, & ! Precipitation flux (snow) for convective cloud (kg/m^2/s) - dtau_s, & ! 0.67micron optical depth (stratiform cloud) (1) - dtau_c, & ! 0.67micron optical depth (convective cloud) (1) - dem_s, & ! 11micron emissivity (stratiform cloud) - dem_c ! 11microm emissivity (convective cloud) - real(wp),dimension(:,:,:),allocatable,target :: & - frac_out, & ! Subcolumn cloud cover (0/1) - Reff ! Subcolumn effective radius - - ! additional inputs for DPLRW - real(wp),dimension(:,:),allocatable,target :: & - gwvel, & ! Model grid vertical velocity (m/s) - gcumf ! Model cumulus mass flux (kg/m^2/s) - - ! adjust to prognostic precipitation - real(wp),dimension(:,:),allocatable,target :: & - mr_lsrain, & ! Mass mixing ratio for stratiform cloud rain (kg/kg) - mr_lssnow ! Mass mixing ratio for stratiform cloud snow (kg/kg) - - ! Input namelist fields - integer :: & ! - Npoints, & ! Number of gridpoints - Ncolumns, & ! Number of subcolumns - Nlevels, & ! Number of model vertical levels - Npoints_it, & ! Number of gridpoints to be processed in one - ! iteration - Nlvgrid, & ! Number of vertical levels for statistical outputs - ! (USE_VGRID=.true.) - surface_radar, & ! surface=1/spaceborne=0 - cloudsat_use_gas_abs, & ! Include gaseous absorption (1=yes/0=no) - cloudsat_do_ray, & ! Calculate output Rayleigh (1=yes/0=no) - lidar_ice_type, & ! Ice particle shape in lidar calculations - ! (0=ice-spheres/1=ice-non-spherical) - overlap, & ! Overlap type: 1=max, 2=rand, 3=max/rand - isccp_topheight, & ! ISCCP cloud top height - isccp_topheight_direction ! ISCCP cloud top height direction - real(wp) :: & ! - cloudsat_radar_freq, & ! CloudSat radar frequency (GHz) - cloudsat_k2 ! |K|^2, -1=use frequency dependent default - logical :: & ! - use_vgrid, & ! Use fixed vertical grid for outputs? - csat_vgrid, & ! CloudSat vertical grid? - use_precipitation_fluxes ! True if precipitation fluxes are input to the flux - - character(len=64) :: & - cloudsat_micro_scheme ! Microphysical scheme used in cloudsat radar simulator - character(len=64) :: & - finput ! Input NetCDF file - character(len=256) :: & - foutput - character(len=512) :: & - dinput ! Directory where the input files are located - character(len=600) :: & - fileIN ! dinput+finput - - ! RTTOV - integer :: rttov_Ninstruments = 0 - character(len=256), dimension(50) :: & ! Arbitrary limit of 50 should be fine. - rttov_instrument_namelists ! Input of paths to RTTOV instrument namelists - character(len=256), allocatable :: & - rttov_instrument_namelists_final(:) ! Array of paths to RTTOV instrument namelists - logical :: rttov_verbose = .false. - - ! Inputs for orbit swathing - integer :: N_SWATHS_ISCCP = 0 ! Number of ISCCP swaths - integer :: N_SWATHS_MISR = 0 ! Number of MISR swaths - integer :: N_SWATHS_MODIS = 0 ! Number of MODIS swaths - integer :: N_SWATHS_PARASOL = 0 ! Number of PARASOL swaths - integer :: N_SWATHS_CSCAL = 0 ! Number of CLOUDSAT+CALIPSO swaths - integer :: N_SWATHS_ATLID = 0 ! Number of ATLID swaths - real(wp),dimension(10),target :: & ! Arbitrary limit of 10 swaths seems reasonable. - SWATH_LOCALTIMES_ISCCP, & ! Local time of ISCCP satellite overpasses (hrs GMT) - SWATH_LOCALTIMES_MISR, & ! Local time of MISR satellite overpasses (hrs GMT) - SWATH_LOCALTIMES_MODIS, & ! Local time of MODIS satellite overpasses (hrs GMT) - SWATH_LOCALTIMES_PARASOL, & ! Local time of PARASOL satellite overpasses (hrs GMT) - SWATH_LOCALTIMES_CSCAL, & ! Local time of CLOUDSAT+CALIPSO satellite overpasses (hrs GMT) - SWATH_LOCALTIMES_ATLID, & ! Local time of ATLID satellite overpasses (hrs GMT) - SWATH_WIDTHS_ISCCP, & ! Width in km of ISCCP satellite overpasses - SWATH_WIDTHS_MISR, & ! Width in km of MISR satellite overpasses - SWATH_WIDTHS_MODIS, & ! Width in km of MODIS satellite overpasses - SWATH_WIDTHS_PARASOL, & ! Width in km of PARASOL satellite overpasses - SWATH_WIDTHS_CSCAL, & ! Width in km of CLOUDSAT+CALIPSO satellite overpasses - SWATH_WIDTHS_ATLID ! Width in km of ATLID satellite overpasses - - namelist/COSP_INPUT/overlap, isccp_topheight, isccp_topheight_direction, npoints, & - npoints_it, ncolumns, nlevels, use_vgrid, Nlvgrid, csat_vgrid, dinput, finput, & - foutput, cloudsat_radar_freq, surface_radar, cloudsat_use_gas_abs,cloudsat_do_ray,& - cloudsat_k2, cloudsat_micro_scheme, lidar_ice_type, use_precipitation_fluxes, & - rttov_Ninstruments, rttov_instrument_namelists, rttov_verbose, & - N_SWATHS_ISCCP, SWATH_LOCALTIMES_ISCCP, SWATH_WIDTHS_ISCCP, N_SWATHS_MISR, & - SWATH_LOCALTIMES_MISR, SWATH_WIDTHS_MISR, N_SWATHS_MODIS, SWATH_LOCALTIMES_MODIS, & - SWATH_WIDTHS_MODIS, N_SWATHS_PARASOL, SWATH_LOCALTIMES_PARASOL, & - SWATH_WIDTHS_PARASOL, N_SWATHS_CSCAL, SWATH_LOCALTIMES_CSCAL, & - SWATH_WIDTHS_CSCAL, N_SWATHS_ATLID, SWATH_LOCALTIMES_ATLID, SWATH_WIDTHS_ATLID - - ! Output namelist - logical :: Lcfaddbze94,Ldbze94,Latb532,LcfadLidarsr532,Lclcalipso,Lclhcalipso, & - Lcllcalipso,Lclmcalipso,Lcltcalipso,LparasolRefl,Lclcalipsoliq, & - Lclcalipsoice,Lclcalipsoun,Lclcalipsotmp,Lclcalipsotmpliq,Lclcalipsotmpice, & - Lclcalipsotmpun,Lclhcalipsoliq,Lcllcalipsoliq,Lclmcalipsoliq,Lcltcalipsoliq,& - Lclhcalipsoice,Lcllcalipsoice,Lclmcalipsoice,Lcltcalipsoice,Lclhcalipsoun, & - Lcllcalipsoun,Lclmcalipsoun,Lcltcalipsoun,Lclopaquecalipso,Lclthincalipso, & - Lclzopaquecalipso,Lclcalipsoopaque,Lclcalipsothin,Lclcalipsozopaque, & - Lclcalipsoopacity,Lclopaquetemp,Lclthintemp,Lclzopaquetemp,Lclopaquemeanz, & - Lclthinmeanz,Lclthinemis,Lclopaquemeanzse,Lclthinmeanzse,Lclzopaquecalipsose,& - LlidarBetaMol532gr,LcfadLidarsr532gr,Latb532gr,LclgrLidar532,LclhgrLidar532,& - LcllgrLidar532,LclmgrLidar532,LcltgrLidar532,LlidarBetaMol355, & - LcfadLidarsr355,Latb355,Lclatlid,Lclhatlid,Lcllatlid,Lclmatlid,Lcltatlid, & - Lalbisccp,Lboxptopisccp,Lboxtauisccp,Lpctisccp,Lclisccp,Ltauisccp,Lcltisccp,& - Lmeantbisccp,Lmeantbclrisccp,LclMISR,Lclcalipso2,Lcltlidarradar, & - Lcloudsat_tcc, Lcloudsat_tcc2,Lfracout, & - LlidarBetaMol532,Lcltmodis,Lclwmodis,Lclimodis,Lclhmodis,Lclmmodis, & - Lcllmodis,Ltautmodis,Ltauwmodis,Ltauimodis,Ltautlogmodis,Ltauwlogmodis, & - Ltauilogmodis,Lreffclwmodis,Lreffclimodis,Lpctmodis,Llwpmodis,Liwpmodis, & - Lclmodis,Lptradarflag0,Lptradarflag1,Lptradarflag2,Lptradarflag3, & - Lptradarflag4,Lptradarflag5,Lptradarflag6,Lptradarflag7,Lptradarflag8, & - Lptradarflag9,Lradarpia, & - Lwr_occfreq, Lcfodd, & - Ldplrw ! for DPLRW - - namelist/COSP_OUTPUT/Lcfaddbze94,Ldbze94,Latb532,LcfadLidarsr532,Lclcalipso, & - Lclhcalipso,Lcllcalipso,Lclmcalipso,Lcltcalipso,LparasolRefl, & - Lclcalipsoliq,Lclcalipsoice,Lclcalipsoun,Lclcalipsotmp, & - Lclcalipsotmpliq,Lclcalipsotmpice,Lclcalipsotmpun,Lclhcalipsoliq, & - Lcllcalipsoliq,Lclmcalipsoliq,Lcltcalipsoliq,Lclhcalipsoice, & - Lcllcalipsoice,Lclmcalipsoice,Lcltcalipsoice,Lclhcalipsoun, & - Lcllcalipsoun,Lclmcalipsoun,Lcltcalipsoun,Lclopaquecalipso, & - Lclthincalipso,Lclzopaquecalipso,Lclcalipsoopaque,Lclcalipsothin, & - Lclcalipsozopaque,Lclcalipsoopacity,Lclopaquetemp,Lclthintemp, & - Lclzopaquetemp,Lclopaquemeanz,Lclthinmeanz,Lclthinemis, & - Lclopaquemeanzse,Lclthinmeanzse,Lclzopaquecalipsose, & - LlidarBetaMol532gr,LcfadLidarsr532gr,Latb532gr,LclgrLidar532, & - LclhgrLidar532,LcllgrLidar532,LclmgrLidar532,LcltgrLidar532, & - LlidarBetaMol355,LcfadLidarsr355,Latb355,Lclatlid, & - Lclhatlid,Lcllatlid,Lclmatlid,Lcltatlid,Lalbisccp,Lboxptopisccp, & - Lboxtauisccp,Lpctisccp,Lclisccp,Ltauisccp,Lcltisccp,Lmeantbisccp, & - Lmeantbclrisccp,LclMISR,Lclcalipso2,Lcltlidarradar, & - Lcloudsat_tcc, Lcloudsat_tcc2, Lfracout, & - LlidarBetaMol532,Lcltmodis,Lclwmodis,Lclimodis,Lclhmodis, & - Lclmmodis,Lcllmodis,Ltautmodis,Ltauwmodis,Ltauimodis, & - Ltautlogmodis,Ltauwlogmodis,Ltauilogmodis,Lreffclwmodis, & - Lreffclimodis,Lpctmodis,Llwpmodis,Liwpmodis,Lclmodis, & - Lptradarflag0,Lptradarflag1,Lptradarflag2,Lptradarflag3, & - Lptradarflag4,Lptradarflag5,Lptradarflag6,Lptradarflag7, & - Lptradarflag8,Lptradarflag9,Lradarpia, & - Lwr_occfreq, Lcfodd, & - Ldplrw - - ! Local variables - logical :: & - lsingle = .true., & ! True if using MMF_v3_single_moment CLOUDSAT microphysical scheme (default) - ldouble = .false., & ! True if using MMF_v3.5_two_moment CLOUDSAT microphysical scheme - lisccp = .false. ,& ! Local on/off switch for simulators (used by initialization) - lmodis = .false., & ! - lmisr = .false., & ! - lcalipso = .false., & ! - lgrLidar532 = .false., & ! - latlid = .false., & ! - lcloudsat = .false., & ! - lrttov = .false., & ! - lparasol = .false. ! - type(size_distribution) :: & - sd ! Hydrometeor description - type(radar_cfg) :: & - rcfg_cloudsat ! Radar configuration - type(rttov_cfg), dimension(:), allocatable, target :: & - rttov_configs - type(cosp_outputs) :: & - cospOUT ! COSP simulator outputs - type(cosp_optical_inputs) :: & - cospIN ! COSP optical (or derived?) fields needed by simulators - type(cosp_column_inputs) :: & - cospstateIN ! COSP model fields needed by simulators - integer :: iChunk,nChunks,start_idx,end_idx,nPtsPerIt,ij - real(wp),dimension(10) :: driver_time - character(len=256),dimension(100) :: cosp_status - - ! Indices to address arrays of LS and CONV hydrometeors - integer,parameter :: & - I_LSCLIQ = 1, & ! Large-scale (stratiform) liquid - I_LSCICE = 2, & ! Large-scale (stratiform) ice - I_LSRAIN = 3, & ! Large-scale (stratiform) rain - I_LSSNOW = 4, & ! Large-scale (stratiform) snow - I_CVCLIQ = 5, & ! Convective liquid - I_CVCICE = 6, & ! Convective ice - I_CVRAIN = 7, & ! Convective rain - I_CVSNOW = 8, & ! Convective snow - I_LSGRPL = 9 ! Large-scale (stratiform) groupel - - ! Stratiform and convective clouds in frac_out (scops output). - integer, parameter :: & - I_LSC = 1, & ! Large-scale clouds - I_CVC = 2 ! Convective clouds - - ! Microphysical settings for the precipitation flux to mixing ratio conversion - real(wp),parameter,dimension(N_HYDRO) :: & - ! LSL LSI LSR LSS CVL CVI CVR CVS LSG - N_ax = (/-1., -1., 8.e6, 3.e6, -1., -1., 8.e6, 3.e6, 4.e6/),& - N_bx = (/-1., -1., 0.0, 0.0, -1., -1., 0.0, 0.0, 0.0/),& - alpha_x = (/-1., -1., 0.0, 0.0, -1., -1., 0.0, 0.0, 0.0/),& - c_x = (/-1., -1., 842.0, 4.84, -1., -1., 842.0, 4.84, 94.5/),& - d_x = (/-1., -1., 0.8, 0.25, -1., -1., 0.8, 0.25, 0.5/),& - g_x = (/-1., -1., 0.5, 0.5, -1., -1., 0.5, 0.5, 0.5/),& - a_x = (/-1., -1., 524.0, 52.36, -1., -1., 524.0, 52.36, 209.44/),& - b_x = (/-1., -1., 3.0, 3.0, -1., -1., 3.0, 3.0, 3.0/),& - gamma_1 = (/-1., -1., 17.83725, 8.284701, -1., -1., 17.83725, 8.284701, 11.63230/),& - gamma_2 = (/-1., -1., 6.0, 6.0, -1., -1., 6.0, 6.0, 6.0/),& - gamma_3 = (/-1., -1., 2.0, 2.0, -1., -1., 2.0, 2.0, 2.0/),& - gamma_4 = (/-1., -1., 6.0, 6.0, -1., -1., 6.0, 6.0, 6.0/) - - ! Swathing DDT array - type(swath_inputs),dimension(6) :: & - cospswathsIN - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - call cpu_time(driver_time(1)) - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Read in namelists - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Input namelist (cosp setup) - call get_command_argument(1, cosp_input_namelist) - open(10,file=cosp_input_namelist,status='unknown') - read(10,nml=cosp_input) - close(10) - - ! Output namelist (logical flags to turn on/off outputs) - if (command_argument_count() .ge. 2) call get_command_argument(2, cosp_output_namelist) - open(10,file=cosp_output_namelist,status='unknown') - read(10,nml=cosp_output) - close(10) - - ! Shift the namelists read in into a shorter array for cosp_init: - allocate(rttov_instrument_namelists_final(rttov_Ninstruments)) - rttov_instrument_namelists_final(:) = rttov_instrument_namelists(1:rttov_Ninstruments) - - ! Read orbital swathing inputs into structure: - ! Indexing order is ISCCP, MISR, CLOUDSAT-CALIPSO, ATLID, PARASOL, MODIS - cospswathsIN(1) % N_inst_swaths = N_SWATHS_ISCCP - cospswathsIN(1) % inst_localtimes(1:N_SWATHS_ISCCP) = SWATH_LOCALTIMES_ISCCP(1:N_SWATHS_ISCCP) - cospswathsIN(1) % inst_localtime_widths(1:N_SWATHS_ISCCP) = SWATH_WIDTHS_ISCCP(1:N_SWATHS_ISCCP) - cospswathsIN(2) % N_inst_swaths = N_SWATHS_MISR - cospswathsIN(2) % inst_localtimes(1:N_SWATHS_MISR) = SWATH_LOCALTIMES_MISR(1:N_SWATHS_MISR) - cospswathsIN(2) % inst_localtime_widths(1:N_SWATHS_MISR) = SWATH_WIDTHS_MISR(1:N_SWATHS_MISR) - cospswathsIN(3) % N_inst_swaths = N_SWATHS_CSCAL - cospswathsIN(3) % inst_localtimes(1:N_SWATHS_CSCAL) = SWATH_LOCALTIMES_CSCAL(1:N_SWATHS_CSCAL) - cospswathsIN(3) % inst_localtime_widths(1:N_SWATHS_CSCAL) = SWATH_WIDTHS_CSCAL(1:N_SWATHS_CSCAL) - cospswathsIN(4) % N_inst_swaths = N_SWATHS_ATLID - cospswathsIN(4) % inst_localtimes(1:N_SWATHS_ATLID) = SWATH_LOCALTIMES_ATLID(1:N_SWATHS_ATLID) - cospswathsIN(4) % inst_localtime_widths(1:N_SWATHS_ATLID) = SWATH_WIDTHS_ATLID(1:N_SWATHS_ATLID) - cospswathsIN(5) % N_inst_swaths = N_SWATHS_PARASOL - cospswathsIN(5) % inst_localtimes(1:N_SWATHS_PARASOL) = SWATH_LOCALTIMES_PARASOL(1:N_SWATHS_PARASOL) - cospswathsIN(5) % inst_localtime_widths(1:N_SWATHS_PARASOL) = SWATH_WIDTHS_PARASOL(1:N_SWATHS_PARASOL) - cospswathsIN(6) % N_inst_swaths = N_SWATHS_MODIS - cospswathsIN(6) % inst_localtimes(1:N_SWATHS_MODIS) = SWATH_LOCALTIMES_MODIS(1:N_SWATHS_MODIS) - cospswathsIN(6) % inst_localtime_widths(1:N_SWATHS_MODIS) = SWATH_WIDTHS_MODIS(1:N_SWATHS_MODIS) - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Read in sample input data. - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - allocate(lon(Npoints),lat(Npoints),p(Npoints,Nlevels),ph(Npoints,Nlevels), & - zlev(Npoints,Nlevels),zlev_half(Npoints,Nlevels),T(Npoints,Nlevels), & - sh(Npoints,Nlevels),rh(Npoints,Nlevels),tca(Npoints,Nlevels), & - cca(Npoints,Nlevels),mr_lsliq(Npoints,Nlevels),mr_lsice(Npoints,Nlevels), & - mr_ccliq(Npoints,Nlevels),mr_ccice(Npoints,Nlevels), & - fl_lsrain(Npoints,Nlevels),fl_lssnow(Npoints,Nlevels), & - fl_lsgrpl(Npoints,Nlevels),fl_ccrain(Npoints,Nlevels), & - fl_ccsnow(Npoints,Nlevels),Reff(Npoints,Nlevels,N_HYDRO), & - dtau_s(Npoints,Nlevels),dtau_c(Npoints,Nlevels),dem_s(Npoints,Nlevels), & - dem_c(Npoints,Nlevels),skt(Npoints),psfc(Npoints),landmask(Npoints), & - mr_ozone(Npoints,Nlevels),u_wind(Npoints),v_wind(Npoints),sunlit(Npoints), & - gwvel(Npoints,Nlevels),gcumf(Npoints,Nlevels), & ! added by DPLRW - mr_lsrain(Npoints,Nlevels),mr_lssnow(Npoints,Nlevels), & - frac_out(Npoints,Ncolumns,Nlevels),surfelev(Npoints),year(Npoints), & - month(Npoints),day(Npoints),hour(Npoints),minute(Npoints),seconds(Npoints)) - - ! Set some fields to masked values if the COSP offline driver outputs are inconsistent - year(:) = R_UNDEF - month(:) = R_UNDEF - day(:) = R_UNDEF - hour(:) = R_UNDEF - minute(:) = R_UNDEF - seconds(:) = R_UNDEF - - fileIN = trim(dinput)//trim(finput) - call nc_read_input_file(fileIN,Npoints,Nlevels,N_HYDRO,lon,lat,p,ph,zlev,zlev_half, & - T,sh,rh,tca,cca,mr_lsliq,mr_lsice,mr_ccliq,mr_ccice,fl_lsrain, & - fl_lssnow,fl_lsgrpl,fl_ccrain,fl_ccsnow,Reff,dtau_s,dtau_c, & - dem_s,dem_c,skt,psfc,landmask,mr_ozone,u_wind,v_wind,sunlit, & - gwvel, gcumf, & ! added by DPLRW - mr_lsrain, mr_lssnow, & ! adjust to prognostic precipitation - emsfc_lw,geomode,Nlon,Nlat,surfelev, & - year,month,day,hour,minute,seconds) - call cpu_time(driver_time(2)) - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Which simulators need to be run? Look at which outputs are requested. - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (Lpctisccp .or. Lclisccp .or. Lboxptopisccp .or. Lboxtauisccp .or. Ltauisccp .or. & - Lcltisccp .or. Lmeantbisccp .or. Lmeantbclrisccp .or. Lalbisccp) Lisccp = .true. - if (LclMISR) Lmisr = .true. - if (Lcltmodis .or. Lclwmodis .or. Lclimodis .or. Lclhmodis .or. Lclmmodis .or. & - Lcllmodis .or. Ltautmodis .or. Ltauwmodis .or. Ltauimodis .or. Ltautlogmodis .or. & - Ltauwlogmodis .or. Ltauilogmodis .or. Lreffclwmodis .or. Lreffclimodis .or. & - Lpctmodis .or. Llwpmodis .or. Liwpmodis .or. Lclmodis) Lmodis = .true. - if (Lclcalipso2 .or. Lclcalipso .or. Lclhcalipso .or. Lcllcalipso .or. Lclmcalipso & - .or. Lcltcalipso .or. Lcltlidarradar .or. Lclcalipsoliq .or. Lclcalipsoice .or. & - Lclcalipsoun .or. Lclcalipsotmp .or. Lclcalipsotmpliq .or. Lclcalipsotmpice .or. & - Lclcalipsotmpun .or. Lcltcalipsoliq .or. Lcltcalipsoice .or. Lcltcalipsoun .or. & - Lclhcalipsoliq .or. Lclhcalipsoice .or. Lclhcalipsoun .or. Lclmcalipsoliq .or. & - Lclmcalipsoice .or. Lclmcalipsoun .or. Lcllcalipsoliq .or. Lcllcalipsoice .or. & - Lcllcalipsoun .or. LlidarBetaMol532 .or. LcfadLidarsr532 .or. Lcltlidarradar .or. & - Lcltlidarradar .or. Lclopaquecalipso .or. Lclthincalipso .or. Lclzopaquecalipso & - .or. Lclcalipsoopaque .or. Lclcalipsothin .or. Lclcalipsozopaque .or. & - Lclcalipsoopacity .or. Lclopaquetemp .or. Lclthintemp .or. Lclzopaquetemp .or. & - Lclopaquemeanz .or. Lclthinmeanz .or. Lclthinemis .or. Lclopaquemeanzse .or. & - Lclthinmeanzse .or. Lclzopaquecalipsose) Lcalipso = .true. - - if (LlidarBetaMol532gr .or. LcfadLidarsr532gr .or. Latb532gr .or. LclgrLidar532 .or. & - LclhgrLidar532 .or. LcllgrLidar532 .or. LclmgrLidar532 .or. LcltgrLidar532) & - LgrLidar532 = .true. - - if (LlidarBetaMol355 .or. LcfadLidarsr355 .or. Latb355 .or. Lclatlid .or. & - Lclhatlid .or. Lcllatlid .or. Lclmatlid .or. Lcltatlid) & - Latlid = .true. - - if (LcfadDbze94 .or. Ldbze94 .or. Lcltlidarradar) Lcloudsat = .true. - - if (LcfadDbze94 .or. Ldbze94 .or. Lcltlidarradar .or. Lptradarflag0 .or. Lptradarflag1 & - .or. Lptradarflag2 .or. Lptradarflag3 .or. Lptradarflag4 .or. Lptradarflag5 .or. & - Lptradarflag6 .or. Lptradarflag7 .or. Lptradarflag8 .or. Lptradarflag9 .or. & - Lradarpia) Lcloudsat = .true. - if (Lparasolrefl) Lparasol = .true. - if (rttov_Ninstruments .gt. 0) Lrttov = .true. - if (Ldplrw) Lcloudsat = .true. ! added by DPLRW - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! IF IMPLEMTING COSP IN GCM, HERE IS WHERE TO START!!! - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Initialize COSP - !*This only needs to be done the first time that COSP is called.* - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - ! Initialize quickbeam_optics, also if two-moment radar microphysics scheme is wanted... - if (cloudsat_micro_scheme == 'MMF_v3.5_two_moment') then - ldouble = .true. - lsingle = .false. - endif - call quickbeam_optics_init() - - ! Initialize the distributional parameters for hydrometeors in radar simulator - call hydro_class_init(lsingle,ldouble,sd) - - ! Initialize COSP simulator - call COSP_INIT(Lisccp, Lmodis, Lmisr, Lcloudsat, Lcalipso, LgrLidar532, Latlid, & - Lparasol, Lrttov, & - cloudsat_radar_freq, cloudsat_k2, cloudsat_use_gas_abs, & - cloudsat_do_ray, isccp_topheight, isccp_topheight_direction, surface_radar, & - rcfg_cloudsat, use_vgrid, csat_vgrid, Nlvgrid, Nlevels, cloudsat_micro_scheme, & - rttov_Ninstruments, rttov_instrument_namelists_final, rttov_configs, & - debug=rttov_verbose) - call cpu_time(driver_time(3)) - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Construct output derived type. - ! *NOTE* The "construct/destroy" subroutines are local to this module and should be - ! modified for your configuration. E.g. it may be overkill to query each field. - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - call construct_cosp_outputs(Lpctisccp, Lclisccp, Lboxptopisccp, Lboxtauisccp, & - Ltauisccp, Lcltisccp, Lmeantbisccp, Lmeantbclrisccp, Lalbisccp, LclMISR, & - Lcltmodis, Lclwmodis, Lclimodis, Lclhmodis, Lclmmodis, Lcllmodis, Ltautmodis, & - Ltauwmodis, Ltauimodis, Ltautlogmodis, Ltauwlogmodis, Ltauilogmodis, & - Lreffclwmodis, Lreffclimodis, Lpctmodis, Llwpmodis, Liwpmodis, Lclmodis, Latb532, & - Latb532gr, Latb355, LlidarBetaMol532, LlidarBetaMol532gr, LlidarBetaMol355, & - LcfadLidarsr532, LcfadLidarsr532gr, LcfadLidarsr355, Lclcalipso2, & - Lclcalipso, LclgrLidar532, Lclatlid, Lclhcalipso, Lcllcalipso, Lclmcalipso, & - Lcltcalipso, LclhgrLidar532, LcllgrLidar532, LclmgrLidar532, LcltgrLidar532, & - Lclhatlid, Lcllatlid, Lclmatlid, Lcltatlid, Lcltlidarradar, Lcloudsat_tcc, & - Lcloudsat_tcc2, Lclcalipsoliq, & - Lclcalipsoice, Lclcalipsoun, Lclcalipsotmp, Lclcalipsotmpliq, Lclcalipsotmpice, & - Lclcalipsotmpun, Lcltcalipsoliq, Lcltcalipsoice, Lcltcalipsoun, Lclhcalipsoliq, & - Lclhcalipsoice, Lclhcalipsoun, Lclmcalipsoliq, Lclmcalipsoice, Lclmcalipsoun, & - Lcllcalipsoliq, Lcllcalipsoice, Lcllcalipsoun, Lclopaquecalipso, Lclthincalipso, & - Lclzopaquecalipso, Lclcalipsoopaque, Lclcalipsothin, Lclcalipsozopaque, & - Lclcalipsoopacity, Lclopaquetemp, Lclthintemp, Lclzopaquetemp, Lclopaquemeanz, & - Lclthinmeanz, Lclthinemis, Lclopaquemeanzse, Lclthinmeanzse, Lclzopaquecalipsose, & - LcfadDbze94, Ldbze94, Lparasolrefl, & - Lptradarflag0,Lptradarflag1,Lptradarflag2,Lptradarflag3,Lptradarflag4, & - Lptradarflag5,Lptradarflag6,Lptradarflag7,Lptradarflag8,Lptradarflag9,Lradarpia, & - Lwr_occfreq, Lcfodd, rttov_Ninstruments, rttov_configs, Ldplrw, & - Npoints, Ncolumns, Nlevels, Nlvgrid_local, use_vgrid, cospOUT) - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Break COSP up into pieces and loop over each COSP 'chunk'. - ! nChunks = # Points to Process (nPoints) / # Points per COSP iteration (nPoints_it) - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (MOD(nPoints,nPoints_it) .eq. 0) then - nChunks = Npoints/Npoints_it - else - nChunks = nPoints/nPoints_it+1 - endif - if (nPoints .eq. nPoints_it) nChunks = 1 - write(*,*) 'nChunks = ',nChunks - do iChunk=1,nChunks - write(*,*) 'Now ... iChunk = ',iChunk - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Determine indices for "chunking" (again, if necessary) - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - if (nChunks .eq. 1) then - start_idx = 1 - end_idx = nPoints - nPtsPerIt = nPoints - else - start_idx = (iChunk-1)*nPoints_it+1 - end_idx = iChunk*nPoints_it - if (end_idx .gt. nPoints) end_idx=nPoints - nPtsPerIt = end_idx-start_idx+1 - endif - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Construct COSP input types - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (iChunk .eq. 1) then - call construct_cospIN(Nptsperit,nColumns,nLevels,rttov_Ninstruments,cospIN,emis_grey=1.0_wp) - ! call construct_cospIN(Nptsperit,nColumns,nLevels,rttov_Ninstruments,cospIN) - call construct_cospstateIN(Nptsperit,nLevels,cospstateIN) - endif - if (iChunk .eq. nChunks) then - call destroy_cospIN(cospIN) - call destroy_cospstateIN(cospstateIN) - call construct_cospIN(Nptsperit,nColumns,nLevels,rttov_Ninstruments,cospIN,emis_grey=1.0_wp) - ! call construct_cospIN(Nptsperit,nColumns,nLevels,rttov_Ninstruments,cospIN) - call construct_cospstateIN(Nptsperit,nLevels,cospstateIN) - endif - call cpu_time(driver_time(4)) - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Populate input types with model fields. - ! Here the 3D sample model fields (temperature,pressure,etc...) are ordered from the - ! surface-2-TOA, whereas COSP expects all fields to be ordered from TOA-2-SFC. So the - ! vertical fields are flipped prior to storing to COSP input type. - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - cospIN%emsfc_lw = emsfc_lw - cospIN%rcfg_cloudsat = rcfg_cloudsat - cospIN%cfg_rttov => rttov_configs - cospIN%cospswathsIN = cospswathsIN ! Swathing information for each non-RTTOV simulator. - - cospstateIN%hgt_matrix = zlev(start_idx:end_idx,Nlevels:1:-1) ! km - cospstateIN%sunlit = sunlit(start_idx:end_idx) ! 0-1 - cospstateIN%skt = skt(start_idx:end_idx) ! K - cospstateIN%surfelev = surfelev(start_idx:end_idx) ! m - cospstateIN%land = landmask(start_idx:end_idx) ! 0-1 (*note* model specific) - cospstateIN%qv = sh(start_idx:end_idx,Nlevels:1:-1) ! kg/kg - cospstateIN%at = T(start_idx:end_idx,Nlevels:1:-1) ! K - cospstateIN%pfull = p(start_idx:end_idx,Nlevels:1:-1) ! Pa - ! Pressure at interface (nlevels+1). Set uppermost interface to 0. - cospstateIN%phalf(:,2:Nlevels+1) = ph(start_idx:end_idx,Nlevels:1:-1) ! Pa - cospstateIN%phalf(:,1) = 0._wp - ! Surface pressure - if (any(psfc(start_idx:end_idx) .lt. 0._wp)) then - print*,'Some of values of the surface pressure field are negative. Replacing all psfc values with the lowest boundary pressure.' - psfc(start_idx:end_idx) = cospstateIN%phalf(start_idx:end_idx,Nlevels+1) - end if - cospstateIN%psfc = psfc(start_idx:end_idx) ! Pa - ! Height of bottom interfaces of model layers (nlevels). - ! cospstateIN%hgt_matrix_half(:,1) contains the bottom of the top layer. - ! cospstateIN%hgt_matrix_half(:,Nlevels) contains the bottom of the surface layer. - cospstateIN%hgt_matrix_half(:,1:Nlevels) = zlev_half(start_idx:end_idx,Nlevels:1:-1) ! km - - ! added by DPLRW - cospstateIN%gwvel(:,1:Nlevels) = gwvel(start_idx:end_idx,Nlevels:1:-1) - cospstateIN%gcumf(:,1:Nlevels) = gcumf(start_idx:end_idx,Nlevels:1:-1) - - ! Assign RTTOV values - ! Keeping these structures since refl and emis could come from model input - ! cospstateIN%emis_in(:,:) = 1._wp - ! cospstateIN%refl_in(:,:) = 1._wp - - ! Well-mixed gases are not provided in COSP offline input, so hardcoding them in. - ! Units are kg/kg over moist air. - ! Note: user_tracegas_input should be true in instrument namelists for the COSP offline driver - cospstateIN%co2(:,:) = 5.241e-04 - cospstateIN%ch4(:,:) = 9.139e-07 - cospstateIN%n2o(:,:) = 4.665e-07 - cospstateIN%co(:,:) = 2.098e-07 - cospstateIN%so2(:,:) = 2.0e-11 - - if (any(year(start_idx:end_idx) .lt. 0._wp)) then - print*,'Some of values of the input year field are masked. Replacing with 1 so RTTOV will run.' - where (year(start_idx:end_idx) .lt. 0._wp) - year(start_idx:end_idx) = 1 - end where - end if - if (any(month(start_idx:end_idx) .lt. 0._wp)) then - print*,'Some of values of the input month field are masked. Replacing with 1 so RTTOV will run.' - where (month(start_idx:end_idx) .lt. 0._wp) - month(start_idx:end_idx) = 1 - end where - end if - if (any(day(start_idx:end_idx) .lt. 0._wp)) then - print*,'Some of values of the input day field are masked. Replacing with 1 so RTTOV will run.' - where (day(start_idx:end_idx) .lt. 0._wp) - day(start_idx:end_idx) = 1 - end where - end if - if (any(hour(start_idx:end_idx) .lt. 0._wp)) then - print*,'Some of values of the input hour field are masked. Replacing with 1 so RTTOV will run.' - where (hour(start_idx:end_idx) .lt. 0._wp) - hour(start_idx:end_idx) = 1._wp - end where - end if - if (any(minute(start_idx:end_idx) .lt. 0._wp)) then - print*,'Some of values of the input minute field are masked. Replacing with 1 so RTTOV will run.' - where (minute(start_idx:end_idx) .lt. 0._wp) - minute(start_idx:end_idx) = 1._wp - end where - end if - if (any(seconds(start_idx:end_idx) .lt. 0._wp)) then - print*,'Some of values of the input minute field are masked. Replacing with 1 so RTTOV will run.' - where (seconds(start_idx:end_idx) .lt. 0._wp) - seconds(start_idx:end_idx) = 1._wp - end where - end if - - ! Read in date and time objects for RTTOV - cospstateIN%rttov_date(:,1) = year(start_idx:end_idx) - cospstateIN%rttov_date(:,2) = month(start_idx:end_idx) - cospstateIN%rttov_date(:,3) = day(start_idx:end_idx) - - cospstateIN%rttov_time(:,1) = hour(start_idx:end_idx) - cospstateIN%rttov_time(:,2) = minute(start_idx:end_idx) - cospstateIN%rttov_time(:,3) = seconds(start_idx:end_idx) - - cospstateIN%sza = 0._wp ! Hard code to zero for the offline driver. - - ! From the data input file - cospstateIN%u_sfc = u_wind(start_idx:end_idx) - cospstateIN%v_sfc = v_wind(start_idx:end_idx) - cospstateIN%lat = lat(start_idx:end_idx) - cospstateIN%lon = lon(start_idx:end_idx) - - cospstateIN%o3 = mr_ozone(start_idx:end_idx,Nlevels:1:-1) - cospstateIN%tca = tca(start_idx:end_idx,Nlevels:1:-1) - - ! Combine large-scale and convective cloud mixing ratios for RTTOV [kg/kg] - cospstateIN%cloudIce = mr_lsice(start_idx:end_idx,Nlevels:1:-1) + mr_ccice(start_idx:end_idx,Nlevels:1:-1) - cospstateIN%cloudLiq = mr_lsliq(start_idx:end_idx,Nlevels:1:-1) + mr_ccliq(start_idx:end_idx,Nlevels:1:-1) - - ! Combine large-scale and convective cloud effective radii into effective diameters for RTTOV - ! Reff(Npoints,Nlevels,N_HYDRO) - ! The weighted Reff is given by: Reff_net = (M_1 + M_2) / (M_1/Reff_1 + M_2/Reff_2) - cospstateIN%DeffLiq(:,:) = 0._wp ! Initialize for zero everywhere. - where ((mr_lsliq(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) .and. (mr_ccliq(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp)) - cospstateIN%DeffLiq(:,:) = 2._wp * 1.0e6 * (mr_lsliq(start_idx:end_idx,Nlevels:1:-1) + mr_ccliq(start_idx:end_idx,Nlevels:1:-1)) / & - & (mr_lsliq(start_idx:end_idx,Nlevels:1:-1) / Reff(start_idx:end_idx,Nlevels:1:-1,I_LSCLIQ) + mr_ccliq(start_idx:end_idx,Nlevels:1:-1) / Reff(start_idx:end_idx,Nlevels:1:-1,I_CVCLIQ)) - elsewhere (mr_lsliq(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) - cospstateIN%DeffLiq(:,:) = 2._wp * 1.0e6 * Reff(start_idx:end_idx,Nlevels:1:-1,I_LSCLIQ) - elsewhere (mr_ccliq(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) - cospstateIN%DeffLiq(:,:) = 2._wp * 1.0e6 * Reff(start_idx:end_idx,Nlevels:1:-1,I_CVCLIQ) - end where - - cospstateIN%DeffIce(:,:) = 0._wp ! Initialize for zero everywhere. - where ((mr_lsice(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) .and. (mr_ccice(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp)) - cospstateIN%DeffIce(:,:) = 2._wp * 1.0e6 * (mr_lsice(start_idx:end_idx,Nlevels:1:-1) + mr_ccice(start_idx:end_idx,Nlevels:1:-1)) / & - & (mr_lsice(start_idx:end_idx,Nlevels:1:-1) / Reff(start_idx:end_idx,Nlevels:1:-1,I_LSCICE) + mr_ccice(start_idx:end_idx,Nlevels:1:-1) / Reff(start_idx:end_idx,Nlevels:1:-1,I_CVCICE)) - elsewhere (mr_lsice(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) - cospstateIN%DeffIce(:,:) = 2._wp * 1.0e6 * Reff(start_idx:end_idx,Nlevels:1:-1,I_LSCICE) - elsewhere (mr_ccice(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) - cospstateIN%DeffIce(:,:) = 2._wp * 1.0e6 * Reff(start_idx:end_idx,Nlevels:1:-1,I_CVCICE) - end where - - ! RTTOV doesn't consider precip flux for longwave, but it could be used when simulating MW instruments. - ! Graupel goes in the snow category, arbitrarily - cospstateIN%fl_rain = fl_lsrain(start_idx:end_idx,Nlevels:1:-1) + fl_ccrain(start_idx:end_idx,Nlevels:1:-1) - cospstateIN%fl_snow = fl_lssnow(start_idx:end_idx,Nlevels:1:-1) + fl_ccsnow(start_idx:end_idx,Nlevels:1:-1) + & - fl_lsgrpl(start_idx:end_idx,Nlevels:1:-1) - - ! Inputs not supplied in the UKMO test data - cospstateIN%rttov_sfcmask = landmask(start_idx:end_idx) ! (0=ocn,1=land,2=seaice). No sea ice in UKMO input here. - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Generate subcolumns and compute optical inputs. - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - call subsample_and_optics(nPtsPerIt,nLevels,nColumns,N_HYDRO,overlap, & - use_vgrid,use_precipitation_fluxes,lidar_ice_type,sd, & - tca(start_idx:end_idx,Nlevels:1:-1),cca(start_idx:end_idx,Nlevels:1:-1), & - fl_lsrain(start_idx:end_idx,Nlevels:1:-1),fl_lssnow(start_idx:end_idx,Nlevels:1:-1), & - fl_lsgrpl(start_idx:end_idx,Nlevels:1:-1),fl_ccrain(start_idx:end_idx,Nlevels:1:-1), & - fl_ccsnow(start_idx:end_idx,Nlevels:1:-1),mr_lsliq(start_idx:end_idx,Nlevels:1:-1), & - mr_lsice(start_idx:end_idx,Nlevels:1:-1),mr_ccliq(start_idx:end_idx,Nlevels:1:-1), & - mr_ccice(start_idx:end_idx,Nlevels:1:-1), & - mr_lsrain(start_idx:end_idx,Nlevels:1:-1),mr_lssnow(start_idx:end_idx,Nlevels:1:-1), & - Reff(start_idx:end_idx,Nlevels:1:-1,:), & - dtau_c(start_idx:end_idx,nLevels:1:-1),dtau_s(start_idx:end_idx,nLevels:1:-1), & - dem_c(start_idx:end_idx,nLevels:1:-1),dem_s(start_idx:end_idx,nLevels:1:-1), & - cospstateIN,cospIN) - - call cpu_time(driver_time(6)) - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Call COSP - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - cosp_status = COSP_SIMULATOR(cospIN, cospstateIN, cospOUT,start_idx,end_idx,rttov_verbose) - do ij=1,size(cosp_status,1) - if (cosp_status(ij) .ne. '') print*,trim(cosp_status(ij)) - end do - - call cpu_time(driver_time(7)) - - end do - - print*,'Time to read in data: ',driver_time(2)-driver_time(1) - print*,'Time to initialize: ',driver_time(3)-driver_time(2) - print*,'Time to construct types: ',driver_time(4)-driver_time(3) - print*,'Time to compute optics: ',driver_time(6)-driver_time(4) - print*,'Time to run COSP: ',driver_time(7)-driver_time(6) - print*,'Total time: ',driver_time(7)-driver_time(1) - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Output - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - call write_cosp2_output(Npoints, Ncolumns, Nlevels, rttov_Ninstruments, zlev(1,Nlevels:1:-1), lon, lat, cospOUT, foutput) - - call cpu_time(driver_time(8)) - print*,'Time to write to output: ',driver_time(8)-driver_time(7) - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Free up memory - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (rttov_verbose) print*,'Calling "destroy_cosp_outputs".' - call destroy_cosp_outputs(cospOUT) - if (associated(cospIN%cfg_rttov)) then - if (rttov_verbose) print*,'Calling "rttov_cleanup".' - call rttov_cleanup(cospIN) - endif - if (rttov_verbose) print*,'Calling "destroy_cospIN".' - call destroy_cospIN(cospIN) - if (rttov_verbose) print*,'Calling "destroy_cospstateIN".' - call destroy_cospstateIN(cospstateIN) - if (rttov_verbose) print*,'Calling "cosp_cleanUp".' - call cosp_cleanUp() - if (rttov_verbose) print*,'all done.' - -contains - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE subsample_and_optics - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - subroutine subsample_and_optics(nPoints, nLevels, nColumns, nHydro, overlap, use_vgrid, & - use_precipitation_fluxes, lidar_ice_type, sd, & - tca, cca, fl_lsrainIN, fl_lssnowIN, & - fl_lsgrplIN, fl_ccrainIN, fl_ccsnowIN, mr_lsliq, mr_lsice, mr_ccliq, mr_ccice, & - mr_lsrain, mr_lssnow, & ! adjust to prognostic precipitation - reffIN, dtau_c, dtau_s, dem_c, dem_s, cospstateIN, cospIN) - ! Inputs - integer,intent(in) :: nPoints, nLevels, nColumns, nHydro, overlap, lidar_ice_type - real(wp),intent(in),dimension(nPoints,nLevels) :: tca,cca,mr_lsliq,mr_lsice,mr_ccliq, & - mr_ccice,dtau_c,dtau_s,dem_c,dem_s,fl_lsrainIN,fl_lssnowIN,fl_lsgrplIN,fl_ccrainIN,& - fl_ccsnowIN, mr_lsrain, mr_lssnow - real(wp),intent(in),dimension(nPoints,nLevels,nHydro) :: reffIN - logical,intent(in) :: use_vgrid ! .false.: outputs on model levels - ! .true.: outputs on evenly-spaced vertical levels. - logical,intent(in) :: use_precipitation_fluxes - type(size_distribution),intent(inout) :: sd - - ! Outputs - type(cosp_optical_inputs),intent(inout) :: cospIN - type(cosp_column_inputs),intent(inout) :: cospstateIN - - ! Local variables - type(rng_state),allocatable,dimension(:) :: rngs ! Seeds for random number generator - integer,dimension(:),allocatable :: seed - integer,dimension(:),allocatable :: cloudsat_preclvl_index - integer :: i,j,k - real(wp) :: zstep - real(wp),dimension(:,:), allocatable :: & - ls_p_rate, cv_p_rate, frac_ls, frac_cv, prec_ls, prec_cv,g_vol - real(wp),dimension(:,:,:), allocatable :: & - frac_prec, MODIS_cloudWater, MODIS_cloudIce, fracPrecipIce, fracPrecipIce_statGrid,& - MODIS_watersize,MODIS_iceSize, MODIS_opticalThicknessLiq,MODIS_opticalThicknessIce - real(wp),dimension(:,:,:,:),allocatable :: & - mr_hydro, Reff, Np - real(wp),dimension(nPoints,nLevels) :: & - column_frac_out, column_prec_out, fl_lsrain, fl_lssnow, fl_lsgrpl, fl_ccrain, fl_ccsnow - real(wp),dimension(nPoints,nColumns,Nlvgrid_local) :: tempOut - logical :: cmpGases=.true. - logical :: prog_flag=.true. ! adjust to prognostic precipitation - - if (Ncolumns .gt. 1) then - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Generate subcolumns for clouds (SCOPS) and precipitation type (PREC_SCOPS) - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! RNG used for subcolumn generation - allocate(rngs(nPoints),seed(nPoints)) - seed(:)=0 - seed = int(cospstateIN%phalf(:,Nlevels+1)) ! In case of NPoints=1 - ! *NOTE* Chunking will change the seed - if (NPoints .gt. 1) seed=int((cospstateIN%phalf(:,Nlevels+1)-minval(cospstateIN%phalf(:,Nlevels+1)))/ & - (maxval(cospstateIN%phalf(:,Nlevels+1))-minval(cospstateIN%phalf(:,Nlevels+1)))*100000) + 1 - call init_rng(rngs, seed) - - ! Call scops - call scops(NPoints,Nlevels,Ncolumns,rngs,tca,cca,overlap,cospIN%frac_out,0) - deallocate(seed,rngs) - - ! Sum up precipitation rates - allocate(ls_p_rate(nPoints,nLevels),cv_p_rate(nPoints,Nlevels)) - if(use_precipitation_fluxes) then - ls_p_rate(:,1:nLevels) = fl_lsrainIN + fl_lssnowIN + fl_lsgrplIN - cv_p_rate(:,1:nLevels) = fl_ccrainIN + fl_ccsnowIN - else - ls_p_rate(:,1:nLevels) = 0 ! mixing_ratio(rain) + mixing_ratio(snow) + mixing_ratio (groupel) - cv_p_rate(:,1:nLevels) = 0 ! mixing_ratio(rain) + mixing_ratio(snow) + mixing_ratio (groupel) - end if - - ! Call PREC_SCOPS - allocate(frac_prec(nPoints,nColumns,nLevels)) - call prec_scops(nPoints,nLevels,nColumns,ls_p_rate,cv_p_rate,cospIN%frac_out,frac_prec) - deallocate(ls_p_rate,cv_p_rate) - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Compute fraction in each gridbox for precipitation and cloud type. - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Allocate - allocate(frac_ls(nPoints,nLevels),prec_ls(nPoints,nLevels), & - frac_cv(nPoints,nLevels),prec_cv(nPoints,nLevels)) - - ! Initialize - frac_ls(1:nPoints,1:nLevels) = 0._wp - prec_ls(1:nPoints,1:nLevels) = 0._wp - frac_cv(1:nPoints,1:nLevels) = 0._wp - prec_cv(1:nPoints,1:nLevels) = 0._wp - do j=1,nPoints - do k=1,nLevels - do i=1,nColumns - if (cospIN%frac_out(j,i,k) .eq. 1) frac_ls(j,k) = frac_ls(j,k)+1._wp - if (cospIN%frac_out(j,i,k) .eq. 2) frac_cv(j,k) = frac_cv(j,k)+1._wp - if (frac_prec(j,i,k) .eq. 1) prec_ls(j,k) = prec_ls(j,k)+1._wp - if (frac_prec(j,i,k) .eq. 2) prec_cv(j,k) = prec_cv(j,k)+1._wp - if (frac_prec(j,i,k) .eq. 3) prec_cv(j,k) = prec_cv(j,k)+1._wp - if (frac_prec(j,i,k) .eq. 3) prec_ls(j,k) = prec_ls(j,k)+1._wp - enddo - frac_ls(j,k)=frac_ls(j,k)/nColumns - frac_cv(j,k)=frac_cv(j,k)/nColumns - prec_ls(j,k)=prec_ls(j,k)/nColumns - prec_cv(j,k)=prec_cv(j,k)/nColumns - enddo - enddo - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Assign gridmean mixing-ratios (mr_XXXXX), effective radius (ReffIN) and number - ! concentration (not defined) to appropriate sub-column. Here we are using scops. - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - allocate(mr_hydro(nPoints,nColumns,nLevels,nHydro), & - Reff(nPoints,nColumns,nLevels,nHydro), & - Np(nPoints,nColumns,nLevels,nHydro)) - - ! Initialize - mr_hydro(:,:,:,:) = 0._wp - Reff(:,:,:,:) = 0._wp - Np(:,:,:,:) = 0._wp - - ! check prognostic precipitaion - if ( any(mr_lsrain .lt. 0._wp) .or. any(mr_lssnow .lt. 0._wp) ) prog_flag = .false. - - do k=1,nColumns - ! Subcolumn cloud fraction - column_frac_out = cospIN%frac_out(:,k,:) - - ! LS clouds - where (column_frac_out == I_LSC) - mr_hydro(:,k,:,I_LSCLIQ) = mr_lsliq - mr_hydro(:,k,:,I_LSCICE) = mr_lsice - Reff(:,k,:,I_LSCLIQ) = ReffIN(:,:,I_LSCLIQ) - Reff(:,k,:,I_LSCICE) = ReffIN(:,:,I_LSCICE) - ! CONV clouds - elsewhere (column_frac_out == I_CVC) - mr_hydro(:,k,:,I_CVCLIQ) = mr_ccliq - mr_hydro(:,k,:,I_CVCICE) = mr_ccice - Reff(:,k,:,I_CVCLIQ) = ReffIN(:,:,I_CVCLIQ) - Reff(:,k,:,I_CVCICE) = ReffIN(:,:,I_CVCICE) - end where - - ! Subcolumn precipitation - column_prec_out = frac_prec(:,k,:) - - ! LS Precipitation - where ((column_prec_out == 1) .or. (column_prec_out == 3) ) - Reff(:,k,:,I_LSRAIN) = ReffIN(:,:,I_LSRAIN) - Reff(:,k,:,I_LSSNOW) = ReffIN(:,:,I_LSSNOW) - Reff(:,k,:,I_LSGRPL) = ReffIN(:,:,I_LSGRPL) - ! CONV precipitation - elsewhere ((column_prec_out == 2) .or. (column_prec_out == 3)) - Reff(:,k,:,I_CVRAIN) = ReffIN(:,:,I_CVRAIN) - Reff(:,k,:,I_CVSNOW) = ReffIN(:,:,I_CVSNOW) - end where - enddo - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Convert the subcolumn mixing ratio and precipitation fluxes from gridbox mean - ! values to fraction-based values. - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Initialize - fl_lsrain(:,:) = 0._wp - fl_lssnow(:,:) = 0._wp - fl_lsgrpl(:,:) = 0._wp - fl_ccrain(:,:) = 0._wp - fl_ccsnow(:,:) = 0._wp - - do k=1,nLevels - do j=1,nPoints - ! In-cloud mixing ratios. - if (frac_ls(j,k) .ne. 0.) then - mr_hydro(j,:,k,I_LSCLIQ) = mr_hydro(j,:,k,I_LSCLIQ)/frac_ls(j,k) - mr_hydro(j,:,k,I_LSCICE) = mr_hydro(j,:,k,I_LSCICE)/frac_ls(j,k) - endif - if (frac_cv(j,k) .ne. 0.) then - mr_hydro(j,:,k,I_CVCLIQ) = mr_hydro(j,:,k,I_CVCLIQ)/frac_cv(j,k) - mr_hydro(j,:,k,I_CVCICE) = mr_hydro(j,:,k,I_CVCICE)/frac_cv(j,k) - endif - ! Precipitation - if (use_precipitation_fluxes) then - if (prec_ls(j,k) .ne. 0.) then - if (prog_flag) then - mr_hydro(j,:,k,I_LSRAIN) = mr_lsrain(j,k)/prec_ls(j,k) - mr_hydro(j,:,k,I_LSSNOW) = mr_lssnow(j,k)/prec_ls(j,k) - else - fl_lsrain(j,k) = fl_lsrainIN(j,k)/prec_ls(j,k) - fl_lssnow(j,k) = fl_lssnowIN(j,k)/prec_ls(j,k) - fl_lsgrpl(j,k) = fl_lsgrplIN(j,k)/prec_ls(j,k) - end if - endif - if (prec_cv(j,k) .ne. 0.) then - fl_ccrain(j,k) = fl_ccrainIN(j,k)/prec_cv(j,k) - fl_ccsnow(j,k) = fl_ccsnowIN(j,k)/prec_cv(j,k) - endif - else - if (prec_ls(j,k) .ne. 0.) then - mr_hydro(j,:,k,I_LSRAIN) = mr_hydro(j,:,k,I_LSRAIN)/prec_ls(j,k) - mr_hydro(j,:,k,I_LSSNOW) = mr_hydro(j,:,k,I_LSSNOW)/prec_ls(j,k) - mr_hydro(j,:,k,I_LSGRPL) = mr_hydro(j,:,k,I_LSGRPL)/prec_ls(j,k) - endif - if (prec_cv(j,k) .ne. 0.) then - mr_hydro(j,:,k,I_CVRAIN) = mr_hydro(j,:,k,I_CVRAIN)/prec_cv(j,k) - mr_hydro(j,:,k,I_CVSNOW) = mr_hydro(j,:,k,I_CVSNOW)/prec_cv(j,k) - endif - endif - - ! cumulus mass flux, added by DPLRW - if (cca(j,k) > 0._wp .and. cca(j,k) <= 1._wp) then - cospstateIN%gcumf(j,k) = cospstateIN%gcumf(j,k)/cca(j,k) - else - cospstateIN%gcumf(j,k) = R_UNDEF - end if - enddo - enddo - deallocate(frac_ls,prec_ls,frac_cv,prec_cv) - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Convert precipitation fluxes to mixing ratios - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (use_precipitation_fluxes) then - ! LS rain - if (.not. prog_flag) then - call cosp_precip_mxratio(Npoints, Nlevels, Ncolumns, & - cospstateIN%pfull, cospstateIN%at, frac_prec, 1._wp, I_LSRAIN, sd, & - fl_lsrain, mr_hydro(:,:,:,I_LSRAIN), Reff(:,:,:,I_LSRAIN) ) - end if - ! LS snow - if (.not. prog_flag) then - call cosp_precip_mxratio(Npoints, Nlevels, Ncolumns, & - cospstateIN%pfull, cospstateIN%at, frac_prec, 1._wp, I_LSSNOW, sd, & - fl_lssnow, mr_hydro(:,:,:,I_LSSNOW), Reff(:,:,:,I_LSSNOW) ) - end if - ! CV rain - call cosp_precip_mxratio(Npoints, Nlevels, Ncolumns, & - cospstateIN%pfull, cospstateIN%at, frac_prec, 2._wp, I_CVRAIN, sd, & - fl_lssnow, mr_hydro(:,:,:,I_CVRAIN), Reff(:,:,:,I_CVRAIN) ) - ! CV snow - call cosp_precip_mxratio(Npoints, Nlevels, Ncolumns, & - cospstateIN%pfull, cospstateIN%at, frac_prec, 2._wp, I_CVSNOW, sd, & - fl_lssnow, mr_hydro(:,:,:,I_CVSNOW), Reff(:,:,:,I_CVSNOW) ) - ! LS groupel. - call cosp_precip_mxratio(Npoints, Nlevels, Ncolumns, & - cospstateIN%pfull, cospstateIN%at, frac_prec, 1._wp, I_LSGRPL, sd, & - fl_lssnow, mr_hydro(:,:,:,I_LSGRPL), Reff(:,:,:,I_LSGRPL) ) - - deallocate(frac_prec) - endif - - else - cospIN%frac_out(:,:,:) = 1 - allocate(mr_hydro(nPoints,1,nLevels,nHydro),Reff(nPoints,1,nLevels,nHydro), & - Np(nPoints,1,nLevels,nHydro)) - mr_hydro(:,1,:,I_LSCLIQ) = mr_lsliq - mr_hydro(:,1,:,I_LSCICE) = mr_lsice - mr_hydro(:,1,:,I_CVCLIQ) = mr_ccliq - mr_hydro(:,1,:,I_CVCICE) = mr_ccice - Reff(:,1,:,:) = ReffIN - endif - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! 11 micron emissivity - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (Lisccp) then - call cosp_simulator_optics(nPoints,nColumns,nLevels,cospIN%frac_out,dem_c,dem_s, & - cospIN%emiss_11) - endif - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! 0.67 micron optical depth - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (Lisccp .or. Lmisr .or. Lmodis) then - call cosp_simulator_optics(nPoints,nColumns,nLevels,cospIN%frac_out,dtau_c,dtau_s, & - cospIN%tau_067) - endif - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! LIDAR Polarized optics - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (Lcalipso) then - call lidar_optics(nPoints, nColumns, nLevels, 4, lidar_ice_type, 532, .false., & - mr_hydro(:,:,:,I_LSCLIQ), mr_hydro(:,:,:,I_LSCICE), mr_hydro(:,:,:,I_CVCLIQ), & - mr_hydro(:,:,:,I_CVCICE), ReffIN(:,:,I_LSCLIQ), ReffIN(:,:,I_LSCICE), & - ReffIN(:,:,I_CVCLIQ), ReffIN(:,:,I_CVCICE), cospstateIN%pfull, & - cospstateIN%phalf, cospstateIN%at, cospIN%beta_mol_calipso, & - cospIN%betatot_calipso, cospIN%tau_mol_calipso, cospIN%tautot_calipso, & - cospIN%tautot_S_liq, cospIN%tautot_S_ice, cospIN%betatot_ice_calipso, & - cospIN%betatot_liq_calipso, cospIN%tautot_ice_calipso, cospIN%tautot_liq_calipso) - endif - - if (LgrLidar532) then - call lidar_optics(nPoints, nColumns, nLevels, 4, lidar_ice_type, 532, .true., & - mr_hydro(:,:,:,I_LSCLIQ), mr_hydro(:,:,:,I_LSCICE), mr_hydro(:,:,:,I_CVCLIQ), & - mr_hydro(:,:,:,I_CVCICE), ReffIN(:,:,I_LSCLIQ), ReffIN(:,:,I_LSCICE), & - ReffIN(:,:,I_CVCLIQ), ReffIN(:,:,I_CVCICE), cospstateIN%pfull, & - cospstateIN%phalf, cospstateIN%at, cospIN%beta_mol_grLidar532, & - cospIN%betatot_grLidar532, cospIN%tau_mol_grLidar532, cospIN%tautot_grLidar532) - endif - - if (Latlid) then - call lidar_optics(nPoints, nColumns, nLevels, 4, lidar_ice_type, 355, .false., & - mr_hydro(:,:,:,I_LSCLIQ), mr_hydro(:,:,:,I_LSCICE), mr_hydro(:,:,:,I_CVCLIQ), & - mr_hydro(:,:,:,I_CVCICE), ReffIN(:,:,I_LSCLIQ), ReffIN(:,:,I_LSCICE), & - ReffIN(:,:,I_CVCLIQ), ReffIN(:,:,I_CVCICE), cospstateIN%pfull, & - cospstateIN%phalf, cospstateIN%at, cospIN%beta_mol_atlid, cospIN%betatot_atlid,& - cospIN%tau_mol_atlid, cospIN%tautot_atlid) - endif - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! CLOUDSAT RADAR OPTICS - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (lcloudsat) then - - ! Compute gaseous absorption (assume identical for each subcolun) - allocate(g_vol(nPoints,nLevels)) - g_vol(:,:)=0._wp - do i=1,nPoints - do j=1,nLevels - if (rcfg_cloudsat%use_gas_abs == 1 .or. (rcfg_cloudsat%use_gas_abs == 2 .and. j .eq. 1)) then - g_vol(i,j) = gases(cospstateIN%pfull(i,j), cospstateIN%at(i,j),cospstateIN%qv(i,j),rcfg_cloudsat%freq) - endif - cospIN%g_vol_cloudsat(i,:,j)=g_vol(i,j) - end do - end do - - ! Loop over all subcolumns - allocate(fracPrecipIce(nPoints,nColumns,nLevels)) - fracPrecipIce(:,:,:) = 0._wp - do k=1,nColumns - call quickbeam_optics(sd, rcfg_cloudsat, nPoints, nLevels, R_UNDEF, & - mr_hydro(:,k,:,1:nHydro)*1000._wp, Reff(:,k,:,1:nHydro)*1.e6_wp,& - Np(:,k,:,1:nHydro), cospstateIN%pfull, cospstateIN%at, & - cospstateIN%qv, cospIN%z_vol_cloudsat(1:nPoints,k,:), & - cospIN%kr_vol_cloudsat(1:nPoints,k,:), & - cospIN%vfall(1:nPoints,k,:,1:N_Hydro), & - cospIN%vfsqu(1:nPoints,k,:,1:N_Hydro), & - cospIN%zehyd(1:nPoints,k,:,1:N_Hydro), & - cospIN%krhyd(1:nPoints,k,:,1:N_Hydro), & - cospIN%vtrm3(1:nPoints,k,:,1:N_Hydro), & - cospIN%vtrm0(1:nPoints,k,:,1:N_Hydro), & - cospIN%mmnt3(1:nPoints,k,:,1:N_Hydro), & - cospIN%mmnt0(1:nPoints,k,:,1:N_Hydro) ) - - ! At each model level, what fraction of the precipitation is frozen? - where(mr_hydro(:,k,:,I_LSRAIN) .gt. 0 .or. mr_hydro(:,k,:,I_LSSNOW) .gt. 0 .or. & - mr_hydro(:,k,:,I_CVRAIN) .gt. 0 .or. mr_hydro(:,k,:,I_CVSNOW) .gt. 0 .or. & - mr_hydro(:,k,:,I_LSGRPL) .gt. 0) - fracPrecipIce(:,k,:) = (mr_hydro(:,k,:,I_LSSNOW) + mr_hydro(:,k,:,I_CVSNOW) + & - mr_hydro(:,k,:,I_LSGRPL)) / & - (mr_hydro(:,k,:,I_LSSNOW) + mr_hydro(:,k,:,I_CVSNOW) + mr_hydro(:,k,:,I_LSGRPL) + & - mr_hydro(:,k,:,I_LSRAIN) + mr_hydro(:,k,:,I_CVRAIN)) - elsewhere - fracPrecipIce(:,k,:) = 0._wp - endwhere - enddo - - ! Regrid frozen fraction to Cloudsat/Calipso statistical grid - if (use_vgrid) then - allocate(fracPrecipIce_statGrid(nPoints,nColumns,Nlvgrid_local)) - fracPrecipIce_statGrid(:,:,:) = 0._wp - call cosp_change_vertical_grid(Npoints, Ncolumns, Nlevels, cospstateIN%hgt_matrix(:,Nlevels:1:-1), & - cospstateIN%hgt_matrix_half(:,Nlevels:1:-1), fracPrecipIce(:,:,Nlevels:1:-1), Nlvgrid_local, & - vgrid_zl(Nlvgrid_local:1:-1), vgrid_zu(Nlvgrid_local:1:-1), fracPrecipIce_statGrid(:,:,Nlvgrid_local:1:-1)) - - ! Find proper layer above de surface elevation to compute precip flags in Cloudsat/Calipso statistical grid - allocate(cloudsat_preclvl_index(nPoints)) - cloudsat_preclvl_index(:) = 0._wp - ! Compute the zstep distance between two atmopsheric layers - zstep = vgrid_zl(1)-vgrid_zl(2) - ! Computing altitude index for precip flags calculation (one layer above surfelev layer) - cloudsat_preclvl_index(:) = cloudsat_preclvl - floor( cospstateIN%surfelev(:)/zstep ) - - ! For near-surface diagnostics, we only need the frozen fraction at one layer. - do i=1,nPoints - cospIN%fracPrecipIce(i,:) = fracPrecipIce_statGrid(i,:,cloudsat_preclvl_index(i)) - enddo - deallocate(cloudsat_preclvl_index) - deallocate(fracPrecipIce_statGrid) - endif - - endif - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! MODIS optics - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (Lmodis) then - allocate(MODIS_cloudWater(nPoints,nColumns,nLevels), & - MODIS_cloudIce(nPoints,nColumns,nLevels), & - MODIS_waterSize(nPoints,nColumns,nLevels), & - MODIS_iceSize(nPoints,nColumns,nLevels), & - MODIS_opticalThicknessLiq(nPoints,nColumns,nLevels), & - MODIS_opticalThicknessIce(nPoints,nColumns,nLevels)) - ! Cloud water - call cosp_simulator_optics(nPoints,nColumns,nLevels,cospIN%frac_out, & - mr_hydro(:,:,:,I_CVCLIQ),mr_hydro(:,:,:,I_LSCLIQ),MODIS_cloudWater) - ! Cloud ice - call cosp_simulator_optics(nPoints,nColumns,nLevels,cospIN%frac_out, & - mr_hydro(:,:,:,I_CVCICE),mr_hydro(:,:,:,I_LSCICE),MODIS_cloudIce) - ! Water droplet size - call cosp_simulator_optics(nPoints,nColumns,nLevels,cospIN%frac_out, & - Reff(:,:,:,I_CVCLIQ),Reff(:,:,:,I_LSCLIQ),MODIS_waterSize) - ! Ice crystal size - call cosp_simulator_optics(nPoints,nColumns,nLevels,cospIN%frac_out, & - Reff(:,:,:,I_CVCICE),Reff(:,:,:,I_LSCICE),MODIS_iceSize) - - ! Partition optical thickness into liquid and ice parts - call modis_optics_partition(nPoints, nLevels, nColumns, MODIS_cloudWater, & - MODIS_cloudIce, MODIS_waterSize, MODIS_iceSize, cospIN%tau_067, & - MODIS_opticalThicknessLiq, MODIS_opticalThicknessIce) - - ! Compute assymetry parameter and single scattering albedo - call modis_optics(nPoints, nLevels, nColumns, MODIS_opticalThicknessLiq, & - MODIS_waterSize*1.0e6_wp, MODIS_opticalThicknessIce, & - MODIS_iceSize*1.0e6_wp, cospIN%fracLiq, cospIN%asym, cospIN%ss_alb) - - ! Deallocate memory - deallocate(MODIS_cloudWater,MODIS_cloudIce,MODIS_WaterSize,MODIS_iceSize, & - MODIS_opticalThicknessLiq,MODIS_opticalThicknessIce,mr_hydro, & - Np,Reff) - endif - end subroutine subsample_and_optics - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE construct_cospIN - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - subroutine construct_cospIN(npoints,ncolumns,nlevels,ninst_rttov,y,emis_grey) - ! Inputs - integer,intent(in) :: & - npoints, & ! Number of horizontal gridpoints - ncolumns, & ! Number of subcolumns - nlevels, & ! Number of vertical levels - ninst_rttov ! Number of RTTOV instruments - ! Outputs - type(cosp_optical_inputs),intent(out) :: y - ! Optional input - real(kind=wp),intent(in),target, optional :: & - emis_grey - - ! Dimensions - y%Npoints = Npoints - y%Ncolumns = Ncolumns - y%Nlevels = Nlevels - y%Ninst_rttov = Ninst_rttov - y%Npart = 4 - y%Nrefl = PARASOL_NREFL - allocate(y%frac_out(npoints, ncolumns,nlevels)) - - if (present(emis_grey)) y%emis_grey => emis_grey - - if (Lmodis .or. Lmisr .or. Lisccp) then - allocate(y%tau_067(npoints, ncolumns,nlevels),& - y%emiss_11(npoints, ncolumns,nlevels)) - endif - if (Lcalipso) then - allocate(y%betatot_calipso(npoints, ncolumns,nlevels),& - y%betatot_ice_calipso(npoints, ncolumns,nlevels),& - y%betatot_liq_calipso(npoints, ncolumns,nlevels),& - y%tautot_calipso(npoints, ncolumns,nlevels),& - y%tautot_ice_calipso(npoints, ncolumns,nlevels),& - y%tautot_liq_calipso(npoints, ncolumns,nlevels),& - y%beta_mol_calipso(npoints, nlevels),& - y%tau_mol_calipso(npoints, nlevels),& - y%tautot_S_ice(npoints, ncolumns ),& - y%tautot_S_liq(npoints, ncolumns )) - endif - - if (LgrLidar532) then - allocate(y%beta_mol_grLidar532(npoints, nlevels),& - y%betatot_grLidar532(npoints, ncolumns,nlevels),& - y%tau_mol_grLidar532(npoints, nlevels),& - y%tautot_grLidar532(npoints, ncolumns,nlevels)) - endif - - if (Latlid) then - allocate(y%beta_mol_atlid(npoints, nlevels),& - y%betatot_atlid(npoints, ncolumns,nlevels),& - y%tau_mol_atlid(npoints, nlevels),& - y%tautot_atlid(npoints, ncolumns,nlevels)) - endif - - if (Lcloudsat) then - allocate(y%z_vol_cloudsat(npoints, ncolumns,nlevels),& - y%kr_vol_cloudsat(npoints, ncolumns,nlevels),& - y%g_vol_cloudsat(npoints, ncolumns,nlevels),& - y%fracPrecipIce(npoints, ncolumns)) - - ! added by DPLRW - allocate(y%vfall(npoints, ncolumns, nlevels, N_HYDRO), & - y%vfsqu(npoints, ncolumns, nlevels, N_HYDRO), & - y%zehyd(npoints, ncolumns, nlevels, N_HYDRO), & - y%krhyd(npoints, ncolumns, nlevels, N_HYDRO) ) - allocate(y%vtrm3(npoints, ncolumns, nlevels, N_HYDRO), & - y%vtrm0(npoints, ncolumns, nlevels, N_HYDRO), & - y%mmnt3(npoints, ncolumns, nlevels, N_HYDRO), & - y%mmnt0(npoints, ncolumns, nlevels, N_HYDRO) ) - - endif - if (Lmodis) then - allocate(y%fracLiq(npoints, ncolumns,nlevels),& - y%asym(npoints, ncolumns,nlevels),& - y%ss_alb(npoints, ncolumns,nlevels)) - endif - - end subroutine construct_cospIN - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE construct_cospstateIN - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - subroutine construct_cospstateIN(npoints,nlevels,y) - ! Inputs - integer,intent(in) :: & - npoints, & ! Number of horizontal gridpoints - nlevels ! Number of vertical levels - - ! Outputs - type(cosp_column_inputs),intent(out) :: y - - allocate(y%sunlit(npoints),y%skt(npoints),y%land(npoints),y%at(npoints,nlevels), & - y%psfc(npoints), & - y%pfull(npoints,nlevels),y%phalf(npoints,nlevels+1),y%qv(npoints,nlevels), & - y%o3(npoints,nlevels),y%hgt_matrix(npoints,nlevels),y%u_sfc(npoints), & - y%v_sfc(npoints),y%lat(npoints),y%lon(nPoints),y%rttov_sfcmask(nPoints), & - y%co(npoints,nlevels),y%n2o(npoints,nlevels),y%ch4(npoints,nlevels), & - y%co2(npoints,nlevels), y%so2(npoints,nlevels), & - y%cloudIce(nPoints,nLevels),y%cloudLiq(nPoints,nLevels),y%surfelev(nPoints),& - y%DeffLiq(nPoints,nLevels),y%DeffIce(nPoints,nLevels), & - y%fl_snow(nPoints,nLevels),y%fl_rain(nPoints,nLevels), & - y%tca(nPoints,nLevels),y%hgt_matrix_half(nPoints,nlevels), & - y%rttov_date(nPoints,3),y%rttov_time(nPoints,3),y%sza(nPoints)) - - ! added by DPLRW - allocate(y%gwvel(npoints,nlevels),y%gcumf(npoints,nlevels)) - - end subroutine construct_cospstateIN - - ! ###################################################################################### - ! SUBROUTINE construct_cosp_outputs - ! - ! This subroutine allocates output fields based on input logical flag switches. - ! ###################################################################################### - subroutine construct_cosp_outputs(Lpctisccp,Lclisccp,& - Lboxptopisccp,Lboxtauisccp,Ltauisccp,Lcltisccp, & - Lmeantbisccp,Lmeantbclrisccp,Lalbisccp,LclMISR, & - Lcltmodis,Lclwmodis,Lclimodis,Lclhmodis,Lclmmodis, & - Lcllmodis,Ltautmodis,Ltauwmodis,Ltauimodis, & - Ltautlogmodis,Ltauwlogmodis,Ltauilogmodis, & - Lreffclwmodis,Lreffclimodis,Lpctmodis,Llwpmodis, & - Liwpmodis,Lclmodis,Latb532,Latb532gr,Latb355, & - LlidarBetaMol532,LlidarBetaMol532gr,LlidarBetaMol355,& - LcfadLidarsr532,LcfadLidarsr532gr,LcfadLidarsr355, & - Lclcalipso2,Lclcalipso,LclgrLidar532,Lclatlid, & - Lclhcalipso,Lcllcalipso,Lclmcalipso,Lcltcalipso, & - LclhgrLidar532,LcllgrLidar532,LclmgrLidar532, & - LcltgrLidar532,Lclhatlid,Lcllatlid,Lclmatlid, & - Lcltatlid,Lcltlidarradar,Lcloudsat_tcc, & - Lcloudsat_tcc2,Lclcalipsoliq, & - Lclcalipsoice,Lclcalipsoun,Lclcalipsotmp, & - Lclcalipsotmpliq,Lclcalipsotmpice,Lclcalipsotmpun, & - Lcltcalipsoliq,Lcltcalipsoice,Lcltcalipsoun, & - Lclhcalipsoliq,Lclhcalipsoice,Lclhcalipsoun, & - Lclmcalipsoliq,Lclmcalipsoice,Lclmcalipsoun, & - Lcllcalipsoliq,Lcllcalipsoice,Lcllcalipsoun, & - Lclopaquecalipso,Lclthincalipso,Lclzopaquecalipso, & - Lclcalipsoopaque,Lclcalipsothin,Lclcalipsozopaque, & - Lclcalipsoopacity,Lclopaquetemp,Lclthintemp, & - Lclzopaquetemp,Lclopaquemeanz,Lclthinmeanz, & - Lclthinemis,Lclopaquemeanzse,Lclthinmeanzse, & - Lclzopaquecalipsose,LcfadDbze94,Ldbze94,Lparasolrefl,& - Lptradarflag0,Lptradarflag1,Lptradarflag2, & - Lptradarflag3,Lptradarflag4,Lptradarflag5, & - Lptradarflag6,Lptradarflag7,Lptradarflag8, & - Lptradarflag9,Lradarpia,Lwr_occfreq,Lcfodd, & - Ninst_rttov,rttov_configs, Ldplrw, & - Npoints,Ncolumns,Nlevels,Nlvgrid,use_vgrid,x) - ! Inputs - logical,intent(in) :: & - Lpctisccp, & ! ISCCP mean cloud top pressure - Lclisccp, & ! ISCCP cloud area fraction - Lboxptopisccp, & ! ISCCP CTP in each column - Lboxtauisccp, & ! ISCCP optical epth in each column - Ltauisccp, & ! ISCCP mean optical depth - Lcltisccp, & ! ISCCP total cloud fraction - Lmeantbisccp, & ! ISCCP mean all-sky 10.5micron brightness temperature - Lmeantbclrisccp, & ! ISCCP mean clear-sky 10.5micron brightness temperature - Lalbisccp, & ! ISCCP mean cloud albedo - LclMISR, & ! MISR cloud fraction - Lcltmodis, & ! MODIS total cloud fraction - Lclwmodis, & ! MODIS liquid cloud fraction - Lclimodis, & ! MODIS ice cloud fraction - Lclhmodis, & ! MODIS high-level cloud fraction - Lclmmodis, & ! MODIS mid-level cloud fraction - Lcllmodis, & ! MODIS low-level cloud fraction - Ltautmodis, & ! MODIS total cloud optical thicknes - Ltauwmodis, & ! MODIS liquid optical thickness - Ltauimodis, & ! MODIS ice optical thickness - Ltautlogmodis, & ! MODIS total cloud optical thickness (log10 mean) - Ltauwlogmodis, & ! MODIS liquid optical thickness (log10 mean) - Ltauilogmodis, & ! MODIS ice optical thickness (log10 mean) - Lreffclwmodis, & ! MODIS liquid cloud particle size - Lreffclimodis, & ! MODIS ice particle size - Lpctmodis, & ! MODIS cloud top pressure - Llwpmodis, & ! MODIS cloud liquid water path - Liwpmodis, & ! MODIS cloud ice water path - Lclmodis, & ! MODIS cloud area fraction - Latb532, & ! CALIPSO attenuated total backscatter (532nm) - Latb532gr, & ! GROUND LIDAR @ 532NM attenuated total backscatter (532nm) - Latb355, & ! ATLID attenuated total backscatter (355nm) - LlidarBetaMol532, & ! CALIPSO molecular backscatter (532nm) - LlidarBetaMol532gr,&! GROUND LIDAR @ 532NM molecular backscatter (532nm) - LlidarBetaMol355, & ! ATLID molecular backscatter (355nm) - LcfadLidarsr532, & ! CALIPSO scattering ratio CFAD - LcfadLidarsr532gr,& ! GROUND LIDAR @ 532NM scattering ratio CFAD - LcfadLidarsr355, & ! ATLID scattering ratio CFAD - Lclcalipso2, & ! CALIPSO cloud fraction undetected by cloudsat - Lclcalipso, & ! CALIPSO cloud area fraction - LclgrLidar532, & ! GROUND LIDAR @ 532NM cloud area fraction - Lclatlid, & ! ATLID cloud area fraction - Lclhcalipso, & ! CALIPSO high-level cloud fraction - Lcllcalipso, & ! CALIPSO low-level cloud fraction - Lclmcalipso, & ! CALIPSO mid-level cloud fraction - Lcltcalipso, & ! CALIPSO total cloud fraction - LclhgrLidar532, & ! GROUND LIDAR @ 532NM high-level cloud fraction - LcllgrLidar532, & ! GROUND LIDAR @ 532NM low-level cloud fraction - LclmgrLidar532, & ! GROUND LIDAR @ 532NM mid-level cloud fraction - LcltgrLidar532, & ! GROUND LIDAR @ 532NM total cloud fraction - Lclhatlid, & ! ATLID high-level cloud fraction - Lcllatlid, & ! ATLID low-level cloud fraction - Lclmatlid, & ! ATLID mid-level cloud fraction - Lcltatlid, & ! ATLID total cloud fraction - Lcltlidarradar, & ! CALIPSO-CLOUDSAT total cloud fraction - Lcloudsat_tcc, & ! - Lcloudsat_tcc2, & ! - Lclcalipsoliq, & ! CALIPSO liquid cloud area fraction - Lclcalipsoice, & ! CALIPSO ice cloud area fraction - Lclcalipsoun, & ! CALIPSO undetected cloud area fraction - Lclcalipsotmp, & ! CALIPSO undetected cloud area fraction - Lclcalipsotmpliq, & ! CALIPSO liquid cloud area fraction - Lclcalipsotmpice, & ! CALIPSO ice cloud area fraction - Lclcalipsotmpun, & ! CALIPSO undetected cloud area fraction - Lcltcalipsoliq, & ! CALIPSO liquid total cloud fraction - Lcltcalipsoice, & ! CALIPSO ice total cloud fraction - Lcltcalipsoun, & ! CALIPSO undetected total cloud fraction - Lclhcalipsoliq, & ! CALIPSO high-level liquid cloud fraction - Lclhcalipsoice, & ! CALIPSO high-level ice cloud fraction - Lclhcalipsoun, & ! CALIPSO high-level undetected cloud fraction - Lclmcalipsoliq, & ! CALIPSO mid-level liquid cloud fraction - Lclmcalipsoice, & ! CALIPSO mid-level ice cloud fraction - Lclmcalipsoun, & ! CALIPSO mid-level undetected cloud fraction - Lcllcalipsoliq, & ! CALIPSO low-level liquid cloud fraction - Lcllcalipsoice, & ! CALIPSO low-level ice cloud fraction - Lcllcalipsoun, & ! CALIPSO low-level undetected cloud fraction - Lclopaquecalipso, & ! CALIPSO opaque cloud cover (2D Map) - Lclthincalipso, & ! CALIPSO thin cloud cover (2D Map) - Lclzopaquecalipso,& ! CALIPSO z_opaque altitude (opaque clouds only, 2D Map) - Lclcalipsoopaque, & ! CALIPSO opaque cloud profiles 3D fraction - Lclcalipsothin, & ! CALIPSO thin cloud profiles 3D fraction - Lclcalipsozopaque,& ! CALIPSO z_opaque 3D fraction - Lclcalipsoopacity,& ! CALIPSO opacity 3D fraction - Lclopaquetemp, & ! CALIPSO opaque cloud temperature - Lclthintemp, & ! CALIPSO thin cloud temperature - Lclzopaquetemp, & ! CALIPSO z_opaque temperature - Lclopaquemeanz, & ! CALIPSO opaque cloud altitude - Lclthinmeanz, & ! CALIPSO thin cloud altitude - Lclthinemis, & ! CALIPSO thin cloud emissivity - Lclopaquemeanzse, & ! CALIPSO opaque cloud altitude with respect to SE - Lclthinmeanzse, & ! CALIPSO thin cloud altitude with respect to SE - Lclzopaquecalipsose,& ! CALIPSO z_opaque altitude with respect to SE - LcfadDbze94, & ! CLOUDSAT radar reflectivity CFAD - Ldbze94, & ! CLOUDSAT radar reflectivity - LparasolRefl, & ! PARASOL reflectance - Lptradarflag0, & ! CLOUDSAT - Lptradarflag1, & ! CLOUDSAT - Lptradarflag2, & ! CLOUDSAT - Lptradarflag3, & ! CLOUDSAT - Lptradarflag4, & ! CLOUDSAT - Lptradarflag5, & ! CLOUDSAT - Lptradarflag6, & ! CLOUDSAT - Lptradarflag7, & ! CLOUDSAT - Lptradarflag8, & ! CLOUDSAT - Lptradarflag9, & ! CLOUDSAT - Lradarpia, & ! CLOUDSAT - Lwr_occfreq, & ! CloudSat+MODIS joint diagnostics - Lcfodd, & ! CloudSat+MODIS joint diagnostics - Ldplrw, & ! Doppler capability of radar (CloudSat) - use_vgrid - - integer,intent(in) :: & - Npoints, & ! Number of sampled points - Ncolumns, & ! Number of subgrid columns - Nlevels, & ! Number of model levels - Nlvgrid, & ! Number of levels in L3 stats computation - Ninst_rttov - - type(rttov_cfg), dimension(:),intent(in) :: & - rttov_configs - - ! Outputs - type(cosp_outputs),intent(out) :: & - x ! COSP output structure - - integer :: & - i - - ! ISCCP simulator outputs - if (Lboxtauisccp) allocate(x%isccp_boxtau(Npoints,Ncolumns)) - if (Lboxptopisccp) allocate(x%isccp_boxptop(Npoints,Ncolumns)) - if (Lclisccp) allocate(x%isccp_fq(Npoints,numISCCPTauBins,numISCCPPresBins)) - if (Lcltisccp) allocate(x%isccp_totalcldarea(Npoints)) - if (Lpctisccp) allocate(x%isccp_meanptop(Npoints)) - if (Ltauisccp) allocate(x%isccp_meantaucld(Npoints)) - if (Lmeantbisccp) allocate(x%isccp_meantb(Npoints)) - if (Lmeantbclrisccp) allocate(x%isccp_meantbclr(Npoints)) - if (Lalbisccp) allocate(x%isccp_meanalbedocld(Npoints)) - - ! MISR simulator - if (LclMISR) then - allocate(x%misr_fq(Npoints,numMISRTauBins,numMISRHgtBins)) - ! *NOTE* These 3 fields are not output, but were part of the v1.4.0 cosp_misr, so - ! they are still computed. Should probably have a logical to control these - ! outputs. - allocate(x%misr_dist_model_layertops(Npoints,numMISRHgtBins)) - allocate(x%misr_meanztop(Npoints)) - allocate(x%misr_cldarea(Npoints)) - endif - - ! MODIS simulator - if (Lcltmodis) allocate(x%modis_Cloud_Fraction_Total_Mean(Npoints)) - if (Lclwmodis) allocate(x%modis_Cloud_Fraction_Water_Mean(Npoints)) - if (Lclimodis) allocate(x%modis_Cloud_Fraction_Ice_Mean(Npoints)) - if (Lclhmodis) allocate(x%modis_Cloud_Fraction_High_Mean(Npoints)) - if (Lclmmodis) allocate(x%modis_Cloud_Fraction_Mid_Mean(Npoints)) - if (Lcllmodis) allocate(x%modis_Cloud_Fraction_Low_Mean(Npoints)) - if (Ltautmodis) allocate(x%modis_Optical_Thickness_Total_Mean(Npoints)) - if (Ltauwmodis) allocate(x%modis_Optical_Thickness_Water_Mean(Npoints)) - if (Ltauimodis) allocate(x%modis_Optical_Thickness_Ice_Mean(Npoints)) - if (Ltautlogmodis) allocate(x%modis_Optical_Thickness_Total_LogMean(Npoints)) - if (Ltauwlogmodis) allocate(x%modis_Optical_Thickness_Water_LogMean(Npoints)) - if (Ltauilogmodis) allocate(x%modis_Optical_Thickness_Ice_LogMean(Npoints)) - if (Lreffclwmodis) allocate(x%modis_Cloud_Particle_Size_Water_Mean(Npoints)) - if (Lreffclimodis) allocate(x%modis_Cloud_Particle_Size_Ice_Mean(Npoints)) - if (Lpctmodis) allocate(x%modis_Cloud_Top_Pressure_Total_Mean(Npoints)) - if (Llwpmodis) allocate(x%modis_Liquid_Water_Path_Mean(Npoints)) - if (Liwpmodis) allocate(x%modis_Ice_Water_Path_Mean(Npoints)) - if (Lclmodis) then - allocate(x%modis_Optical_Thickness_vs_Cloud_Top_Pressure(nPoints,numModisTauBins,numMODISPresBins)) - allocate(x%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(nPoints,numModisTauBins,numMODISPresBins)) - allocate(x%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(nPoints,numModisTauBins,numMODISPresBins)) - allocate(x%modis_Optical_thickness_vs_ReffLIQ(nPoints,numMODISTauBins,numMODISReffLiqBins)) - allocate(x%modis_Optical_Thickness_vs_ReffICE(nPoints,numMODISTauBins,numMODISReffIceBins)) - endif - - ! LIDAR simulator - if (LlidarBetaMol532) allocate(x%calipso_beta_mol(Npoints,Nlevels)) - if (Latb532) allocate(x%calipso_beta_tot(Npoints,Ncolumns,Nlevels)) - if (LcfadLidarsr532) then - allocate(x%calipso_srbval(SR_BINS+1)) - allocate(x%calipso_cfad_sr(Npoints,SR_BINS,Nlvgrid)) - allocate(x%calipso_betaperp_tot(Npoints,Ncolumns,Nlevels)) - endif - if (Lclcalipso) allocate(x%calipso_lidarcld(Npoints,Nlvgrid)) - if (Lclhcalipso .or. Lclmcalipso .or. Lcllcalipso .or. Lcltcalipso) then - allocate(x%calipso_cldlayer(Npoints,LIDAR_NCAT)) - endif - if (Lclcalipsoice .or. Lclcalipsoliq .or. Lclcalipsoun) then - allocate(x%calipso_lidarcldphase(Npoints,Nlvgrid,6)) - endif - if (Lclcalipsotmp .or. Lclcalipsotmpliq .or. Lclcalipsoice .or. Lclcalipsotmpun .or. Lclcalipsotmpice) then - allocate(x%calipso_lidarcldtmp(Npoints,LIDAR_NTEMP,5)) - endif - if (Lcllcalipsoice .or. Lclmcalipsoice .or. Lclhcalipsoice .or. & - Lcltcalipsoice .or. Lcllcalipsoliq .or. Lclmcalipsoliq .or. & - Lclhcalipsoliq .or. Lcltcalipsoliq .or. Lcllcalipsoun .or. & - Lclmcalipsoun .or. Lclhcalipsoun .or. Lcltcalipsoun) then - allocate(x%calipso_cldlayerphase(Npoints,LIDAR_NCAT,6)) - endif - if (Lclopaquecalipso .or. Lclthincalipso .or. Lclzopaquecalipso) then - allocate(x%calipso_cldtype(Npoints,LIDAR_NTYPE)) - endif - if (Lclopaquetemp .or. Lclthintemp .or. Lclzopaquetemp) then - allocate(x%calipso_cldtypetemp(Npoints,LIDAR_NTYPE)) - endif - if (Lclopaquemeanz .or. Lclthinmeanz) then - allocate(x%calipso_cldtypemeanz(Npoints,2)) - endif - if (Lclopaquemeanzse .or. Lclthinmeanzse .or. Lclzopaquecalipsose) then - allocate(x%calipso_cldtypemeanzse(Npoints,3)) - endif - if (Lclthinemis) then - allocate(x%calipso_cldthinemis(Npoints)) - endif - if (Lclcalipsoopaque .or. Lclcalipsothin .or. Lclcalipsozopaque .or. Lclcalipsoopacity) then - allocate(x%calipso_lidarcldtype(Npoints,Nlvgrid,LIDAR_NTYPE+1)) - endif - - ! GROUND LIDAR @ 532NM simulator - if (LlidarBetaMol532gr) allocate(x%grLidar532_beta_mol(Npoints,Nlevels)) - if (Latb532gr) allocate(x%grLidar532_beta_tot(Npoints,Ncolumns,Nlevels)) - if (LcfadLidarsr532gr) then - allocate(x%grLidar532_srbval(SR_BINS+1)) - allocate(x%grLidar532_cfad_sr(Npoints,SR_BINS,Nlvgrid)) - endif - if (LclgrLidar532) allocate(x%grLidar532_lidarcld(Npoints,Nlvgrid)) - if (LclhgrLidar532 .or. LclmgrLidar532 .or. LcllgrLidar532 .or. LcltgrLidar532) then - allocate(x%grLidar532_cldlayer(Npoints,LIDAR_NCAT)) - endif - - ! ATLID simulator - if (LlidarBetaMol355) allocate(x%atlid_beta_mol(Npoints,Nlevels)) - if (Latb355) allocate(x%atlid_beta_tot(Npoints,Ncolumns,Nlevels)) - if (LcfadLidarsr355) then - allocate(x%atlid_srbval(SR_BINS+1)) - allocate(x%atlid_cfad_sr(Npoints,SR_BINS,Nlvgrid)) - endif - if (Lclatlid) allocate(x%atlid_lidarcld(Npoints,Nlvgrid)) - if (Lclhatlid .or. Lclmatlid .or. Lcllatlid .or. Lcltatlid) then - allocate(x%atlid_cldlayer(Npoints,LIDAR_NCAT)) - endif - - ! PARASOL - if (Lparasolrefl) then - allocate(x%parasolPix_refl(Npoints,Ncolumns,PARASOL_NREFL)) - allocate(x%parasolGrid_refl(Npoints,PARASOL_NREFL)) - endif - - ! Cloudsat simulator - if (Ldbze94) allocate(x%cloudsat_Ze_tot(Npoints,Ncolumns,Nlevels)) - if (LcfadDbze94) allocate(x%cloudsat_cfad_ze(Npoints,cloudsat_DBZE_BINS,Nlvgrid)) - if (Lptradarflag0 .or. Lptradarflag1 .or. Lptradarflag2 .or. Lptradarflag3 .or. & - Lptradarflag4 .or. Lptradarflag5 .or. Lptradarflag6 .or. Lptradarflag7 .or. & - Lptradarflag8 .or. Lptradarflag9) then - if (use_vgrid) then - allocate(x%cloudsat_precip_cover(Npoints,cloudsat_DBZE_BINS)) - else - print*,'WARNING: CLOUDSAT Precipitation occurrence diagnostics not available when use_vgrid=FALSE.' - print*,'WARNING: Turning CLOUDSAT Precipitation occurrence diagnostcs OFF' - endif - endif - if (Lradarpia) then - if (use_vgrid) then - allocate(x%cloudsat_pia(Npoints)) - else - print*,'WARNING: CLOUDSAT Precipitation occurrence diagnostics not available when use_vgrid=FALSE.' - print*,'WARNING: Turning CLOUDSAT Precipitation occurrence diagnostcs OFF' - endif - endif - - ! Combined CALIPSO/CLOUDSAT fields - if (Lclcalipso2) allocate(x%lidar_only_freq_cloud(Npoints,Nlvgrid)) - if (Lcltlidarradar) allocate(x%radar_lidar_tcc(Npoints)) - if (Lcloudsat_tcc) allocate(x%cloudsat_tcc(Npoints)) - if (Lcloudsat_tcc2) allocate(x%cloudsat_tcc2(Npoints)) - - ! Joint MODIS/CloudSat Statistics - if (Lwr_occfreq) allocate(x%wr_occfreq_ntotal(Npoints,WR_NREGIME)) - if (Lcfodd) allocate(x%cfodd_ntotal(Npoints,CFODD_NDBZE,CFODD_NICOD,CFODD_NCLASS)) - - ! RTTOV - Allocate output for multiple instruments - ! Do I not need to allocate the number of instruments? Because each rttov output DDT will be a pointer? - if (Lrttov) then - x % Ninst_rttov = Ninst_rttov - allocate(x % rttov_outputs(Ninst_rttov)) ! Need to allocate a pointer? - do i=1,Ninst_rttov - x % rttov_outputs(i) % nchan_out = rttov_configs(i) % nchan_out - if (rttov_configs(i) % Lrttov_pc) then ! Treat PC-RTTOV fields as clear-sky only for now - allocate(x % rttov_outputs(i) % channel_indices(rttov_configs(i) % nchan_out)) - if (rttov_configs(i) % Lrttov_bt) then ! Brightness temp - allocate(x % rttov_outputs(i) % bt_total_pc(Npoints,rttov_configs(i) % nchan_out)) - ! if (Lrttov_cld .or. Lrttov_aer) allocate(x%rttov_bt_clear(Npoints,Nchan)) - end if - if (rttov_configs(i) % Lrttov_rad) then ! Radiance - allocate(x % rttov_outputs(i) % rad_total_pc(Npoints,rttov_configs(i) % nchan_out)) - ! if (Lrttov_cld .or. Lrttov_aer) allocate(x%rttov_rad_clear(Npoints,Nchan)) - ! if (Lrttov_cld .or. Lrttov_aer) allocate(x%rttov_rad_cloudy(Npoints,Nchan)) - end if - else - allocate(x % rttov_outputs(i) % channel_indices(rttov_configs(i) % nchan_out)) - if (rttov_configs(i) % Lrttov_bt) then ! Brightness temp - allocate(x % rttov_outputs(i) % bt_total(Npoints,rttov_configs(i) % nchan_out)) - if ((rttov_configs(i) % Lrttov_cld) .or. (rttov_configs(i) % Lrttov_aer)) then - allocate(x % rttov_outputs(i) % bt_clear(Npoints,rttov_configs(i) % nchan_out)) - end if - end if - if (rttov_configs(i) % Lrttov_rad) then ! Radiance - allocate(x % rttov_outputs(i) % rad_total(Npoints,rttov_configs(i) % nchan_out)) - if ((rttov_configs(i) % Lrttov_cld) .or. (rttov_configs(i) % Lrttov_aer)) then - allocate(x % rttov_outputs(i) % rad_clear(Npoints,rttov_configs(i) % nchan_out)) - end if - if ((rttov_configs(i) % Lrttov_cld) .or. (rttov_configs(i) % Lrttov_aer)) then - allocate(x % rttov_outputs(i) % rad_cloudy(Npoints,rttov_configs(i) % nchan_out)) - end if - end if - if (rttov_configs(i) % Lrttov_refl) then ! Reflectance - allocate(x % rttov_outputs(i) % refl_total(Npoints,rttov_configs(i) % nchan_out)) - if ((rttov_configs(i) % Lrttov_cld) .or. (rttov_configs(i) % Lrttov_aer)) then - allocate(x % rttov_outputs(i) % refl_clear(Npoints,rttov_configs(i) % nchan_out)) - end if - end if - end if - end do - else - x % Ninst_rttov = 0 - end if - - ! Doppler capability of radar (CloudSat) - if (Ldplrw) then - allocate(x%dplrw_Z(Npoints, Nlvdplr, Nlvgrid, 0:2)) - allocate(x%spwid_Z(Npoints, Nlvspwd, Nlvgrid, 0:2)) - allocate(x%Zef94_Z(Npoints, NlvdBZe, Nlvgrid, 0:2)) - - allocate(x%dplrw_T(Npoints, Nlvdplr, Nlvtemp, 0:2)) - allocate(x%spwid_T(Npoints, Nlvspwd, Nlvtemp, 0:2)) - allocate(x%Zef94_T(Npoints, NlvdBZe, Nlvtemp, 0:2)) - - allocate(x%ZefVd_2(Npoints, Nlvdplr, NlvdBZe, 0:2)) - - allocate(x%gcumw(Npoints, Nlevels)) - - allocate(x%vfall_Z(Npoints, Nlvdplr, Nlvgrid, 0:2, 3)) - allocate(x%gridw_Z(Npoints, Nlvdplr, Nlvgrid, 0:2)) - allocate(x%vfall_T(Npoints, Nlvdplr, Nlvtemp, 0:2, 3)) - allocate(x%gridw_T(Npoints, Nlvdplr, Nlvtemp, 0:2)) - - allocate(x%ZefVf_2(Npoints, Nlvdplr, NlvdBZe, 0:2, 3)) - - end if - - end subroutine construct_cosp_outputs - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE destroy_cospIN - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - subroutine destroy_cospIN(y) - type(cosp_optical_inputs),intent(inout) :: y - - if (allocated(y%tau_067)) deallocate(y%tau_067) - if (allocated(y%emiss_11)) deallocate(y%emiss_11) - if (allocated(y%frac_out)) deallocate(y%frac_out) - if (allocated(y%beta_mol_calipso)) deallocate(y%beta_mol_calipso) - if (allocated(y%tau_mol_calipso)) deallocate(y%tau_mol_calipso) - if (allocated(y%betatot_calipso)) deallocate(y%betatot_calipso) - if (allocated(y%betatot_ice_calipso)) deallocate(y%betatot_ice_calipso) - if (allocated(y%betatot_liq_calipso)) deallocate(y%betatot_liq_calipso) - if (allocated(y%tautot_calipso)) deallocate(y%tautot_calipso) - if (allocated(y%tautot_ice_calipso)) deallocate(y%tautot_ice_calipso) - if (allocated(y%tautot_liq_calipso)) deallocate(y%tautot_liq_calipso) - if (allocated(y%tautot_S_liq)) deallocate(y%tautot_S_liq) - if (allocated(y%tautot_S_ice)) deallocate(y%tautot_S_ice) - if (allocated(y%z_vol_cloudsat)) deallocate(y%z_vol_cloudsat) - if (allocated(y%kr_vol_cloudsat)) deallocate(y%kr_vol_cloudsat) - if (allocated(y%g_vol_cloudsat)) deallocate(y%g_vol_cloudsat) - if (allocated(y%asym)) deallocate(y%asym) - if (allocated(y%ss_alb)) deallocate(y%ss_alb) - if (allocated(y%fracLiq)) deallocate(y%fracLiq) - if (allocated(y%beta_mol_grLidar532)) deallocate(y%beta_mol_grLidar532) - if (allocated(y%betatot_grLidar532)) deallocate(y%betatot_grLidar532) - if (allocated(y%tau_mol_grLidar532)) deallocate(y%tau_mol_grLidar532) - if (allocated(y%tautot_grLidar532)) deallocate(y%tautot_grLidar532) - if (allocated(y%beta_mol_atlid)) deallocate(y%beta_mol_atlid) - if (allocated(y%betatot_atlid)) deallocate(y%betatot_atlid) - if (allocated(y%tau_mol_atlid)) deallocate(y%tau_mol_atlid) - if (allocated(y%tautot_atlid)) deallocate(y%tautot_atlid) - if (allocated(y%fracPrecipIce)) deallocate(y%fracPrecipIce) - - !if (allocated(y%rcfg_cloudsat%N_scale_flag)) deallocate(y%rcfg_cloudsat%N_scale_flag) - !if (allocated(y%rcfg_cloudsat%Z_scale_flag)) deallocate(y%rcfg_cloudsat%Z_scale_flag) - !if (allocated(y%rcfg_cloudsat%Z_scale_added_flag)) deallocate(y%rcfg_cloudsat%Z_scale_added_flag) - !if (allocated(y%rcfg_cloudsat%Ze_scaled)) deallocate(y%rcfg_cloudsat%Ze_scaled) - !if (allocated(y%rcfg_cloudsat%Zr_scaled)) deallocate(y%rcfg_cloudsat%Zr_scaled) - !if (allocated(y%rcfg_cloudsat%kr_scaled)) deallocate(y%rcfg_cloudsat%kr_scaled) - !if (allocated(y%rcfg_cloudsat%fc)) deallocate(y%rcfg_cloudsat%fc) - !if (allocated(y%rcfg_cloudsat%rho_eff)) deallocate(y%rcfg_cloudsat%rho_eff) - !if (allocated(y%rcfg_cloudsat%base_list)) deallocate(y%rcfg_cloudsat%base_list) - !if (allocated(y%rcfg_cloudsat%step_list)) deallocate(y%rcfg_cloudsat%step_list) - if (allocated(y%vfall)) deallocate(y%vfall) - if (allocated(y%vfsqu)) deallocate(y%vfsqu) - if (allocated(y%zehyd)) deallocate(y%zehyd) - if (allocated(y%krhyd)) deallocate(y%krhyd) - if (allocated(y%vtrm3)) deallocate(y%vtrm3) - if (allocated(y%vtrm0)) deallocate(y%vtrm0) - if (allocated(y%mmnt3)) deallocate(y%mmnt3) - if (allocated(y%mmnt0)) deallocate(y%mmnt0) - - if (associated(y%cfg_rttov)) nullify(y%cfg_rttov) - - end subroutine destroy_cospIN - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE destroy_cospstateIN - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - subroutine destroy_cospstateIN(y) - type(cosp_column_inputs),intent(inout) :: y - - if (allocated(y%sunlit)) deallocate(y%sunlit) - if (allocated(y%skt)) deallocate(y%skt) - if (allocated(y%psfc)) deallocate(y%psfc) - if (allocated(y%land)) deallocate(y%land) - if (allocated(y%rttov_sfcmask)) deallocate(y%rttov_sfcmask) - if (allocated(y%at)) deallocate(y%at) - if (allocated(y%pfull)) deallocate(y%pfull) - if (allocated(y%phalf)) deallocate(y%phalf) - if (allocated(y%qv)) deallocate(y%qv) - if (allocated(y%hgt_matrix)) deallocate(y%hgt_matrix) - if (allocated(y%hgt_matrix_half)) deallocate(y%hgt_matrix_half) - if (allocated(y%surfelev)) deallocate(y%surfelev) - if (allocated(y%rttov_date)) deallocate(y%rttov_date) - if (allocated(y%rttov_time)) deallocate(y%rttov_time) - if (allocated(y%sza)) deallocate(y%sza) - if (allocated(y%co2)) deallocate(y%co2) - if (allocated(y%ch4)) deallocate(y%ch4) - if (allocated(y%n2o)) deallocate(y%n2o) - if (allocated(y%co)) deallocate(y%co) - if (allocated(y%o3)) deallocate(y%o3) - if (allocated(y%u_sfc)) deallocate(y%u_sfc) - if (allocated(y%v_sfc)) deallocate(y%v_sfc) - if (allocated(y%lat)) deallocate(y%lat) - if (allocated(y%lon)) deallocate(y%lon) - ! if (allocated(y%emis_in)) deallocate(y%emis_in) - ! if (allocated(y%refl_in)) deallocate(y%refl_in) - if (allocated(y%cloudIce)) deallocate(y%cloudIce) - if (allocated(y%cloudLiq)) deallocate(y%cloudLiq) - if (allocated(y%DeffLiq)) deallocate(y%DeffLiq) - if (allocated(y%DeffIce)) deallocate(y%DeffIce) - if (allocated(y%fl_rain)) deallocate(y%fl_rain) - if (allocated(y%fl_snow)) deallocate(y%fl_snow) - if (allocated(y%tca)) deallocate(y%tca) - - if (allocated(y%gwvel)) deallocate(y%gwvel) - if (allocated(y%gcumf)) deallocate(y%gcumf) - - end subroutine destroy_cospstateIN - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE destroy_cosp_outputs - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - subroutine destroy_cosp_outputs(y) - type(cosp_outputs),intent(inout) :: y - integer :: i ! Local iterator for RTTOV instruments - - ! Deallocate and nullify - if (associated(y%calipso_beta_mol)) then - deallocate(y%calipso_beta_mol) - nullify(y%calipso_beta_mol) - endif - if (associated(y%calipso_betaperp_tot)) then - deallocate(y%calipso_betaperp_tot) - nullify(y%calipso_betaperp_tot) - endif - if (associated(y%calipso_beta_tot)) then - deallocate(y%calipso_beta_tot) - nullify(y%calipso_beta_tot) - endif - if (associated(y%calipso_lidarcldphase)) then - deallocate(y%calipso_lidarcldphase) - nullify(y%calipso_lidarcldphase) - endif - if (associated(y%calipso_lidarcldtype)) then - deallocate(y%calipso_lidarcldtype) - nullify(y%calipso_lidarcldtype) - endif - if (associated(y%calipso_cldlayerphase)) then - deallocate(y%calipso_cldlayerphase) - nullify(y%calipso_cldlayerphase) - endif - if (associated(y%calipso_lidarcldtmp)) then - deallocate(y%calipso_lidarcldtmp) - nullify(y%calipso_lidarcldtmp) - endif - if (associated(y%calipso_cldlayer)) then - deallocate(y%calipso_cldlayer) - nullify(y%calipso_cldlayer) - endif - if (associated(y%calipso_cldtype)) then - deallocate(y%calipso_cldtype) - nullify(y%calipso_cldtype) - endif - if (associated(y%calipso_cldtypetemp)) then - deallocate(y%calipso_cldtypetemp) - nullify(y%calipso_cldtypetemp) - endif - if (associated(y%calipso_cldtypemeanz)) then - deallocate(y%calipso_cldtypemeanz) - nullify(y%calipso_cldtypemeanz) - endif - if (associated(y%calipso_cldtypemeanzse)) then - deallocate(y%calipso_cldtypemeanzse) - nullify(y%calipso_cldtypemeanzse) - endif - if (associated(y%calipso_cldthinemis)) then - deallocate(y%calipso_cldthinemis) - nullify(y%calipso_cldthinemis) - endif - if (associated(y%calipso_lidarcld)) then - deallocate(y%calipso_lidarcld) - nullify(y%calipso_lidarcld) - endif - if (associated(y%calipso_srbval)) then - deallocate(y%calipso_srbval) - nullify(y%calipso_srbval) - endif - if (associated(y%calipso_cfad_sr)) then - deallocate(y%calipso_cfad_sr) - nullify(y%calipso_cfad_sr) - endif - if (associated(y%grLidar532_beta_mol)) then - deallocate(y%grLidar532_beta_mol) - nullify(y%grLidar532_beta_mol) - endif - if (associated(y%grLidar532_beta_tot)) then - deallocate(y%grLidar532_beta_tot) - nullify(y%grLidar532_beta_tot) - endif - if (associated(y%grLidar532_cldlayer)) then - deallocate(y%grLidar532_cldlayer) - nullify(y%grLidar532_cldlayer) - endif - if (associated(y%grLidar532_lidarcld)) then - deallocate(y%grLidar532_lidarcld) - nullify(y%grLidar532_lidarcld) - endif - if (associated(y%grLidar532_cfad_sr)) then - deallocate(y%grLidar532_cfad_sr) - nullify(y%grLidar532_cfad_sr) - endif - if (associated(y%grLidar532_srbval)) then - deallocate(y%grLidar532_srbval) - nullify(y%grLidar532_srbval) - endif - if (associated(y%atlid_beta_mol)) then - deallocate(y%atlid_beta_mol) - nullify(y%atlid_beta_mol) - endif - if (associated(y%atlid_beta_tot)) then - deallocate(y%atlid_beta_tot) - nullify(y%atlid_beta_tot) - endif - if (associated(y%atlid_cldlayer)) then - deallocate(y%atlid_cldlayer) - nullify(y%atlid_cldlayer) - endif - if (associated(y%atlid_lidarcld)) then - deallocate(y%atlid_lidarcld) - nullify(y%atlid_lidarcld) - endif - if (associated(y%atlid_cfad_sr)) then - deallocate(y%atlid_cfad_sr) - nullify(y%atlid_cfad_sr) - endif - if (associated(y%atlid_srbval)) then - deallocate(y%atlid_srbval) - nullify(y%atlid_srbval) - endif - if (associated(y%parasolPix_refl)) then - deallocate(y%parasolPix_refl) - nullify(y%parasolPix_refl) - endif - if (associated(y%parasolGrid_refl)) then - deallocate(y%parasolGrid_refl) - nullify(y%parasolGrid_refl) - endif - if (associated(y%cloudsat_Ze_tot)) then - deallocate(y%cloudsat_Ze_tot) - nullify(y%cloudsat_Ze_tot) - endif - if (associated(y%cloudsat_cfad_ze)) then - deallocate(y%cloudsat_cfad_ze) - nullify(y%cloudsat_cfad_ze) - endif - if (associated(y%cloudsat_precip_cover)) then - deallocate(y%cloudsat_precip_cover) - nullify(y%cloudsat_precip_cover) - endif - if (associated(y%cloudsat_pia)) then - deallocate(y%cloudsat_pia) - nullify(y%cloudsat_pia) - endif - if (associated(y%cloudsat_tcc)) then - deallocate(y%cloudsat_tcc) - nullify(y%cloudsat_tcc) - endif - if (associated(y%cloudsat_tcc2)) then - deallocate(y%cloudsat_tcc2) - nullify(y%cloudsat_tcc2) - endif - if (associated(y%radar_lidar_tcc)) then - deallocate(y%radar_lidar_tcc) - nullify(y%radar_lidar_tcc) - endif - if (associated(y%cloudsat_tcc)) then - deallocate(y%cloudsat_tcc) - nullify(y%cloudsat_tcc) - endif - if (associated(y%cloudsat_tcc2)) then - deallocate(y%cloudsat_tcc2) - nullify(y%cloudsat_tcc2) - endif - if (associated(y%lidar_only_freq_cloud)) then - deallocate(y%lidar_only_freq_cloud) - nullify(y%lidar_only_freq_cloud) - endif - if (associated(y%isccp_totalcldarea)) then - deallocate(y%isccp_totalcldarea) - nullify(y%isccp_totalcldarea) - endif - if (associated(y%isccp_meantb)) then - deallocate(y%isccp_meantb) - nullify(y%isccp_meantb) - endif - if (associated(y%isccp_meantbclr)) then - deallocate(y%isccp_meantbclr) - nullify(y%isccp_meantbclr) - endif - if (associated(y%isccp_meanptop)) then - deallocate(y%isccp_meanptop) - nullify(y%isccp_meanptop) - endif - if (associated(y%isccp_meantaucld)) then - deallocate(y%isccp_meantaucld) - nullify(y%isccp_meantaucld) - endif - if (associated(y%isccp_meanalbedocld)) then - deallocate(y%isccp_meanalbedocld) - nullify(y%isccp_meanalbedocld) - endif - if (associated(y%isccp_boxtau)) then - deallocate(y%isccp_boxtau) - nullify(y%isccp_boxtau) - endif - if (associated(y%isccp_boxptop)) then - deallocate(y%isccp_boxptop) - nullify(y%isccp_boxptop) - endif - if (associated(y%isccp_fq)) then - deallocate(y%isccp_fq) - nullify(y%isccp_fq) - endif - if (associated(y%misr_fq)) then - deallocate(y%misr_fq) - nullify(y%misr_fq) - endif - if (associated(y%misr_dist_model_layertops)) then - deallocate(y%misr_dist_model_layertops) - nullify(y%misr_dist_model_layertops) - endif - if (associated(y%misr_meanztop)) then - deallocate(y%misr_meanztop) - nullify(y%misr_meanztop) - endif - if (associated(y%misr_cldarea)) then - deallocate(y%misr_cldarea) - nullify(y%misr_cldarea) - endif - if (associated(y%modis_Cloud_Fraction_Total_Mean)) then - deallocate(y%modis_Cloud_Fraction_Total_Mean) - nullify(y%modis_Cloud_Fraction_Total_Mean) - endif - if (associated(y%modis_Cloud_Fraction_Ice_Mean)) then - deallocate(y%modis_Cloud_Fraction_Ice_Mean) - nullify(y%modis_Cloud_Fraction_Ice_Mean) - endif - if (associated(y%modis_Cloud_Fraction_Water_Mean)) then - deallocate(y%modis_Cloud_Fraction_Water_Mean) - nullify(y%modis_Cloud_Fraction_Water_Mean) - endif - if (associated(y%modis_Cloud_Fraction_High_Mean)) then - deallocate(y%modis_Cloud_Fraction_High_Mean) - nullify(y%modis_Cloud_Fraction_High_Mean) - endif - if (associated(y%modis_Cloud_Fraction_Mid_Mean)) then - deallocate(y%modis_Cloud_Fraction_Mid_Mean) - nullify(y%modis_Cloud_Fraction_Mid_Mean) - endif - if (associated(y%modis_Cloud_Fraction_Low_Mean)) then - deallocate(y%modis_Cloud_Fraction_Low_Mean) - nullify(y%modis_Cloud_Fraction_Low_Mean) - endif - if (associated(y%modis_Optical_Thickness_Total_Mean)) then - deallocate(y%modis_Optical_Thickness_Total_Mean) - nullify(y%modis_Optical_Thickness_Total_Mean) - endif - if (associated(y%modis_Optical_Thickness_Water_Mean)) then - deallocate(y%modis_Optical_Thickness_Water_Mean) - nullify(y%modis_Optical_Thickness_Water_Mean) - endif - if (associated(y%modis_Optical_Thickness_Ice_Mean)) then - deallocate(y%modis_Optical_Thickness_Ice_Mean) - nullify(y%modis_Optical_Thickness_Ice_Mean) - endif - if (associated(y%modis_Optical_Thickness_Total_LogMean)) then - deallocate(y%modis_Optical_Thickness_Total_LogMean) - nullify(y%modis_Optical_Thickness_Total_LogMean) - endif - if (associated(y%modis_Optical_Thickness_Water_LogMean)) then - deallocate(y%modis_Optical_Thickness_Water_LogMean) - nullify(y%modis_Optical_Thickness_Water_LogMean) - endif - if (associated(y%modis_Optical_Thickness_Ice_LogMean)) then - deallocate(y%modis_Optical_Thickness_Ice_LogMean) - nullify(y%modis_Optical_Thickness_Ice_LogMean) - endif - if (associated(y%modis_Cloud_Particle_Size_Water_Mean)) then - deallocate(y%modis_Cloud_Particle_Size_Water_Mean) - nullify(y%modis_Cloud_Particle_Size_Water_Mean) - endif - if (associated(y%modis_Cloud_Particle_Size_Ice_Mean)) then - deallocate(y%modis_Cloud_Particle_Size_Ice_Mean) - nullify(y%modis_Cloud_Particle_Size_Ice_Mean) - endif - if (associated(y%modis_Cloud_Top_Pressure_Total_Mean)) then - deallocate(y%modis_Cloud_Top_Pressure_Total_Mean) - nullify(y%modis_Cloud_Top_Pressure_Total_Mean) - endif - if (associated(y%modis_Liquid_Water_Path_Mean)) then - deallocate(y%modis_Liquid_Water_Path_Mean) - nullify(y%modis_Liquid_Water_Path_Mean) - endif - if (associated(y%modis_Ice_Water_Path_Mean)) then - deallocate(y%modis_Ice_Water_Path_Mean) - nullify(y%modis_Ice_Water_Path_Mean) - endif - if (associated(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) then - deallocate(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure) - nullify(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure) - endif - if (associated(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) then - deallocate(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq) - nullify(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq) - endif - if (associated(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) then - deallocate(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice) - nullify(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice) - endif - if (associated(y%modis_Optical_thickness_vs_ReffLIQ)) then - deallocate(y%modis_Optical_thickness_vs_ReffLIQ) - nullify(y%modis_Optical_thickness_vs_ReffLIQ) - endif - if (associated(y%modis_Optical_thickness_vs_ReffICE)) then - deallocate(y%modis_Optical_thickness_vs_ReffICE) - nullify(y%modis_Optical_thickness_vs_ReffICE) - endif - if (associated(y%cfodd_ntotal)) then - deallocate(y%cfodd_ntotal) - nullify(y%cfodd_ntotal) - endif - if (associated(y%wr_occfreq_ntotal)) then - deallocate(y%wr_occfreq_ntotal) - nullify(y%wr_occfreq_ntotal) - endif - - ! added by DPLRW - if (associated(y%dplrw_Z)) then - deallocate(y%dplrw_Z) ; nullify(y%dplrw_Z) - end if - if (associated(y%spwid_Z)) then - deallocate(y%spwid_Z) ; nullify(y%spwid_Z) - end if - if (associated(y%Zef94_Z)) then - deallocate(y%Zef94_Z) ; nullify(y%Zef94_Z) - end if - - if (associated(y%dplrw_T)) then - deallocate(y%dplrw_T) ; nullify(y%dplrw_T) - end if - if (associated(y%spwid_T)) then - deallocate(y%spwid_T) ; nullify(y%spwid_T) - end if - if (associated(y%Zef94_T)) then - deallocate(y%Zef94_T) ; nullify(y%Zef94_T) - end if - - if (associated(y%ZefVd_2)) then - deallocate(y%ZefVd_2) ; nullify(y%ZefVd_2) - end if - - if (associated(y%gcumw)) then - deallocate(y%gcumw) ; nullify(y%gcumw) - end if - - if (associated(y%vfall_Z)) then - deallocate(y%vfall_Z) ; nullify(y%vfall_Z) - end if - if (associated(y%gridw_Z)) then - deallocate(y%gridw_Z) ; nullify(y%gridw_Z) - end if - - if (associated(y%vfall_T)) then - deallocate(y%vfall_T) ; nullify(y%vfall_T) - end if - if (associated(y%gridw_T)) then - deallocate(y%gridw_T) ; nullify(y%gridw_T) - end if - - if (associated(y%ZefVf_2)) then - deallocate(y%ZefVf_2) ; nullify(y%ZefVf_2) - end if - - ! RTTOV multi-instrument - if (allocated(y%rttov_outputs)) then - do i=1,y % Ninst_rttov ! Iterate over each instrument - if (associated(y%rttov_outputs(i)%channel_indices)) then - deallocate(y%rttov_outputs(i)%channel_indices) - nullify(y%rttov_outputs(i)%channel_indices) - endif - if (associated(y%rttov_outputs(i)%bt_total)) then - deallocate(y%rttov_outputs(i)%bt_total) - nullify(y%rttov_outputs(i)%bt_total) - endif - if (associated(y%rttov_outputs(i)%bt_clear)) then - deallocate(y%rttov_outputs(i)%bt_clear) - nullify(y%rttov_outputs(i)%bt_clear) - endif - if (associated(y%rttov_outputs(i)%rad_total)) then - deallocate(y%rttov_outputs(i)%rad_total) - nullify(y%rttov_outputs(i)%rad_total) - endif - if (associated(y%rttov_outputs(i)%rad_clear)) then - deallocate(y%rttov_outputs(i)%rad_clear) - nullify(y%rttov_outputs(i)%rad_clear) - endif - if (associated(y%rttov_outputs(i)%rad_cloudy)) then - deallocate(y%rttov_outputs(i)%rad_cloudy) - nullify(y%rttov_outputs(i)%rad_cloudy) - endif - if (associated(y%rttov_outputs(i)%refl_total)) then - deallocate(y%rttov_outputs(i)%refl_total) - nullify(y%rttov_outputs(i)%refl_total) - endif - if (associated(y%rttov_outputs(i)%refl_clear)) then - deallocate(y%rttov_outputs(i)%refl_clear) - nullify(y%rttov_outputs(i)%refl_clear) - endif - if (associated(y%rttov_outputs(i)%bt_total_pc)) then - deallocate(y%rttov_outputs(i)%bt_total_pc) - nullify(y%rttov_outputs(i)%bt_total_pc) - endif - if (associated(y%rttov_outputs(i)%rad_total_pc)) then - deallocate(y%rttov_outputs(i)%rad_total_pc) - nullify(y%rttov_outputs(i)%rad_total_pc) - endif - end do - deallocate(y%rttov_outputs) - end if - - end subroutine destroy_cosp_outputs - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE rttov_cleanup - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - subroutine rttov_cleanup(y) - use MOD_COSP_RTTOV_INTERFACE, only: DESTROY_RTTOV_CONFIG - - type(cosp_optical_inputs),intent(inout) :: y - integer :: i - - if (size(y%cfg_rttov) .gt. 0) then - do i=1,y%Ninst_rttov - call destroy_rttov_config(y%cfg_rttov(i)) - end do - end if - nullify(y%cfg_rttov) - - end subroutine rttov_cleanup - - end program cosp2_test diff --git a/dplrw_src/cosp_cloudsat_interface.F90 b/dplrw_src/cosp_cloudsat_interface.F90 deleted file mode 100644 index c4384c4cb0..0000000000 --- a/dplrw_src/cosp_cloudsat_interface.F90 +++ /dev/null @@ -1,234 +0,0 @@ -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -! Copyright (c) 2015, Regents of the University of Colorado -! All rights reserved. -! -! Redistribution and use in source and binary forms, with or without modification, are -! permitted provided that the following conditions are met: -! -! 1. Redistributions of source code must retain the above copyright notice, this list of -! conditions and the following disclaimer. -! -! 2. Redistributions in binary form must reproduce the above copyright notice, this list -! of conditions and the following disclaimer in the documentation and/or other -! materials provided with the distribution. -! -! 3. Neither the name of the copyright holder nor the names of its contributors may be -! used to endorse or promote products derived from this software without specific prior -! written permission. -! -! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL -! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT -! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -! -! History -! May 2015 - D. Swales - Original version -! Jun 2025 - J.K. Shaw - Added COSP-RTTOV integration and swathing -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -MODULE MOD_COSP_CLOUDSAT_INTERFACE - USE COSP_KINDS, ONLY: wp - USE quickbeam, ONLY: quickbeam_init,Re_MAX_BIN,Re_BIN_LENGTH, & - maxhclass, nRe_types, nd, mt_ntt - use mod_cosp_stats, ONLY: radar_cfg,compute_orbitmasks,cosp_optical_inputs,cosp_column_inputs - IMPLICIT NONE - - ! Directory where LUTs will be stored - character(len=120) :: RADAR_SIM_LUT_DIRECTORY = './' - logical :: RADAR_SIM_LOAD_scale_LUTs_flag = .false. - logical :: RADAR_SIM_UPDATE_scale_LUTs_flag = .false. - - ! Module variables - real(wp),dimension(:,:),target,allocatable :: & - temp_hgt_matrix - real(wp),dimension(:,:,:),target,allocatable :: & - temp_z_vol_cloudsat, & - temp_kr_vol_cloudsat, & - temp_g_vol_cloudsat - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! TYPE cloudsat_IN - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - type cloudsat_IN - integer :: & - Npoints ! Number of horizontal grid-points - integer,pointer :: & - Nlevels, & ! Number of vertical levels - Ncolumns ! Number of subcolumns - real(wp),pointer :: & - hgt_matrix(:,:), & ! Height of hydrometeors (km) - z_vol(:,:,:), & ! Effective reflectivity factor (mm^6/m^3) - kr_vol(:,:,:), & ! Attenuation coefficient hydro (dB/km) - g_vol(:,:,:), & ! Attenuation coefficient gases (dB/km) - g_to_vol_in(:,:) ! Gaseous atteunation, radar to vol (dB) - type(radar_cfg),pointer :: rcfg ! Radar simulator configuration - end type cloudsat_IN - -CONTAINS - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE cosp_cloudsat_in - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - SUBROUTINE COSP_CLOUDSAT_INIT(radar_freq,k2,use_gas_abs,do_ray,undef,nhydro, & - surface_radar,rcfg,cloudsat_micro_scheme,load_LUT) - ! INPUTS - real(wp),intent(in) :: & - radar_freq, & ! Radar frequency (GHz) - k2, & ! |K|^2, the dielectric constant - undef ! Undefined - integer,intent(in) :: & - use_gas_abs, & ! 1 = do gaseous abs calcs, 0=no gasesous absorbtion calculated, - ! 2 = calculate absorption for first profile on all profiles - do_ray, & ! - nhydro, & ! - surface_radar - logical,intent(in),optional :: & - load_LUT - character(len=64),intent(in) :: & - cloudsat_micro_scheme - - ! OUTPUTS - type(radar_cfg) :: & - rcfg ! - - ! LOCAL VARIABLES - character(len=240) :: LUT_file_name - logical :: local_load_LUT - integer :: j - - if (present(load_LUT)) then - local_load_LUT = load_LUT - else - local_load_LUT = RADAR_SIM_LOAD_scale_LUTs_flag - endif - - ! LUT file name - LUT_file_name = trim(RADAR_SIM_LUT_DIRECTORY) // & - trim(cloudsat_micro_scheme) - - ! Initialize for NEW radar-configurarion derived type (radar_cfg) - rcfg%freq = radar_freq - rcfg%k2 = k2 - rcfg%use_gas_abs = use_gas_abs - rcfg%do_ray = do_ray - rcfg%nhclass = nhydro - rcfg%load_scale_LUTs = local_load_LUT - rcfg%update_scale_LUTs = .false. - rcfg%scale_LUT_file_name = LUT_file_name - rcfg%N_scale_flag = .false. - rcfg%fc = undef - rcfg%rho_eff = undef - rcfg%Z_scale_flag = .false. - rcfg%Ze_scaled = 0._wp - rcfg%Zr_scaled = 0._wp - rcfg%kr_scaled = 0._wp - - ! Set up Re bin "structure" for z_scaling - rcfg%base_list(1)=0 - do j=1,Re_MAX_BIN - rcfg%step_list(j)=0.1_wp+0.1_wp*((j-1)**1.5_wp) - if(rcfg%step_list(j)>Re_BIN_LENGTH) then - rcfg%step_list(j)=Re_BIN_LENGTH - endif - if(j>1) then - rcfg%base_list(j)=rcfg%base_list(j-1)+floor(Re_BIN_LENGTH/rcfg%step_list(j-1)) - endif - enddo - - ! Set flag denoting position of radar - if (surface_radar == 1) then - rcfg%radar_at_layer_one = .false. - else - rcfg%radar_at_layer_one = .true. - endif - - END SUBROUTINE COSP_CLOUDSAT_INIT - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE COSP_ASSIGN_cloudsatIN - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - SUBROUTINE COSP_ASSIGN_cloudsatIN(cospIN, cospgridIN, Npoints, cloudsatIN, & - CSCAL_MASK_INDICES, CSCAL_SWATH_MASK) - type(cosp_optical_inputs),intent(in),target :: cospIN ! Optical inputs to COSP simulator - type(cosp_column_inputs), intent(in),target :: cospgridIN ! Host model inputs to COSP - integer,intent(in),target :: & - Npoints - type(cloudsat_IN),intent(inout) :: & - cloudsatIN - integer,dimension(:),allocatable,intent(out) :: & ! Array containing the indices of the swath masks, already allocated? - CSCAL_MASK_INDICES - logical,dimension(:),allocatable,intent(inout) :: & ! Mask of reals over all local times - CSCAL_SWATH_MASK - - ! Local variables - integer, target :: & - N_CLOUDSAT_SWATHED, & - i - - if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then - if (.not.allocated(CSCAL_SWATH_MASK)) allocate(CSCAL_SWATH_MASK(Npoints)) - ! Do swathing to figure out which cells to simulate on - call compute_orbitmasks(Npoints, & - cospIN % cospswathsIN(3) % N_inst_swaths, & - cospIN % cospswathsIN(3) % inst_localtimes, & - cospIN % cospswathsIN(3) % inst_localtime_widths, & - cospgridIN%lat, cospgridIN%lon, & - cospgridIN%rttov_date(:,2), cospgridIN%rttov_date(:,3), & ! Time fields: month, dayofmonth - cospgridIN%rttov_time(:,1), cospgridIN%rttov_time(:,2), & ! Time fields: hour, minute - CSCAL_SWATH_MASK,N_CLOUDSAT_SWATHED) ! Output: logical mask array - cloudsatIN%Npoints = N_CLOUDSAT_SWATHED - cloudsatIN%Ncolumns => cospIN%Ncolumns - if (.not. allocated(CSCAL_MASK_INDICES)) allocate(CSCAL_MASK_INDICES(cloudsatIN%Npoints)) - CSCAL_MASK_INDICES = pack((/ (i, i = 1, Npoints ) /),mask = CSCAL_SWATH_MASK) - if (cloudsatIN%Npoints .gt. 0) then - ! Allocate swathed arrays. - allocate(temp_z_vol_cloudsat(cloudsatIN%Npoints,cospIN%Ncolumns,cospIN%Nlevels), & - temp_kr_vol_cloudsat(cloudsatIN%Npoints,cospIN%Ncolumns,cospIN%Nlevels), & - temp_g_vol_cloudsat(cloudsatIN%Npoints,cospIN%Ncolumns,cospIN%Nlevels), & - temp_hgt_matrix(cloudsatIN%Npoints,cospIN%Nlevels)) - ! Encode step: Read only appropriate values into the new temp arrays. - temp_z_vol_cloudsat = cospIN%z_vol_cloudsat(int(CSCAL_MASK_INDICES),:,:) - temp_kr_vol_cloudsat = cospIN%kr_vol_cloudsat(int(CSCAL_MASK_INDICES),:,:) - temp_g_vol_cloudsat = cospIN%g_vol_cloudsat(int(CSCAL_MASK_INDICES),:,:) - temp_hgt_matrix = cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES),:) - ! Reassign swathed values. - cloudsatIN%Nlevels => cospIN%Nlevels - cloudsatIN%z_vol => temp_z_vol_cloudsat - cloudsatIN%kr_vol => temp_kr_vol_cloudsat - cloudsatIN%g_vol => temp_g_vol_cloudsat - cloudsatIN%rcfg => cospIN%rcfg_cloudsat - cloudsatIN%hgt_matrix => temp_hgt_matrix - end if - else - cloudsatIN%Npoints = Npoints - cloudsatIN%Ncolumns => cospIN%Ncolumns - cloudsatIN%Nlevels => cospIN%Nlevels - cloudsatIN%z_vol => cospIN%z_vol_cloudsat - cloudsatIN%kr_vol => cospIN%kr_vol_cloudsat - cloudsatIN%g_vol => cospIN%g_vol_cloudsat - cloudsatIN%rcfg => cospIN%rcfg_cloudsat - cloudsatIN%hgt_matrix => cospgridIN%hgt_matrix - end if - - END SUBROUTINE COSP_ASSIGN_cloudsatIN - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE COSP_ASSIGN_cloudsatIN_CLEAN - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - SUBROUTINE COSP_ASSIGN_cloudsatIN_CLEAN() - ! Deallocate temporary arrays - if (allocated(temp_z_vol_cloudsat)) deallocate(temp_z_vol_cloudsat) - if (allocated(temp_kr_vol_cloudsat)) deallocate(temp_kr_vol_cloudsat) - if (allocated(temp_g_vol_cloudsat)) deallocate(temp_g_vol_cloudsat) - if (allocated(temp_hgt_matrix)) deallocate(temp_hgt_matrix) - - END SUBROUTINE COSP_ASSIGN_cloudsatIN_CLEAN - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! END MODULE - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -END MODULE MOD_COSP_CLOUDSAT_INTERFACE diff --git a/dplrw_src/cosp_config.F90 b/dplrw_src/cosp_config.F90 deleted file mode 100755 index 79a57f9b5e..0000000000 --- a/dplrw_src/cosp_config.F90 +++ /dev/null @@ -1,529 +0,0 @@ -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -! Copyright (c) 2015, Regents of the University of Colorado -! All rights reserved. -! -! Redistribution and use in source and binary forms, with or without modification, are -! permitted provided that the following conditions are met: -! -! 1. Redistributions of source code must retain the above copyright notice, this list of -! conditions and the following disclaimer. -! -! 2. Redistributions in binary form must reproduce the above copyright notice, this list -! of conditions and the following disclaimer in the documentation and/or other -! materials provided with the distribution. -! -! 3. Neither the name of the copyright holder nor the names of its contributors may be -! used to endorse or promote products derived from this software without specific prior -! written permission. -! -! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL -! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT -! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -! -! History: -! Jul 2007 - A. Bodas-Salcedo - Initial version -! Jul 2008 - A. Bodas-Salcedo - Added definitions of ISCCP axes -! Oct 2008 - H. Chepfer - Added PARASOL_NREFL -! Jun 2010 - R. Marchand - Modified to support quickbeam V3, added ifdef for -! hydrometeor definitions -! May 2015 - D. Swales - Tidied up. Set up appropriate fields during initialization. -! June 2015- D. Swales - Moved hydrometeor class variables to hydro_class_init in -! the module quickbeam_optics. -! Mar 2016 - D. Swales - Added scops_ccfrac. Was previously hardcoded in prec_scops.f90. -! Mar 2018 - R. Guzman - Added LIDAR_NTYPE for the OPAQ diagnostics -! Apr 2018 - R. Guzman - Added parameters for GROUND LIDAR and ATLID simulators -! Nov 2018 - T. Michibata - Added CloudSat+MODIS Warmrain Diagnostics -! Mar 2024 - C. Wall - Added MODIS joint-histogram diagnostics -! -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -MODULE MOD_COSP_CONFIG - USE COSP_KINDS, ONLY: wp,dp - IMPLICIT NONE - - ! ##################################################################################### - ! Common COSP information - ! ##################################################################################### - character(len=32) :: & - COSP_VERSION ! COSP Version ID (set in cosp_interface_init) - real(wp),parameter :: & - R_UNDEF = -1.0E30, & ! Missing value - R_GROUND = -1.0E20, & ! Flag for below ground results - scops_ccfrac = 0.05 ! Fraction of column (or subcolumn) covered with convective - ! precipitation (default is 5%). *NOTE* This quantity may vary - ! between modeling centers. - logical :: & - use_vgrid ! True=Use new grid for L3 CLOUDAT and CALIPSO - integer,parameter :: & - SR_BINS = 15, & ! Number of bins (backscattering coefficient) in CALOPSO LIDAR simulator. - N_HYDRO = 9 ! Number of hydrometeor classes used by quickbeam radar simulator. - - ! #################################################################################### - ! Joint histogram bin-boundaries - ! tau is used by ISCCP and MISR - ! pres is used by ISCCP - ! hgt is used by MISR - ! ReffLiq is used by MODIS - ! ReffIce is used by MODIS - ! *NOTE* ALL JOINT-HISTOGRAM BIN BOUNDARIES ARE DECLARED AND DEFINED HERE IN - ! COSP_CONFIG, WITH THE EXCEPTION OF THE TAU AXIS USED BY THE MODIS SIMULATOR, - ! WHICH IS SET DURING INITIALIZATION IN COSP_INTERFACE_INIT. - ! #################################################################################### - ! Optical depth bin axis - integer,parameter :: & - ntau=7 - real(wp),parameter,dimension(ntau+1) :: & - tau_binBounds = (/0.0, 0.3, 1.3, 3.6, 9.4, 23., 60., 10000./) - real(wp),parameter,dimension(ntau) :: & - tau_binCenters = (/0.15, 0.80, 2.45, 6.5, 16.2, 41.5, 100.0/) - real(wp),parameter,dimension(2,ntau) :: & - tau_binEdges = reshape(source=(/0.0, 0.3, 0.3, 1.3, 1.3, 3.6, 3.6, & - 9.4, 9.4, 23.0, 23.0, 60.0, 60.0, 100000.0/), & - shape=(/2,ntau/)) - - ! Optical depth bin axes (ONLY USED BY MODIS SIMULATOR IN v1.4) - integer :: l,k - integer,parameter :: & - ntauV1p4 = 6 - real(wp),parameter,dimension(ntauV1p4+1) :: & - tau_binBoundsV1p4 = (/0.3, 1.3, 3.6, 9.4, 23., 60., 10000./) - real(wp),parameter,dimension(2,ntauV1p4) :: & - tau_binEdgesV1p4 = reshape(source =(/tau_binBoundsV1p4(1),((tau_binBoundsV1p4(k),l=1,2), & - k=2,ntauV1p4),100000._wp/),shape = (/2,ntauV1p4/)) - real(wp),parameter,dimension(ntauV1p4) :: & - tau_binCentersV1p4 = (tau_binEdgesV1p4(1,:)+tau_binEdgesV1p4(2,:))/2._wp - - ! Cloud-top height pressure bin axis - integer,parameter :: & - npres = 7 - real(wp),parameter,dimension(npres+1) :: & - pres_binBounds = (/0., 180., 310., 440., 560., 680., 800., 10000./) - real(wp),parameter,dimension(npres) :: & - pres_binCenters = (/90000., 74000., 62000., 50000., 37500., 24500., 9000./) - real(wp),parameter,dimension(2,npres) :: & - pres_binEdges = reshape(source=(/100000.0, 80000.0, 80000.0, 68000.0, 68000.0, & - 56000.0, 56000.0, 44000.0, 44000.0, 31000.0, & - 31000.0, 18000.0, 18000.0, 0.0/), & - shape=(/2,npres/)) - - ! Cloud-top height bin axis #1 - integer,parameter :: & - nhgt = 16 - real(wp),parameter,dimension(nhgt+1) :: & - hgt_binBounds = (/-.99,0.,0.5,1.,1.5,2.,2.5,3.,4.,5.,7.,9.,11.,13.,15.,17.,99./) - real(wp),parameter,dimension(nhgt) :: & - hgt_binCenters = 1000*(/0.,0.25,0.75,1.25,1.75,2.25,2.75,3.5,4.5,6.,8.,10.,12., & - 14.5,16.,18./) - real(wp),parameter,dimension(2,nhgt) :: & - hgt_binEdges = 1000.0*reshape(source=(/-99.0, 0.0, 0.0, 0.5, 0.5, 1.0, 1.0, 1.5, & - 1.5, 2.0, 2.0, 2.5, 2.5, 3.0, 3.0, 4.0, & - 4.0, 5.0, 5.0, 7.0, 7.0, 9.0, 9.0,11.0, & - 11.0,13.0,13.0,15.0,15.0,17.0,17.0,99.0/),& - shape=(/2,nhgt/)) - - ! Liquid and Ice particle bins for MODIS joint histogram of optical-depth and particle - ! size - ! Bin edges match Pincus et al. 2023 observational data (doi:10.5194/essd-15-2483-2023) - ! Additional Re bins to capture all simulated clouds - integer :: i,j - integer,parameter :: & - nReffLiq = 8, & ! Number of ReffLiq bins for tau/ReffLiq and LWP/ReffLiq joint-histogram - nReffIce = 8 ! Number of ReffIce bins for tau/ReffICE and IWP/ReffIce joint-histogram - real(wp),parameter,dimension(nReffLiq+1) :: & - reffLIQ_binBounds = (/0.0, 4.0e-6, 8e-6, 1.0e-5, 1.25e-5, 1.5e-5, 2.0e-5, 3.0e-5, 1.0e-2/) - real(wp),parameter,dimension(nReffIce+1) :: & - reffICE_binBounds = (/0.0,5.0e-6, 1.0e-5, 2.0e-5, 3.0e-5, 4.0e-5, 5.0e-5, 6.0e-5, 1.0e-2/) - real(wp),parameter,dimension(2,nReffICE) :: & - reffICE_binEdges = reshape(source=(/reffICE_binBounds(1),((reffICE_binBounds(k), & - l=1,2),k=2,nReffICE),reffICE_binBounds(nReffICE+1)/), & - shape = (/2,nReffICE/)) - real(wp),parameter,dimension(2,nReffLIQ) :: & - reffLIQ_binEdges = reshape(source=(/reffLIQ_binBounds(1),((reffLIQ_binBounds(k), & - l=1,2),k=2,nReffLIQ),reffLIQ_binBounds(nReffLIQ+1)/), & - shape = (/2,nReffLIQ/)) - real(wp),parameter,dimension(nReffICE) :: & - reffICE_binCenters = (reffICE_binEdges(1,:)+reffICE_binEdges(2,:))/2._wp - real(wp),parameter,dimension(nReffLIQ) :: & - reffLIQ_binCenters = (reffLIQ_binEdges(1,:)+reffLIQ_binEdges(2,:))/2._wp - - ! LWP and IWP bins for MODIS joint histogram of (1) LWP and droplet size - ! and (2) IWP and particle size - integer, parameter :: & - nLWP = 7, & ! Number of bins for LWP/ReffLiq joint-histogram - nIWP = 7 ! Number of bins for IWP/ReffIce joint-histogram - real(wp),parameter,dimension(nLWP+1) :: & - LWP_binBounds = (/0., 0.01, 0.03, 0.06, 0.10, 0.15, 0.25, 20.0/) ! kg/m2 - real(wp),parameter,dimension(nIWP+1) :: & - IWP_binBounds = (/0., 0.02, 0.05, 0.10, 0.20, 0.40, 1.00, 20.0/) ! kg/m2 - real(wp),parameter,dimension(2,nLWP) :: & - LWP_binEdges = reshape(source=(/LWP_binBounds(1),((LWP_binBounds(k), & - l=1,2),k=2,nLWP),LWP_binBounds(nLWP+1)/), & - shape = (/2,nLWP/)) - real(wp),parameter,dimension(2,nIWP) :: & - IWP_binEdges = reshape(source=(/IWP_binBounds(1),((IWP_binBounds(k), & - l=1,2),k=2,nIWP),IWP_binBounds(nIWP+1)/), & - shape = (/2,nIWP/)) - real(wp),parameter,dimension(nLWP) :: & - LWP_binCenters = (LWP_binEdges(1,:)+LWP_binEdges(2,:))/2._wp - real(wp),parameter,dimension(nIWP) :: & - IWP_binCenters = (IWP_binEdges(1,:)+IWP_binEdges(2,:))/2._wp - ! #################################################################################### - ! Constants used by RTTOV. - ! #################################################################################### - ! None - ! #################################################################################### - ! Constants used by the PARASOL simulator. - ! #################################################################################### - integer,parameter :: & - PARASOL_NREFL = 5, & ! Number of angles in LUT - PARASOL_NTAU = 7 ! Number of optical depths in LUT - real(wp),parameter,dimension(PARASOL_NREFL) :: & - PARASOL_SZA = (/0.0, 20.0, 40.0, 60.0, 80.0/) - REAL(WP),parameter,dimension(PARASOL_NTAU) :: & - PARASOL_TAU = (/0., 1., 5., 10., 20., 50., 100./) - - ! LUTs - REAL(WP),parameter,dimension(PARASOL_NREFL,PARASOL_NTAU) :: & - ! LUT for liquid particles - rlumA = reshape(source=(/ 0.03, 0.03, 0.03, 0.03, 0.03, & - 0.090886, 0.072185, 0.058410, 0.052498, 0.034730, & - 0.283965, 0.252596, 0.224707, 0.175844, 0.064488, & - 0.480587, 0.436401, 0.367451, 0.252916, 0.081667, & - 0.695235, 0.631352, 0.509180, 0.326551, 0.098215, & - 0.908229, 0.823924, 0.648152, 0.398581, 0.114411, & - 1.0, 0.909013, 0.709554, 0.430405, 0.121567/), & - shape=(/PARASOL_NREFL,PARASOL_NTAU/)), & - ! LUT for ice particles - rlumB = reshape(source=(/ 0.03, 0.03, 0.03, 0.03, 0.03, & - 0.092170, 0.087082, 0.083325, 0.084935, 0.054157, & - 0.311941, 0.304293, 0.285193, 0.233450, 0.089911, & - 0.511298, 0.490879, 0.430266, 0.312280, 0.107854, & - 0.712079, 0.673565, 0.563747, 0.382376, 0.124127, & - 0.898243, 0.842026, 0.685773, 0.446371, 0.139004, & - 0.976646, 0.912966, 0.737154, 0.473317, 0.145269/), & - shape=(/PARASOL_NREFL,PARASOL_NTAU/)) - - ! #################################################################################### - ! ISCCP simulator tau/CTP joint histogram information - ! #################################################################################### - integer,parameter :: & - numISCCPTauBins = ntau, & ! Number of optical depth bins - numISCCPPresBins = npres ! Number of pressure bins - real(wp),parameter,dimension(ntau+1) :: & - isccp_histTau = tau_binBounds ! Joint-histogram boundaries (optical depth) - real(wp),parameter,dimension(npres+1) :: & - isccp_histPres = pres_binBounds ! Joint-histogram boundaries (cloud pressure) - real(wp),parameter,dimension(ntau) :: & - isccp_histTauCenters = tau_binCenters ! Joint histogram bin centers (optical depth) - real(wp),parameter,dimension(npres) :: & - isccp_histPresCenters = pres_binCenters ! Joint histogram bin centers (cloud pressure) - real(wp),parameter,dimension(2,ntau) :: & - isccp_histTauEdges = tau_binEdges ! Joint histogram bin edges (optical depth) - real(wp),parameter,dimension(2,npres) :: & - isccp_histPresEdges = pres_binEdges ! Joint histogram bin edges (cloud pressure) - - ! #################################################################################### - ! MISR simulator tau/CTH joint histogram information - ! #################################################################################### - integer,parameter :: & - numMISRHgtBins = nhgt, & ! Number of cloud-top height bins - numMISRTauBins = ntau ! Number of optical depth bins - ! Joint histogram boundaries - real(wp),parameter,dimension(numMISRHgtBins+1) :: & - misr_histHgt = hgt_binBounds ! Joint-histogram boundaries (cloud height) - real(wp),parameter,dimension(numMISRTauBins+1) :: & - misr_histTau = tau_binBounds ! Joint-histogram boundaries (optical-depth) - real(wp),parameter,dimension(numMISRHgtBins) :: & - misr_histHgtCenters = hgt_binCenters ! Joint-histogram bin centers (cloud height) - real(wp),parameter,dimension(2,numMISRHgtBins) :: & - misr_histHgtEdges = hgt_BinEdges ! Joint-histogram bin edges (cloud height) - - ! #################################################################################### - ! MODIS simulator tau/CTP joint histogram information - ! #################################################################################### - integer,parameter :: & - numMODISPresBins = npres ! Number of pressure bins for joint-histogram - real(wp),parameter,dimension(numMODISPresBins + 1) :: & - modis_histPres = 100*pres_binBounds ! Joint-histogram boundaries (cloud pressure) - real(wp),parameter,dimension(2, numMODISPresBins) :: & - modis_histPresEdges = 100*pres_binEdges ! Joint-histogram bin edges (cloud pressure) - real(wp),parameter,dimension(numMODISPresBins) :: & - modis_histPresCenters = 100*pres_binCenters ! Joint-histogram bin centers (cloud pressure) - - ! For the MODIS simulator we want to preserve the ability for cospV1.4.0 to use the - ! old histogram bin boundaries for optical depth, so these are set up in initialization. - integer :: & - numMODISTauBins ! Number of tau bins for joint-histogram - real(wp),allocatable,dimension(:) :: & - modis_histTau ! Joint-histogram boundaries (optical depth) - real(wp),allocatable,dimension(:,:) :: & - modis_histTauEdges ! Joint-histogram bin edges (optical depth) - real(wp),allocatable,dimension(:) :: & - modis_histTauCenters ! Joint-histogram bin centers (optical depth) - - ! #################################################################################### - ! MODIS simulator tau/ReffICE and tau/ReffLIQ joint-histogram information - ! #################################################################################### - ! Ice - integer,parameter :: & - numMODISReffIceBins = nReffIce ! Number of bins for joint-histogram - real(wp),parameter,dimension(nReffIce+1) :: & - modis_histReffIce = reffICE_binBounds ! Effective radius bin boundaries - real(wp),parameter,dimension(nReffIce) :: & - modis_histReffIceCenters = reffICE_binCenters ! Effective radius bin centers - real(wp),parameter,dimension(2,nReffICE) :: & - modis_histReffIceEdges = reffICE_binEdges ! Effective radius bin edges - - ! Liquid - integer,parameter :: & - numMODISReffLiqBins = nReffLiq ! Number of bins for joint-histogram - real(wp),parameter,dimension(nReffLiq+1) :: & - modis_histReffLiq = reffLIQ_binBounds ! Effective radius bin boundaries - real(wp),parameter,dimension(nReffLiq) :: & - modis_histReffLiqCenters = reffLIQ_binCenters ! Effective radius bin centers - real(wp),parameter,dimension(2,nReffLiq) :: & - modis_histReffLiqEdges = reffLIQ_binEdges ! Effective radius bin edges - ! #################################################################################### - ! MODIS simulator LWP/ReffLIQ and IWP/ReffIce joint-histogram information - ! #################################################################################### - ! Liquid - integer,parameter :: & - numMODISLWPBins = nLWP ! Number of bins for joint-histogram - real(wp),parameter,dimension(nLWP+1) :: & - modis_histLWP = LWP_binBounds ! LWP bin boundaries - real(wp),parameter,dimension(nLWP) :: & - modis_histLWPCenters = LWP_binCenters ! LWP bin centers - real(wp),parameter,dimension(2,nLWP) :: & - modis_histLWPEdges = LWP_binEdges ! LWP bin edges - - ! Ice - integer,parameter :: & - numMODISIWPBins = nIWP ! Number of bins for joint-histogram - real(wp),parameter,dimension(nIWP+1) :: & - modis_histIWP = IWP_binBounds ! IWP bin boundaries - real(wp),parameter,dimension(nIWP) :: & - modis_histIWPCenters = IWP_binCenters ! IWP bin centers - real(wp),parameter,dimension(2,nIWP) :: & - modis_histIWPEdges = IWP_binEdges ! IWP bin edges - - ! #################################################################################### - ! CLOUDSAT reflectivity histogram information - ! #################################################################################### - integer,parameter :: & - CLOUDSAT_DBZE_BINS = 15, & ! Number of dBZe bins in histogram (cfad) - CLOUDSAT_DBZE_MIN = -100, & ! Minimum value for radar reflectivity - CLOUDSAT_DBZE_MAX = 80, & ! Maximum value for radar reflectivity - CLOUDSAT_CFAD_ZE_MIN = -50, & ! Lower value of the first CFAD Ze bin - CLOUDSAT_CFAD_ZE_WIDTH = 5 ! Bin width (dBZe) - - real(wp),parameter,dimension(CLOUDSAT_DBZE_BINS+1) :: & - cloudsat_histRef = (/CLOUDSAT_DBZE_MIN,(/(i, i=int(CLOUDSAT_CFAD_ZE_MIN+CLOUDSAT_CFAD_ZE_WIDTH),& - int(CLOUDSAT_CFAD_ZE_MIN+(CLOUDSAT_DBZE_BINS-1)*CLOUDSAT_CFAD_ZE_WIDTH), & - int(CLOUDSAT_CFAD_ZE_WIDTH))/),CLOUDSAT_DBZE_MAX/) - real(wp),parameter,dimension(2,CLOUDSAT_DBZE_BINS) :: & - cloudsat_binEdges = reshape(source=(/cloudsat_histRef(1),((cloudsat_histRef(k), & - l=1,2),k=2,CLOUDSAT_DBZE_BINS),cloudsat_histRef(CLOUDSAT_DBZE_BINS+1)/),& - shape = (/2,CLOUDSAT_DBZE_BINS/)) - real(wp),parameter,dimension(CLOUDSAT_DBZE_BINS) :: & - cloudsat_binCenters = (cloudsat_binEdges(1,:)+cloudsat_binEdges(2,:))/2._wp - - ! Parameters for Cloudsat near-surface precipitation diagnostics. - ! Precipitation classes. - integer, parameter :: & - nCloudsatPrecipClass = 10 - integer, parameter :: & - pClass_noPrecip = 0, & ! No precipitation - pClass_Rain1 = 1, & ! Rain possible - pClass_Rain2 = 2, & ! Rain probable - pClass_Rain3 = 3, & ! Rain certain - pClass_Snow1 = 4, & ! Snow possible - pClass_Snow2 = 5, & ! Snow certain - pClass_Mixed1 = 6, & ! Mixed-precipitation possible - pClass_Mixed2 = 7, & ! Mixed-precipitation certain - pClass_Rain4 = 8, & ! Heavy rain - pClass_default = 9 ! Default - ! Reflectivity bin boundaries, used by decision tree to classify precipitation type. - real(wp), dimension(4),parameter :: & - Zenonbinval =(/0._wp, -5._wp, -7.5_wp, -15._wp/) - real(wp), dimension(6),parameter :: & - Zbinvallnd = (/10._wp, 5._wp, 2.5_wp, -2.5_wp, -5._wp, -15._wp/) - ! Vertical level index(Nlvgrid) for Cloudsat precipitation occurence/frequency diagnostics. - ! Level 39 of Nlvgrid(40) is 480-960m. - integer, parameter :: & - cloudsat_preclvl = 39 - - ! for DPLRW simulator - real(wp),parameter :: & - trbl_LS = 0.5, & - trbl_CU = 1.0 - real(wp),parameter :: & - lvtemp_MIN = -80., & - lvtemp_MAX = 30., & - lvtemp_WID = 2., & - lvdBZe_MIN = -40., & - lvdBZe_MAX = 30., & - lvdBZe_WID = 2., & - lvdplr_MIN = -6.0, & - lvdplr_MAX = 6.0, & - lvdplr_WID = 0.2, & - lvspwd_MIN = 0.0, & - lvspwd_MAX = 5.0, & - lvspwd_WID = 0.1 - integer,parameter :: & - Nlvtemp = nint( (lvtemp_MAX-lvtemp_MIN)/lvtemp_WID ), & - NlvdBZe = nint( (lvdBZe_MAX-lvdBZe_MIN)/lvdBZe_WID ), & - Nlvdplr = nint( (lvdplr_MAX-lvdplr_MIN)/lvdplr_WID ), & - Nlvspwd = nint( (lvspwd_MAX-lvspwd_MIN)/lvspwd_WID ) - - real(wp),parameter :: & - lvtemp_grid(Nlvtemp) = (/( lvtemp_MIN+lvtemp_WID*(i-0.5), i=1,Nlvtemp )/), & - lvdBZe_grid(NlvdBZe) = (/( lvdBZe_MIN+lvdBZe_WID*(i-0.5), i=1,NlvdBZe )/), & - lvdplr_grid(Nlvdplr) = (/( lvdplr_MIN+lvdplr_WID*(i-0.5), i=1,Nlvdplr )/), & - lvspwd_grid(Nlvspwd) = (/( lvspwd_MIN+lvspwd_WID*(i-0.5), i=1,Nlvspwd )/) - - ! #################################################################################### - ! CLOUDSAT and MODIS joint product information (2018.11.22) - ! #################################################################################### - ! @ COSP_DIAG_WARMRAIN: - integer, parameter :: CFODD_NCLASS = 3 ! # of classes for CFODD (classified by MODIS Reff) - integer, parameter :: WR_NREGIME = 3 ! # of warm-rain regimes (non-precip/drizzling/raining) - integer, parameter :: SGCLD_CLR = 0 ! sub-grid cloud ID (fracout): clear-sky - integer, parameter :: SGCLD_ST = 1 ! sub-grid cloud ID (fracout): stratiform - integer, parameter :: SGCLD_CUM = 2 ! sub-grid cloud ID (fracout): cumulus - real(wp),parameter :: CWP_THRESHOLD = 0.00 ! cloud water path threshold - real(wp),parameter :: COT_THRESHOLD = 0.30 ! cloud optical thickness threshold - real(wp),parameter,dimension(CFODD_NCLASS+1) :: & - CFODD_BNDRE = (/5.0e-6, 12.0e-6, 18.0e-6, 35.0e-6/) ! Reff bnds - real(wp),parameter,dimension(2) :: & - CFODD_BNDZE = (/-15.0, 0.0/) ! dBZe bnds (cloud/drizzle/precip) - real(wp),parameter :: CFODD_DBZE_MIN = -30.0 ! Minimum value of CFODD dBZe bin - real(wp),parameter :: CFODD_DBZE_MAX = 20.0 ! Maximum value of CFODD dBZe bin - real(wp),parameter :: CFODD_ICOD_MIN = 0.0 ! Minimum value of CFODD ICOD bin - real(wp),parameter :: CFODD_ICOD_MAX = 60.0 ! Maximum value of CFODD ICOD bin - real(wp),parameter :: CFODD_DBZE_WIDTH = 2.0 ! Bin width (dBZe) - real(wp),parameter :: CFODD_ICOD_WIDTH = 2.0 ! Bin width (ICOD) - integer,parameter :: & - CFODD_NDBZE = INT( (CFODD_DBZE_MAX-CFODD_DBZE_MIN)/CFODD_DBZE_WIDTH ) ! Number of CFODD dBZe bins - integer,parameter :: & - CFODD_NICOD = INT( (CFODD_ICOD_MAX-CFODD_ICOD_MIN)/CFODD_ICOD_WIDTH ) ! Number of CFODD ICOD bins - real(wp),parameter,dimension(CFODD_NDBZE+1) :: & - CFODD_HISTDBZE = (/int(CFODD_DBZE_MIN),(/(i, i=int(CFODD_DBZE_MIN+CFODD_DBZE_WIDTH), & - int(CFODD_DBZE_MIN+(CFODD_NDBZE-1)*CFODD_DBZE_WIDTH), & - int(CFODD_DBZE_WIDTH))/),int(CFODD_DBZE_MAX)/) - real(wp),parameter,dimension(CFODD_NICOD+1) :: & - CFODD_HISTICOD = (/int(CFODD_ICOD_MIN),(/(i, i=int(CFODD_ICOD_MIN+CFODD_ICOD_WIDTH), & - int(CFODD_ICOD_MIN+(CFODD_NICOD-1)*CFODD_ICOD_WIDTH), & - int(CFODD_ICOD_WIDTH))/),int(CFODD_ICOD_MAX)/) - real(wp),parameter,dimension(2,CFODD_NDBZE) :: & - CFODD_HISTDBZEedges = reshape(source=(/CFODD_HISTDBZE(1),((CFODD_HISTDBZE(k), & - l=1,2),k=2,CFODD_NDBZE),CFODD_HISTDBZE(CFODD_NDBZE+1)/), & - shape = (/2,CFODD_NDBZE/)) - real(wp),parameter,dimension(CFODD_NDBZE) :: & - CFODD_HISTDBZEcenters = (CFODD_HISTDBZEedges(1,:)+CFODD_HISTDBZEedges(2,:))/2._wp - real(wp),parameter,dimension(2,CFODD_NICOD) :: & - CFODD_HISTICODedges = reshape(source=(/CFODD_HISTICOD(1),((CFODD_HISTICOD(k), & - l=1,2),k=2,CFODD_NICOD),CFODD_HISTICOD(CFODD_NICOD+1)/), & - shape = (/2,CFODD_NICOD/)) - real(wp),parameter,dimension(CFODD_NICOD) :: & - CFODD_HISTICODcenters = (CFODD_HISTICODedges(1,:)+CFODD_HISTICODedges(2,:))/2._wp - - ! #################################################################################### - ! Parameters used by the CALIPSO LIDAR simulator - ! #################################################################################### - ! CALISPO backscatter histogram bins - real(wp),parameter :: & - S_cld = 5.0, & ! Threshold for cloud detection - S_att = 0.01, & ! - S_cld_att = 30. ! Threshold for undefined cloud phase detection - real(wp),parameter,dimension(SR_BINS+1) :: & - calipso_histBsct = (/-1.,0.01,1.2,3.0,5.0,7.0,10.0,15.0,20.0,25.0,30.0,40.0,50.0, & - 60.0,80.0,999./) ! Backscatter histogram bins - real(wp),parameter,dimension(2,SR_BINS) :: & - calipso_binEdges = reshape(source=(/calipso_histBsct(1),((calipso_histBsct(k), & - l=1,2),k=2,SR_BINS),calipso_histBsct(SR_BINS+1)/), & - shape = (/2,SR_BINS/)) - real(wp),parameter,dimension(SR_BINS) :: & - calipso_binCenters = (calipso_binEdges(1,:)+calipso_binEdges(2,:))/2._wp - - integer,parameter :: & - LIDAR_NTEMP = 40, & - LIDAR_NCAT = 4, & ! Number of categories for cloudtop heights (high/mid/low/tot) - LIDAR_NTYPE = 3 ! Number of categories for OPAQ (opaque/thin cloud + z_opaque) - real(wp),parameter,dimension(LIDAR_NTEMP) :: & - LIDAR_PHASE_TEMP= & - (/-91.5,-88.5,-85.5,-82.5,-79.5,-76.5,-73.5,-70.5,-67.5,-64.5, & - -61.5,-58.5,-55.5,-52.5,-49.5,-46.5,-43.5,-40.5,-37.5,-34.5, & - -31.5,-28.5,-25.5,-22.5,-19.5,-16.5,-13.5,-10.5, -7.5, -4.5, & - -1.5, 1.5, 4.5, 7.5, 10.5, 13.5, 16.5, 19.5, 22.5, 25.5/) - real(wp),parameter,dimension(2,LIDAR_NTEMP) :: & - LIDAR_PHASE_TEMP_BNDS=reshape(source= & - (/-273.15, -90., -90., -87., -87., -84., -84., -81., -81., -78., & - -78., -75., -75., -72., -72., -69., -69., -66., -66., -63., & - -63., -60., -60., -57., -57., -54., -54., -51., -51., -48., & - -48., -45., -45., -42., -42., -39., -39., -36., -36., -33., & - -33., -30., -30., -27., -27., -24., -24., -21., -21., -18., & - -18., -15., -15., -12., -12., -9., -9., -6., -6., -3., & - -3., 0., 0., 3., 3., 6., 6., 9., 9., 12., & - 12., 15., 15., 18., 18., 21., 21., 24., 24., 100. /), & - shape=(/2,40/)) - - ! #################################################################################### - ! Parameters used by the GROUND LIDAR simulator - ! #################################################################################### - ! GROUND LIDAR backscatter histogram bins -! real(wp),parameter :: & -! S_cld = 5.0, & ! Threshold for cloud detection -! S_att = 0.01, & ! -! S_cld_att = 30. ! Threshold for undefined cloud phase detection - real(wp),parameter,dimension(SR_BINS+1) :: & - grLidar532_histBsct = (/-1.,0.01,1.2,3.0,5.0,7.0,10.0,15.0,20.0,25.0,30.0,40.0,50.0, & - 60.0,80.0,999./) ! Backscatter histogram bins - real(wp),parameter,dimension(2,SR_BINS) :: & - grLidar532_binEdges = reshape(source=(/grLidar532_histBsct(1),((grLidar532_histBsct(k), & - l=1,2),k=2,SR_BINS),grLidar532_histBsct(SR_BINS+1)/), & - shape = (/2,SR_BINS/)) - real(wp),parameter,dimension(SR_BINS) :: & - grLidar532_binCenters = (grLidar532_binEdges(1,:)+grLidar532_binEdges(2,:))/2._wp - -! integer,parameter :: & -! LIDAR_NCAT = 4 ! Number of categories for cloudtop heights (high/mid/low/tot) - - ! #################################################################################### - ! Parameters used by the ATLID LIDAR simulator - ! #################################################################################### - ! ATLID LIDAR backscatter histogram bins - real(wp),parameter :: & - S_cld_atlid = 1.74, & ! Threshold for cloud detection - S_att_atlid = 0.01, & ! - S_cld_att_atlid = 6.67 ! Threshold for undefined cloud phase detection - real(wp),parameter,dimension(SR_BINS+1) :: & - atlid_histBsct = (/-1.,0.01,1.03,1.38,1.74,2.07,2.62,3.65,4.63,5.63,6.67,8.8,11.25, & - 13.2,17.2,999./) ! Backscatter histogram bins - real(wp),parameter,dimension(2,SR_BINS) :: & - atlid_binEdges = reshape(source=(/atlid_histBsct(1),((atlid_histBsct(k), & - l=1,2),k=2,SR_BINS),atlid_histBsct(SR_BINS+1)/), & - shape = (/2,SR_BINS/)) - real(wp),parameter,dimension(SR_BINS) :: & - atlid_binCenters = (atlid_binEdges(1,:)+atlid_binEdges(2,:))/2._wp - -! integer,parameter :: & -! LIDAR_NCAT = 4 ! Number of categories for cloudtop heights (high/mid/low/tot) - - ! #################################################################################### - ! New vertical grid used by CALIPSO and CLOUDSAT L3 (set up during initialization) - ! #################################################################################### - integer :: & - Nlvgrid ! Number of levels in New grid - real(wp),dimension(:),allocatable :: & - vgrid_zl, & ! New grid bottoms - vgrid_zu, & ! New grid tops - vgrid_z, & ! New grid center - dz ! dZ - -END MODULE MOD_COSP_CONFIG diff --git a/dplrw_src/cosp_stats.F90 b/dplrw_src/cosp_stats.F90 deleted file mode 100755 index fae50d89ab..0000000000 --- a/dplrw_src/cosp_stats.F90 +++ /dev/null @@ -1,793 +0,0 @@ -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -! Copyright (c) 2015, Regents of the University of Colorado -! All rights reserved. -! -! Redistribution and use in source and binary forms, with or without modification, are -! permitted provided that the following conditions are met: -! -! 1. Redistributions of source code must retain the above copyright notice, this list of -! conditions and the following disclaimer. -! -! 2. Redistributions in binary form must reproduce the above copyright notice, this list -! of conditions and the following disclaimer in the documentation and/or other -! materials provided with the distribution. -! -! 3. Neither the name of the copyright holder nor the names of its contributors may be -! used to endorse or promote products derived from this software without specific prior -! written permission. -! -! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL -! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT -! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -! -! History: -! Jul 2007 - A. Bodas-Salcedo - Initial version -! Jul 2008 - A. Bodas-Salcedo - Added capability of producing outputs in standard grid -! Oct 2008 - J.-L. Dufresne - Bug fixed. Assignment of Npoints,Nlevels,Nhydro,Ncolumns -! in COSP_STATS -! Oct 2008 - H. Chepfer - Added PARASOL reflectance arguments -! Jun 2010 - T. Yokohata, T. Nishimura and K. Ogochi - Added NEC SXs optimisations -! Jan 2013 - G. Cesana - Added betaperp and temperature arguments -! - Added phase 3D/3Dtemperature/Map output variables in diag_lidar -! May 2015 - D. Swales - Modified for cosp2.0 -! Nov 2018 - T. Michibata - Added CloudSat+MODIS Warmrain Diagnostics -! Jun 2025 - J.K. Shaw. - Added COSP-RTTOV integration and swathing -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -MODULE MOD_COSP_STATS - USE COSP_KINDS, ONLY: wp - USE MOD_COSP_CONFIG, & - ONLY: R_UNDEF, R_GROUND, & - SGCLD_CLR, SGCLD_ST, & - SGCLD_CUM, & - CWP_THRESHOLD, COT_THRESHOLD, & - CFODD_NDBZE, CFODD_NICOD, & - CFODD_BNDRE, CFODD_BNDZE, & - CFODD_NCLASS, & - CFODD_DBZE_MIN, CFODD_DBZE_MAX, & - CFODD_ICOD_MIN, CFODD_ICOD_MAX, & - CFODD_DBZE_WIDTH, CFODD_ICOD_WIDTH, & - CFODD_HISTDBZE, CFODD_HISTICOD, & - WR_NREGIME, VGRID_ZU, & - VGRID_ZL, VGRID_Z, & - DZ - USE COSP_PHYS_CONSTANTS, ONLY: tmelt, radius_earth - USE COSP_MATH_CONSTANTS, ONLY: pi - USE MOD_COSP_RTTOV_UTIL, ONLY: rttov_cfg - IMPLICIT NONE - - ! ###################################################################################### - ! Quickbeam parameters - integer,parameter :: & - maxhclass = 20, & ! Qucikbeam maximum number of hydrometeor classes. - nRe_types = 550, & ! Quickbeam maximum number or Re size bins allowed in N and Z_scaled look up table. - nd = 85, & ! Qucikbeam number of discrete particles used in construction DSDs. - mt_ntt = 39, & ! Quickbeam number of temperatures in mie LUT. - Re_BIN_LENGTH = 10, & ! Quickbeam minimum Re interval in scale LUTs - Re_MAX_BIN = 250 ! Quickbeam maximum Re interval in scale LUTs - real(wp),parameter :: & - dmin = 0.1, & ! Quickbeam minimum size of discrete particle - dmax = 10000. ! Quickbeam maximum size of discrete particle - - ! ###################################################################################### - ! TYPE cosp_column_inputs - ! ###################################################################################### - type cosp_column_inputs - integer :: & - Npoints, & ! Number of gridpoints. - Ncolumns, & ! Number of columns. - Nlevels ! Number of levels. - - integer,allocatable,dimension(:) :: & - sunlit ! Sunlit flag (0-1) - - real(wp),allocatable,dimension(:,:) :: & - at, & ! Temperature (K) - pfull, & ! Pressure (Pa) - phalf, & ! Pressure at half-levels (Pa) - qv, & ! Specific humidity (kg/kg) - co2, & ! CO2 (kg/kg) - ch4, & ! Methane (kg/kg) - n2o, & ! N2O (kg/kg) - co, & ! CO (kg/kg) - so2, & ! SO2 (kg/kg) - hgt_matrix, & ! Height of atmosphere layer (km) - hgt_matrix_half ! Height of bottom interface of atm layer(km) - ! First level contains the bottom of the top layer. - ! Last level contains the bottom of the surface layer. - - real(wp),allocatable,dimension(:) :: & - land, & ! Land/Sea mask (0 for ocean, 1 for land) - skt, & ! Surface temperature (K) - surfelev ! Surface Elevation (m) - ! Fields used ONLY by RTTOV - real(wp),allocatable,dimension(:) :: & - u_sfc, & ! Surface u-wind (m/s) - v_sfc, & ! Surface v-wind (m/s) - t2m, & ! 2-meter temperature (K) - q2m, & ! 2-meter specific humidity (kg/kg) - lat, & ! Latitude (deg) - lon, & ! Longitude (deg) - sza, & ! Solar Zenith Angle in degrees - psfc, & ! Surface pressure (Pa) - rttov_sfcmask ! Mask for RTTOV surface types (0 for ocean, 1 for land, 2 for sea ice) - - real(wp),allocatable,dimension(:,:) :: & - o3, & ! Ozone (kg/kg) - tca, & ! Total layer cloud fraction (0-1) - cloudIce, & ! Cloud ice water mixing ratio (kg/kg) - cloudLiq, & ! Cloud liquid water mixing ratio (kg/kg) - DeffLiq, & ! Cloud liquid effective diameter (um) - DeffIce, & ! Cloud ice effective diameter (um) - rttov_date, & ! Date of the profile as year (e.g. 2013), month (1-12), and day (1-31) - rttov_time, & ! Time of profile as hour, minute, second. - emis_in, & ! Surface emissivity (point,channel) (1) - refl_in, & ! Surface reflectance (point,channel) (1) - fl_rain, & ! Precipitation (rain) flux (kg/m2/s) - fl_snow ! Precipitation (snow) flux (kg/m2/s) - - ! added by DPLRW - real(wp),allocatable,dimension(:,:) :: & - gwvel, & ! grid verical velocity (m/s) - gcumf ! grid cumulus mass flux (kg/m^2/s) - - end type cosp_column_inputs - - - ! ###################################################################################### - ! TYPE swath_inputs - ! ###################################################################################### - type swath_inputs - - integer :: & - N_inst_swaths = 0 - real(wp),dimension(20) :: & - inst_localtimes, & - inst_localtime_widths - - end type swath_inputs - - type radar_cfg - ! Radar properties - real(wp) :: freq,k2 - integer :: nhclass ! Number of hydrometeor classes in use - integer :: use_gas_abs, do_ray - logical :: radar_at_layer_one ! If true radar is assume to be at the edge - ! of the first layer, if the first layer is the - ! surface than a ground-based radar. If the - ! first layer is the top-of-atmosphere, then - ! a space borne radar. - - ! Variables used to store Z scale factors - character(len=240) :: scale_LUT_file_name - logical :: load_scale_LUTs, update_scale_LUTs - logical, dimension(maxhclass,nRe_types) :: N_scale_flag - logical, dimension(maxhclass,mt_ntt,nRe_types) :: Z_scale_flag,Z_scale_added_flag - real(wp),dimension(maxhclass,mt_ntt,nRe_types) :: Ze_scaled,Zr_scaled,kr_scaled - real(wp),dimension(maxhclass,nd,nRe_types) :: fc, rho_eff - real(wp),dimension(Re_MAX_BIN) :: base_list,step_list - - ! added by DPLRW - real(wp),dimension(maxhclass,mt_ntt,nRe_types) :: vf_scaled,vq_scaled,v3_scaled,v0_scaled,m3_scaled,m0_scaled - - end type radar_cfg - - ! ###################################################################################### - ! TYPE cosp_optical_inputs - ! ###################################################################################### - type cosp_optical_inputs - integer :: & - Npoints, & ! Number of gridpoints. - Ncolumns, & ! Number of columns. - Nlevels, & ! Number of levels. - Npart, & ! Number of cloud meteors for LIDAR simulators. - Nrefl, & ! Number of reflectances for PARASOL simulator - Ninst_rttov ! Number of RTTOV instruments - real(wp),pointer :: & - emis_grey => null() ! Greybody (spectrally flat) emissivity value for RTTOV - real(wp) :: & - emsfc_lw ! Surface emissivity @ 11micron - real(wp),allocatable,dimension(:,:,:) :: & - frac_out, & ! Cloud fraction - tau_067, & ! Optical depth @ 0.67micron - emiss_11, & ! Emissivity @ 11 micron - fracLiq, & ! Fraction of optical-depth due to liquid (MODIS) - asym, & ! Assymetry parameter @ 3.7micron (MODIS) - ss_alb, & ! Single-scattering albedo @ 3.7micron (MODIS) - betatot_calipso, & ! Lidar backscatter coefficient (calipso @ 532nm) - betatot_grLidar532, & ! Lidar backscatter coefficient (ground-lidar @ 532nm) - betatot_atlid, & ! Lidar backscatter coefficient (atlid @ 355nm) - betatot_ice_calipso, & ! Lidar backscatter coefficient ICE (calipso @ 532nm) - betatot_liq_calipso, & ! Lidar backscatter coefficient LIQUID (calipso @ 532nm) - tautot_calipso, & ! Lidar Optical thickness (calipso @ 532nm) - tautot_grLidar532, & ! Lidar Optical thickness (ground-lidar @ 532nm) - tautot_atlid, & ! Lidar Optical thickness (atlid @ 355nm) - tautot_ice_calipso, & ! Lidar Ice Optical thickness (calipso @ 532nm) - tautot_liq_calipso, & ! Lidar Liquid Optical thickness (calipso @ 532nm) - z_vol_cloudsat, & ! Effective reflectivity factor (mm^6/m^3) - kr_vol_cloudsat, & ! Attenuation coefficient hydro (dB/km) - g_vol_cloudsat ! Attenuation coefficient gases (dB/km) - real(wp),allocatable,dimension(:,:,:,:) :: & - vfall, vfsqu, zehyd, krhyd, & ! for DPLRW, each hydrometeor - vtrm3, vtrm0, mmnt3, mmnt0 - real(wp),allocatable,dimension(:,:) :: & - beta_mol_calipso, & ! Lidar molecular backscatter coefficient (calipso @ 532nm) - beta_mol_grLidar532, & ! Lidar molecular backscatter coefficient (ground-lidar @ 532nm) - beta_mol_atlid, & ! Lidar molecular backscatter coefficient (atlid @ 355nm) - tau_mol_calipso, & ! Lidar molecular optical depth (calipso @ 532nm) - tau_mol_grLidar532, & ! Lidar molecular optical depth (ground-lidar @ 532nm) - tau_mol_atlid, & ! Lidar molecular optical depth (atlid @ 355nm) - tautot_S_liq, & ! Parasol Liquid water optical thickness, from TOA to SFC - tautot_S_ice, & ! Parasol Ice water optical thickness, from TOA to SFC - fracPrecipIce ! Fraction of precipitation which is frozen (1). - type(radar_cfg) :: & - rcfg_cloudsat ! Radar configuration information (CLOUDSAT) - type(rttov_cfg),dimension(:),pointer :: & - cfg_rttov ! RTTOV configuration information (multiple instruments) - type(swath_inputs),dimension(6) :: & ! Could be a pointer but fine - cospswathsIN - end type cosp_optical_inputs - - -CONTAINS - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - !---------- SUBROUTINE COSP_CHANGE_VERTICAL_GRID ---------------- - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -SUBROUTINE COSP_CHANGE_VERTICAL_GRID(Npoints,Ncolumns,Nlevels,zfull,zhalf,y,Nglevels,newgrid_bot,newgrid_top,r,log_units) - implicit none - ! Input arguments - integer,intent(in) :: Npoints !# of grid points - integer,intent(in) :: Nlevels !# of levels - integer,intent(in) :: Ncolumns !# of columns - real(wp),dimension(Npoints,Nlevels),intent(in) :: zfull ! Height at model levels [m] (Bottom of model layer) - real(wp),dimension(Npoints,Nlevels),intent(in) :: zhalf ! Height at half model levels [m] (Bottom of model layer) - real(wp),dimension(Npoints,Ncolumns,Nlevels),intent(in) :: y ! Variable to be changed to a different grid - integer,intent(in) :: Nglevels !# levels in the new grid - real(wp),dimension(Nglevels),intent(in) :: newgrid_bot ! Lower boundary of new levels [m] - real(wp),dimension(Nglevels),intent(in) :: newgrid_top ! Upper boundary of new levels [m] - logical,optional,intent(in) :: log_units ! log units, need to convert to linear units - ! Output - real(wp),dimension(Npoints,Ncolumns,Nglevels),intent(out) :: r ! Variable on new grid - - ! Local variables - integer :: i,j,k - logical :: lunits - integer :: l - real(wp) :: w ! Weight - real(wp) :: dbb, dtb, dbt, dtt ! Distances between edges of both grids - integer :: Nw ! Number of weights - real(wp) :: wt ! Sum of weights - real(wp),dimension(Nlevels) :: oldgrid_bot,oldgrid_top ! Lower and upper boundaries of model grid - real(wp) :: yp ! Local copy of y at a particular point. - ! This allows for change of units. - - lunits=.false. - if (present(log_units)) lunits=log_units - - r = 0._wp - - do i=1,Npoints - ! Calculate tops and bottoms of new and old grids - oldgrid_bot = zhalf(i,:) - oldgrid_top(1:Nlevels-1) = oldgrid_bot(2:Nlevels) - oldgrid_top(Nlevels) = zfull(i,Nlevels) + zfull(i,Nlevels) - zhalf(i,Nlevels) ! Top level symmetric - l = 0 ! Index of level in the old grid - ! Loop over levels in the new grid - do k = 1,Nglevels - Nw = 0 ! Number of weigths - wt = 0._wp ! Sum of weights - ! Loop over levels in the old grid and accumulate total for weighted average - do - l = l + 1 - w = 0.0 ! Initialise weight to 0 - if (l > Nlevels) exit - ! Distances between edges of both grids - dbb = oldgrid_bot(l) - newgrid_bot(k) - dtb = oldgrid_top(l) - newgrid_bot(k) - dbt = oldgrid_bot(l) - newgrid_top(k) - dtt = oldgrid_top(l) - newgrid_top(k) - if (dbt >= 0.0) exit ! Do next level in the new grid - if (dtb > 0.0) then - if (dbb <= 0.0) then - if (dtt <= 0) then - w = dtb - else - w = newgrid_top(k) - newgrid_bot(k) - endif - else - if (dtt <= 0) then - w = oldgrid_top(l) - oldgrid_bot(l) - else - w = -dbt - endif - endif - ! If layers overlap (w/=0), then accumulate - if (w /= 0.0) then - Nw = Nw + 1 - wt = wt + w - do j=1,Ncolumns - if (lunits) then - if (y(i,j,l) /= R_UNDEF) then - yp = 10._wp**(y(i,j,l)/10._wp) - else - yp = 0._wp - endif - else - yp = y(i,j,l) - endif - r(i,j,k) = r(i,j,k) + w*yp - enddo - endif - endif - enddo - l = l - 2 - if (l < 1) l = 0 - ! Calculate average in new grid - if (Nw > 0) then - do j=1,Ncolumns - r(i,j,k) = r(i,j,k)/wt - enddo - endif - enddo - enddo - - ! Set points under surface to R_UNDEF, and change to dBZ if necessary - do k=1,Nglevels - do j=1,Ncolumns - do i=1,Npoints - if (newgrid_top(k) > zhalf(i,1)) then ! Level above model bottom level - if (lunits) then - if (r(i,j,k) <= 0.0) then - r(i,j,k) = R_UNDEF - else - r(i,j,k) = 10._wp*log10(r(i,j,k)) - endif - endif - else ! Level below surface - r(i,j,k) = R_GROUND - endif - enddo - enddo - enddo - -END SUBROUTINE COSP_CHANGE_VERTICAL_GRID - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - !------------- SUBROUTINE COSP_LIDAR_ONLY_CLOUD ----------------- - ! (c) 2008, Lawrence Livermore National Security Limited Liability Corporation. - ! All rights reserved. - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - SUBROUTINE COSP_LIDAR_ONLY_CLOUD(Npoints, Ncolumns, Nlevels, beta_tot, beta_mol, & - Ze_tot, lidar_only_freq_cloud, tcc, radar_tcc, radar_tcc2) - ! Inputs - integer,intent(in) :: & - Npoints, & ! Number of horizontal gridpoints - Ncolumns, & ! Number of subcolumns - Nlevels ! Number of vertical layers - real(wp),dimension(Npoints,Nlevels),intent(in) :: & - beta_mol ! Molecular backscatter - real(wp),dimension(Npoints,Ncolumns,Nlevels),intent(in) :: & - beta_tot, & ! Total backscattered signal - Ze_tot ! Radar reflectivity - ! Outputs - real(wp),dimension(Npoints,Nlevels),intent(out) :: & - lidar_only_freq_cloud - real(wp),dimension(Npoints),intent(out) ::& - tcc, & ! - radar_tcc, & ! - radar_tcc2 ! - - ! local variables - real(wp) :: sc_ratio - real(wp),parameter :: & - s_cld=5.0, & - s_att=0.01 - integer :: flag_sat,flag_cld,pr,i,j,flag_radarcld,flag_radarcld_no1km,j_1km - - lidar_only_freq_cloud = 0._wp - tcc = 0._wp - radar_tcc = 0._wp - radar_tcc2 = 0._wp - do pr=1,Npoints - do i=1,Ncolumns - flag_sat = 0 - flag_cld = 0 - flag_radarcld = 0 !+JEK - flag_radarcld_no1km=0 !+JEK - ! look for j_1km from bottom to top - j = 1 - do while (Ze_tot(pr,i,j) .eq. R_GROUND) - j = j+1 - enddo - j_1km = j+1 !this is the vertical index of 1km above surface - - do j=1,Nlevels - sc_ratio = beta_tot(pr,i,j)/beta_mol(pr,j) - if ((sc_ratio .le. s_att) .and. (flag_sat .eq. 0)) flag_sat = j - if (Ze_tot(pr,i,j) .lt. -30.) then !radar can't detect cloud - if ( (sc_ratio .gt. s_cld) .or. (flag_sat .eq. j) ) then !lidar sense cloud - lidar_only_freq_cloud(pr,j)=lidar_only_freq_cloud(pr,j)+1. !top->surf - flag_cld=1 - endif - else !radar sense cloud (z%Ze_tot(pr,i,j) .ge. -30.) - flag_cld=1 - flag_radarcld=1 - if (j .gt. j_1km) flag_radarcld_no1km=1 - endif - enddo !levels - if (flag_cld .eq. 1) tcc(pr)=tcc(pr)+1._wp - if (flag_radarcld .eq. 1) radar_tcc(pr)=radar_tcc(pr)+1. - if (flag_radarcld_no1km .eq. 1) radar_tcc2(pr)=radar_tcc2(pr)+1. - enddo !columns - enddo !points - lidar_only_freq_cloud=lidar_only_freq_cloud/Ncolumns - tcc=tcc/Ncolumns - radar_tcc=radar_tcc/Ncolumns - radar_tcc2=radar_tcc2/Ncolumns - - ! Unit conversion - where(lidar_only_freq_cloud /= R_UNDEF) & - lidar_only_freq_cloud = lidar_only_freq_cloud*100._wp - where(tcc /= R_UNDEF) tcc = tcc*100._wp - where(radar_tcc /= R_UNDEF) radar_tcc = radar_tcc*100._wp - where(radar_tcc2 /= R_UNDEF) radar_tcc2 = radar_tcc2*100._wp - - END SUBROUTINE COSP_LIDAR_ONLY_CLOUD - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - !----------------------- SUBROUTINE COSP_DIAG_WARMRAIN ------------------------ - ! (c) 2018, Research Institute for Applied Mechanics (RIAM), Kyushu Univ. - ! All rights reserved. - ! * Purpose: 1) Diagnose Contoured Frequency by Optical Depth Diagram (CFODD) - ! from CloudSat Radar and MODIS retrievals. - ! 2) Diagnose Warm-Rain Occurrence Frequency (nonprecip/drizzle/rain) - ! from CloudSat Radar. - ! * History: Jan 2018 (T.Michibata): Test run - ! May 2018 (T.Michibata): update for COSP2 - ! Sep 2018 (T.Michibata): modified I/O - ! Nov 2018 (T.Michibata): minor revisions - ! May 2020 (T.Michibata and X.Jing): bug-fix for frac_out dimsize - ! Apr 2022 (T.Michibata): bug-fix for non-sunlit columns - ! * References: Michibata et al. (GMD'19, doi:10.5194/gmd-12-4297-2019) - ! Michibata et al. (GRL'20, doi:10.1029/2020GL088340) - ! Suzuki et al. (JAS'10, doi:10.1175/2010JAS3463.1) - ! Suzuki et al. (JAS'15, doi:10.1175/JAS-D-14-0265.1) - ! Jing et al. (JCLIM'19, doi:10.1175/jcli-d-18-0789.1) - ! * Contact: Takuro Michibata (RIAM, Kyushu University, Japan). - ! E-mail: michibata@riam.kyushu-u.ac.jp - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - SUBROUTINE COSP_DIAG_WARMRAIN( Npoints, Ncolumns, Nlevels, & !! in - temp, zlev, & !! in - lwp, liqcot, liqreff, liqcfrc, & !! in - iwp, icecot, icereff, icecfrc, & !! in - fracout, dbze, & !! in - cfodd_ntotal, & !! inout - wr_occfreq_ntotal ) !! inout - - ! Inputs - integer, intent(in) :: & - Npoints, & ! Number of horizontal gridpoints - Ncolumns, & ! Number of subcolumns - Nlevels ! Number of vertical layers - real(wp), dimension(Npoints), intent(in) :: & - lwp, & ! MODIS LWP [kg m-2] - liqcot, & ! MODIS liq. COT - liqreff, & ! MODIS liq. Reff [m] - liqcfrc ! MODIS liq. cloud fraction - real(wp), dimension(Npoints), intent(in) :: & - iwp, & ! MODIS IWP [kg m-2] - icecot, & ! MODIS ice COT - icereff, & ! MODIS ice Reff [m] - icecfrc ! MODIS ice cloud fraction - real(wp), dimension(Npoints,Nlevels), intent(in) :: & - zlev ! altitude [m] for model level - real(wp), dimension(Npoints,1,Nlevels),intent(in) :: & - temp ! temperature [K] - real(wp), dimension(Npoints,Ncolumns,Nlevels),intent(in) :: & - fracout, & ! SCOPS subcolumn retrieval - dbze ! Radar reflectivity [dBZe] - - ! Outputs - real(wp),dimension(Npoints,CFODD_NDBZE,CFODD_NICOD,CFODD_NCLASS),intent(inout) :: & - cfodd_ntotal ! # of CFODD samples for each ICOD/dBZe bin - real(wp),dimension(Npoints,WR_NREGIME),intent(inout) :: & - wr_occfreq_ntotal ! # of SLWC samples - - ! Local variables - integer :: i, j, k - integer :: kctop, kcbtm - integer :: icls - integer :: iregime - real(wp) :: cmxdbz - real(wp) :: diagcgt !! diagnosed cloud geometric thickness [m] - real(wp) :: diagicod !! diagnosed in-cloud optical depth - real(wp) :: cbtmh !! diagnosed in-cloud optical depth - real(wp), dimension(Npoints,Ncolumns,Nlevels) :: icod !! in-cloud optical depth (ICOD) - logical :: octop, ocbtm, oslwc - integer, dimension(Npoints,Ncolumns,Nlevels) :: fracout_int !! fracout (decimal to integer) - fracout_int(:,:,:) = 0 - where ((fracout(:,:,:) .ge. 0.5_wp) .and. (fracout(:,:,:) .lt. 1.5_wp )) fracout_int(:,:,:) = 1 - where ((fracout(:,:,:) .ge. 1.5_wp) .and. (fracout(:,:,:) .lt. 2.5_wp )) fracout_int(:,:,:) = 2 - !! initialize - do i = 1, Npoints - if ( lwp(i) .eq. R_UNDEF ) then ! for non-sunlit columns - cfodd_ntotal(i,:,:,:) = R_UNDEF - wr_occfreq_ntotal(i,:) = R_UNDEF - icod(i,:,:) = R_UNDEF - else - cfodd_ntotal(i,:,:,:) = 0._wp - wr_occfreq_ntotal(i,:) = 0._wp - icod(i,:,:) = 0._wp - endif - enddo - - do i = 1, Npoints - !! check by MODIS retrieval - if ( ( lwp(i) .le. CWP_THRESHOLD .and. lwp(i) .ne. R_UNDEF ) .or. & - & liqcot(i) .le. COT_THRESHOLD .or. & - & liqreff(i) .lt. CFODD_BNDRE(1) .or. & - & liqreff(i) .gt. CFODD_BNDRE(4) .or. & - & iwp(i) .gt. CWP_THRESHOLD .or. & !! exclude ice cloud - & icecot(i) .gt. COT_THRESHOLD .or. & !! exclude ice cloud - & icereff(i) .gt. CFODD_BNDRE(1) ) then !! exclude ice cloud - cycle - else - !! retrieve the CFODD array based on Reff - icls = 0 - if ( liqreff(i) .ge. CFODD_BNDRE(1) .and. liqreff(i) .lt. CFODD_BNDRE(2) ) then - icls = 1 - elseif( liqreff(i) .ge. CFODD_BNDRE(2) .and. liqreff(i) .lt. CFODD_BNDRE(3) ) then - icls = 2 - elseif( liqreff(i) .ge. CFODD_BNDRE(3) .and. liqreff(i) .le. CFODD_BNDRE(4) ) then - icls = 3 - endif - endif - - !CDIR NOLOOPCHG - do j = 1, Ncolumns, 1 - octop = .true. !! initialize - ocbtm = .true. !! initialize - kcbtm = 0 !! initialize - kctop = 0 !! initialize - !CDIR NOLOOPCHG - do k = Nlevels, 1, -1 !! scan from cloud-bottom to cloud-top - if ( dbze(i,j,k) .eq. R_GROUND .or. & - dbze(i,j,k) .eq. R_UNDEF ) cycle - if ( ocbtm .and. & - & fracout_int(i,j,k) .ne. SGCLD_CLR .and. & - & dbze(i,j,k) .ge. CFODD_DBZE_MIN ) then - ocbtm = .false. !! cloud bottom detected - kcbtm = k - kctop = k - endif - if ( octop .and. & !! scan cloud-top - & .not. ocbtm .and. & !! cloud-bottom already detected - & fracout_int(i,j,k) .ne. SGCLD_CLR .and. & !! exclude clear sky - & dbze(i,j,k) .ge. CFODD_DBZE_MIN ) then - kctop = k !! update - endif - enddo !! k loop - if( ocbtm ) cycle !! cloud wasn't detected in this subcolumn - !! check SLWC? - if( temp(i,1,kctop) .lt. tmelt ) cycle !! return to the j (subcolumn) loop - oslwc = .true. - cmxdbz = CFODD_DBZE_MIN !! initialized - - !CDIR NOLOOPCHG - do k = kcbtm, kctop, -1 - cmxdbz = max( cmxdbz, dbze(i,j,k) ) !! column maximum dBZe update - if ( fracout_int(i,j,k) .eq. SGCLD_CLR .or. & - & fracout_int(i,j,k) .eq. SGCLD_CUM .or. & - & dbze (i,j,k) .lt. CFODD_DBZE_MIN ) then - oslwc = .false. - endif - enddo - if ( .not. oslwc ) cycle !! return to the j (subcolumn) loop - - !! warm-rain occurrence frequency - iregime = 0 - if( cmxdbz .lt. CFODD_BNDZE(1) ) then - iregime = 1 !! non-precipitating - elseif( cmxdbz .ge. CFODD_BNDZE(1) .and. cmxdbz .lt. CFODD_BNDZE(2) ) then - iregime = 2 !! drizzling - elseif( cmxdbz .ge. CFODD_BNDZE(2) ) then - iregime = 3 !! raining - endif - wr_occfreq_ntotal(i,iregime) = wr_occfreq_ntotal(i,iregime) + 1._wp - - !! retrievals of ICOD and dBZe bin for CFODD plane - diagcgt = zlev(i,kctop) - zlev(i,kcbtm) - cbtmh = zlev(i,kcbtm) - !CDIR NOLOOPCHG - do k = kcbtm, kctop, -1 - if( k .eq. kcbtm ) then - diagicod = liqcot(i) - else - diagicod = liqcot(i) * ( 1._wp - ( (zlev(i,k)-cbtmh)/diagcgt)**(5._wp/3._wp) ) - endif - icod(i,j,k) = min( diagicod, CFODD_ICOD_MAX ) - enddo - - enddo ! j (Ncolumns) - - !! # of samples for CFODD (joint 2d-histogram dBZe vs ICOD) - call hist2d( dbze(i,1:Ncolumns,1:Nlevels), icod(i,1:Ncolumns,1:Nlevels), & - & Ncolumns*Nlevels, & - & CFODD_HISTDBZE, CFODD_NDBZE, CFODD_HISTICOD, CFODD_NICOD, & - & cfodd_ntotal( i, 1:CFODD_NDBZE, 1:CFODD_NICOD, icls ) ) - - enddo ! i (Npoints) - - RETURN - END SUBROUTINE COSP_DIAG_WARMRAIN - - ! ###################################################################################### - ! FUNCTION hist1D - ! ###################################################################################### - function hist1d(Npoints,var,nbins,bins) - ! Inputs - integer,intent(in) :: & - Npoints, & ! Number of points in input array - Nbins ! Number of bins for sorting - real(wp),intent(in),dimension(Npoints) :: & - var ! Input variable to be sorted - real(wp),intent(in),dimension(Nbins+1) :: & - bins ! Histogram bins [lowest,binTops] - ! Outputs - real(wp),dimension(Nbins) :: & - hist1d ! Output histogram - ! Local variables - integer :: ij - - do ij=2,Nbins+1 - hist1D(ij-1) = count(var .ge. bins(ij-1) .and. var .lt. bins(ij)) - if (count(var .eq. R_GROUND) .ge. 1) hist1D(ij-1)=R_UNDEF - enddo - - end function hist1D - - ! ###################################################################################### - ! SUBROUTINE hist2D - ! ###################################################################################### - subroutine hist2D(var1,var2,npts,bin1,nbin1,bin2,nbin2,jointHist) - implicit none - - ! INPUTS - integer, intent(in) :: & - npts, & ! Number of data points to be sorted - nbin1, & ! Number of bins in histogram direction 1 - nbin2 ! Number of bins in histogram direction 2 - real(wp),intent(in),dimension(npts) :: & - var1, & ! Variable 1 to be sorted into bins - var2 ! variable 2 to be sorted into bins - real(wp),intent(in),dimension(nbin1+1) :: & - bin1 ! Histogram bin 1 boundaries - real(wp),intent(in),dimension(nbin2+1) :: & - bin2 ! Histogram bin 2 boundaries - ! OUTPUTS - real(wp),intent(out),dimension(nbin1,nbin2) :: & - jointHist - - ! LOCAL VARIABLES - integer :: ij,ik - - do ij=2,nbin1+1 - do ik=2,nbin2+1 - jointHist(ij-1,ik-1)=count(var1 .ge. bin1(ij-1) .and. var1 .lt. bin1(ij) .and. & - var2 .ge. bin2(ik-1) .and. var2 .lt. bin2(ik)) - enddo - enddo - end subroutine hist2D - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE cosp_cleanUp - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - subroutine cosp_cleanUp() - deallocate(vgrid_zl,vgrid_zu,vgrid_z,dz) - end subroutine cosp_cleanUp - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE compute_orbitmasks - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - subroutine compute_orbitmasks(Npoints,Nlocaltimes,localtimes,localtime_widths, & - lat,lon,month,day,hour,minute,swath_mask_out,Nswathed_out) - - ! Inputs - integer,intent(in) :: & - Npoints, & - Nlocaltimes - - real(wp),dimension(Nlocaltimes),intent(in) :: & - localtimes, & - localtime_widths - - real(wp),dimension(Npoints),intent(in) :: & - lat, & - lon, & - month, & - day, & - hour, & - minute - - ! Output - logical,dimension(Npoints),intent(out) :: & - swath_mask_out ! Mask of reals over all gridcells - integer,intent(out) :: & - Nswathed_out - - ! Local variables - integer :: i ! iterator - - real(wp),dimension(Npoints,Nlocaltimes) :: & - sat_lon, & ! Central longitude of the instrument. - dlon, & ! distance to satellite longitude in degrees - dx ! distance to satellite longitude in km? - - logical,dimension(Npoints,Nlocaltimes) :: & - swath_mask_all ! Mask of logicals over all local times, gridcells - - integer, dimension(Npoints) :: & - rttov_DOY ! Array of day of year values - real(wp), dimension(Npoints) :: & - localtime_offsets ! Offset values to avoid striping with hourly RT calls. [hours] - ! Compute the day of the year and determine the localtime offset - do i=1,Npoints - call get_DOY(int(month(i)), int(day(i)), rttov_DOY(i)) - end do - localtime_offsets = (mod(rttov_DOY(:), 5) - 2) / 5.0 ! Need to cast to real - - ! Iterate over local times - swath_mask_all(:,:) = .false. - do i=1,Nlocaltimes - ! Calculate the central longitude for each gridcell and orbit - sat_lon(:,i) = 15.0 * (localtimes(i) + localtime_offsets - (hour + minute / 60)) - ! Calculate distance (in degrees) from each grid cell to the satellite central long - dlon(:,i) = mod((lon - sat_lon(:,i) + 180.0), 360.0) - 180.0 - ! calculate distance to satellite in km. Remember to convert to radians for cos/sine calls - dx(:,i) = dlon(:,i) * (pi/180.0) * COS(lat * pi / 180) * radius_earth - ! Determine if a gridcell falls in the swath width - where (abs(dx(:,i))<(localtime_widths(i)*0.5)) - swath_mask_all(:,i) = .true. - end where - end do - - ! Mask is true where values should be calculated - swath_mask_out = ANY( swath_mask_all(:,:),2) ! Compute mask by collapsing the localtimes dimension - Nswathed_out = count(swath_mask_out) ! Number of gridcells that should be calculated. - - end subroutine compute_orbitmasks - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE get_DOY - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - subroutine get_DOY(month, day, DOY) - - integer,intent(in) :: & - month, & - day - integer,intent(out) :: & - DOY - - ! This subroutine does not handle leap years because it is not relevant to the purpose. - ! Simple look-up table for DOY. - if (month .eq. 1) DOY = day - if (month .eq. 2) DOY = 31 + day - if (month .eq. 3) DOY = 59 + day - if (month .eq. 4) DOY = 90 + day - if (month .eq. 5) DOY = 120 + day - if (month .eq. 6) DOY = 151 + day - if (month .eq. 7) DOY = 181 + day - if (month .eq. 8) DOY = 212 + day - if (month .eq. 9) DOY = 243 + day - if (month .eq. 10) DOY = 273 + day - if (month .eq. 11) DOY = 304 + day - if (month .eq. 12) DOY = 334 + day - - end subroutine get_DOY - -END MODULE MOD_COSP_STATS diff --git a/dplrw_src/cosp_utils.F90 b/dplrw_src/cosp_utils.F90 deleted file mode 100755 index 467b317a0b..0000000000 --- a/dplrw_src/cosp_utils.F90 +++ /dev/null @@ -1,190 +0,0 @@ -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -! Copyright (c) 2015, Regents of the University of Colorado -! All rights reserved. -! -! Redistribution and use in source and binary forms, with or without modification, are -! permitted provided that the following conditions are met: -! -! 1. Redistributions of source code must retain the above copyright notice, this list of -! conditions and the following disclaimer. -! -! 2. Redistributions in binary form must reproduce the above copyright notice, this list -! of conditions and the following disclaimer in the documentation and/or other -! materials provided with the distribution. -! -! 3. Neither the name of the copyright holder nor the names of its contributors may be -! used to endorse or promote products derived from this software without specific prior -! written permission. -! -! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL -! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT -! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -! -! History: -! Jul 2007 - A. Bodas-Salcedo - Initial version -! May 2015 - Dustin Swales - Modified for COSPv2.0 -! -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -MODULE MOD_COSP_UTILS - USE COSP_KINDS, ONLY: wp - USE MOD_COSP_CONFIG - USE mod_quickbeam_optics, only: size_distribution - use mod_cosp_error, only: errorMessage - IMPLICIT NONE - -CONTAINS -!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -!------------------- SUBROUTINE COSP_PRECIP_MXRATIO -------------- -!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -! SUBROUTINE COSP_PRECIP_MXRATIO(Npoints,Nlevels,Ncolumns,p,T,prec_frac,prec_type, & -! n_ax,n_bx,alpha_x,c_x,d_x,g_x,a_x,b_x,gamma1,gamma2,gamma3,gamma4, & -! flux,mxratio,reff) - -! ! Input arguments, (IN) -! integer,intent(in) :: Npoints,Nlevels,Ncolumns -! real(wp),intent(in),dimension(Npoints,Nlevels) :: p,T,flux -! real(wp),intent(in),dimension(Npoints,Ncolumns,Nlevels) :: prec_frac -! real(wp),intent(in) :: n_ax,n_bx,alpha_x,c_x,d_x,g_x,a_x,b_x,gamma1,gamma2,gamma3,gamma4,prec_type -! ! Input arguments, (OUT) -! real(wp),intent(out),dimension(Npoints,Ncolumns,Nlevels) :: mxratio -! real(wp),intent(inout),dimension(Npoints,Ncolumns,Nlevels) :: reff -! ! Local variables -! integer :: i,j,k -! real(wp) :: sigma,one_over_xip1,xi,rho0,rho,lambda_x,gamma_4_3_2,delta - -! mxratio = 0.0 - -! if (n_ax >= 0.0) then ! N_ax is used to control which hydrometeors need to be computed -! xi = d_x/(alpha_x + b_x - n_bx + 1._wp) -! rho0 = 1.29_wp -! sigma = (gamma2/(gamma1*c_x))*(n_ax*a_x*gamma2)**xi -! one_over_xip1 = 1._wp/(xi + 1._wp) -! gamma_4_3_2 = 0.5_wp*gamma4/gamma3 -! delta = (alpha_x + b_x + d_x - n_bx + 1._wp) -! do k=1,Nlevels -! do j=1,Ncolumns -! do i=1,Npoints -! if ((prec_frac(i,j,k)==prec_type).or.(prec_frac(i,j,k)==3.)) then -! rho = p(i,k)/(287.05_wp*T(i,k)) -! mxratio(i,j,k)=(flux(i,k)*((rho/rho0)**g_x)*sigma)**one_over_xip1 -! mxratio(i,j,k)=mxratio(i,j,k)/rho -! ! Compute effective radius -! if ((reff(i,j,k) <= 0._wp).and.(flux(i,k) /= 0._wp)) then -! lambda_x = (a_x*c_x*((rho0/rho)**g_x)*n_ax*gamma1/flux(i,k))**(1._wp/delta) -! reff(i,j,k) = gamma_4_3_2/lambda_x -! endif -! endif -! enddo -! enddo -! enddo -! endif -! END SUBROUTINE COSP_PRECIP_MXRATIO - - SUBROUTINE COSP_PRECIP_MXRATIO(Npoints,Nlevels,Ncolumns, & - p,T,prec_frac,prec_type, index, sd, & - flux, mxratio, reff) - ! Input arguments, (IN) - integer,intent(in) :: Npoints,Nlevels,Ncolumns,index - real(wp),intent(in),dimension(Npoints,Nlevels) :: p,T,flux - real(wp),intent(in),dimension(Npoints,Ncolumns,Nlevels) :: prec_frac - real(wp),intent(in) :: prec_type - type(size_distribution),intent(in) :: sd - ! Input arguments, (OUT) - real(wp),intent(out),dimension(Npoints,Ncolumns,Nlevels) :: mxratio - real(wp),intent(inout),dimension(Npoints,Ncolumns,Nlevels) :: reff - ! Local variables - real(wp) :: pi = 3.14159265358979323846264338327950288419717_wp - integer :: i,j,k - real(wp) :: sigma,one_over_xip1,xi,rho0,rho,lambda_x,gamma_4_3_2,delta - real(wp) :: apm,bpm,mu,D0,Dm ! modified gamma DSD - real(wp) :: lambda,N0 ! exponential DSD - real(wp) :: avf,bvf,vscs_fct ! fall velocity params - - !!! single-moment bulk microphysics is assumed !!! - - if (sd%apm(index) > 0) then - apm = sd%apm(index) - bpm = sd%bpm(index) - else if (sd%rho(index) > 0) then - apm = sd%rho(index)*pi/6._wp - bpm = 3._wp - else - call errorMessage('!!! unexpected sd, at COSP_PRECIP_MXRATIO !!!') - end if - - ! fall velocity params - select case(sd%ftype(index)) - case(1) - ! vf = a * D**b - avf = sd%f1(index) - bvf = sd%f2(index) - case(2) - ! PL08 formulation - call errorMessage('!!! not implemented yet, PL08 formulation, at COSP_PRECIP_MXRATIO') - end select - - ! size distribution params - select case(sd%dtype(index)) - case(1) - Dm = sd%p2(index) - mu = sd%p3(index) - if (Dm < 0 .or. mu < 0) then - call errorMessage('!!! mod.gamma DSD requires mean D and mu, at COSP_PRECIP_MXRATIO') - end if - case(2) - N0 = sd%p1(index) - if (N0 < 0) then - call errorMessage('!!! exp. DSD requires N0, at COSP_PRECIP_MXRATIO') - end if - case default - call errorMessage('!!! not implemented yet, sd%dtype=3,4,5, at COSP_PRECIP_MXRATIO') - end select - - do k=1,Nlevels - do j=1,Ncolumns - do i=1,Npoints - if ((prec_frac(i,j,k)/=prec_type).and.(prec_frac(i,j,k)/=3.)) cycle - rho0 = 1.29_wp - rho = p(i,k)/(287.05_wp*T(i,k)) - vscs_fct = merge(sqrt(rho0/rho),1._wp,sd%fvscs(index)==1) - - select case(sd%dtype(index)) - case(1) ! modified gamma - if (flux(i,k) > 1.D-20) then - D0 = Dm*gamma(mu)/gamma(mu+1._wp) * 1.D-6 ! um -> m - mxratio(i,j,k) = flux(i,k)/vscs_fct/avf/D0**bvf * gamma(mu+bpm)/gamma(mu+bvf+bpm) / rho - if (reff(i,j,k) < 1.D-20) then - reff(i,j,k) = D0/2._wp*gamma(mu+3._wp)/gamma(mu+2._wp) - end if - else - mxratio(i,j,k) = 0._wp ; reff(i,j,k) = 0._wp - end if - - case(2) ! exponential - if (flux(i,k) > 1.D-20) then - lambda = (vscs_fct*apm*avf*N0*gamma(1._wp+bpm+bvf)/flux(i,k))**(1._wp/(1._wp+bpm+bvf)) - mxratio(i,j,k) = flux(i,k)/vscs_fct/avf*lambda**bvf*gamma(1._wp+bpm)/gamma(1._wp+bpm+bvf) - if (reff(i,j,k) < 1.D-20) then - reff(i,j,k) = 0.5_wp/lambda*gamma(4._wp)/gamma(3._wp) - end if - else - mxratio(i,j,k) = 0._wp ; reff(i,j,k) = 0._wp - end if - - case default - call errorMessage('!!! not implemented yet, sd%dtype=3,4,5, at COSP_PRECIP_MXRATIO') - end select - - end do - end do - end do - - END SUBROUTINE COSP_PRECIP_MXRATIO - -END MODULE MOD_COSP_UTILS diff --git a/dplrw_src/quickbeam.F90 b/dplrw_src/quickbeam.F90 deleted file mode 100644 index 50a67e0829..0000000000 --- a/dplrw_src/quickbeam.F90 +++ /dev/null @@ -1,971 +0,0 @@ -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -! Copyright (c) 2015, Regents of the University of Colorado -! All rights reserved. -! -! Redistribution and use in source and binary forms, with or without modification, are -! permitted provided that the following conditions are met: -! -! 1. Redistributions of source code must retain the above copyright notice, this list of -! conditions and the following disclaimer. -! -! 2. Redistributions in binary form must reproduce the above copyright notice, this list -! of conditions and the following disclaimer in the documentation and/or other -! materials provided with the distribution. -! -! 3. Neither the name of the copyright holder nor the names of its contributors may be -! used to endorse or promote products derived from this software without specific prior -! written permission. -! -! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL -! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT -! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -! -! History -! 11/2005: John Haynes - Created -! 09/2006 placed into subroutine form (Roger Marchand,JMH) -! 08/2007 added equivalent volume spheres, Z and N scalling most distrubtion types (Roger Marchand) -! 01/2008 'Do while' to determine if hydrometeor(s) present in volume -! changed for vectorization purposes (A. Bodas-Salcedo) -! -! 07/2010 V3.0 ... Modified to load or save scale factors to disk as a Look-Up Table (LUT) -! ... All hydrometeor and radar simulator properties now included in hp structure -! ... hp structure should be initialized by call to radar_simulator_init prior -! ... to calling this subroutine. -! Also ... Support of Morrison 2-moment style microphyscis (Np_matrix) added -! ... Changes implement by Roj Marchand following work by Laura Fowler -! -! 10/2011 Modified ngate loop to go in either direction depending on flag -! hp%radar_at_layer_one. This affects the direction in which attenuation is summed. -! -! Also removed called to AVINT for gas and hydrometeor attenuation and replaced with simple -! summation. (Roger Marchand) -! May 2015 - D. Swales - Modified for COSPv2.0 -! Jun 2025 - J.K. Shaw - Parameters and DDT moved to cosp_stats.F90 for interface swathing -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -module quickbeam - USE COSP_KINDS, ONLY: wp - USE MOD_COSP_CONFIG, ONLY: R_UNDEF,cloudsat_histRef,use_vgrid,vgrid_zl,vgrid_zu,& - pClass_noPrecip, pClass_Rain1, pClass_Rain2, pClass_Rain3,& - pClass_Snow1, pClass_Snow2, pClass_Mixed1, pClass_Mixed2, & - pClass_Rain4, pClass_default, Zenonbinval, Zbinvallnd, & - N_HYDRO,nCloudsatPrecipClass,cloudsat_preclvl - - USE MOD_COSP_STATS, ONLY: COSP_LIDAR_ONLY_CLOUD,hist1D,COSP_CHANGE_VERTICAL_GRID, & - maxhclass,nRe_types,nd,mt_ntt,Re_BIN_LENGTH,Re_MAX_BIN, & - dmin,dmax,radar_cfg - implicit none - -contains - ! ###################################################################################### - ! SUBROUTINE quickbeam_subcolumn - ! ###################################################################################### - subroutine quickbeam_subcolumn(rcfg,nprof,ngate,hgt_matrix,z_vol,kr_vol,g_vol,dBZe,Ze_non) - - ! INPUTS - type(radar_cfg),intent(inout) :: & - rcfg ! Derived type for radar simulator setup - integer,intent(in) :: & - nprof, & ! Number of hydrometeor profiles - ngate ! Number of vertical layers - real(wp),intent(in),dimension(nprof,ngate) :: & - hgt_matrix, & ! Height of hydrometeors (km) - z_vol, & ! Effective reflectivity factor (mm^6/m^3) - kr_vol, & ! Attenuation coefficient hydro (dB/km) - g_vol ! Attenuation coefficient gases (dB/km) - - ! OUTPUTS - real(wp), intent(out),dimension(nprof,ngate) :: & - Ze_non, & ! Radar reflectivity without attenuation (dBZ) - dBZe ! Effective radar reflectivity factor (dBZ) - - ! LOCAL VARIABLES - integer :: k,pr,start_gate,end_gate,d_gate - real(wp),dimension(nprof,ngate) :: & - g_to_vol, & ! Gaseous atteunation, radar to vol (dB) - a_to_vol ! Hydromets attenuation, radar to vol (dB) - - ! Load scaling matricies from disk -- but only the first time this subroutine is called - if(rcfg%load_scale_LUTs) then - call load_scale_LUTs(rcfg) - rcfg%load_scale_LUTs=.false. - rcfg%Z_scale_added_flag = .false. ! will be set true if scaling Look Up Tables are modified during run - endif - - ! Initialization - g_to_vol = 0._wp - a_to_vol = 0._wp - - ! Loop over each range gate (ngate) ... starting with layer closest to the radar ! - if(rcfg%radar_at_layer_one) then - start_gate = 1 - end_gate = ngate - d_gate = 1 - else - start_gate = ngate - end_gate = 1 - d_gate = -1 - endif - do k=start_gate,end_gate,d_gate - ! Loop over each profile (nprof) - do pr=1,nprof - ! Attenuation due to hydrometeors between radar and volume - - ! NOTE old scheme integrates attenuation only for the layers ABOVE - ! the current layer ... i.e. 1 to k-1 rather than 1 to k ... - ! which may be a problem. ROJ - ! in the new scheme I assign half the attenuation to the current layer - if(d_gate==1) then - ! dheight calcuations assumes hgt_matrix points are the cell mid-points. - if (k>2) then - ! add to previous value to half of above layer + half of current layer - a_to_vol(pr,k)= a_to_vol(pr,k-1) + & - (kr_vol(pr,k-1)+kr_vol(pr,k))*(hgt_matrix(pr,k-1)-hgt_matrix(pr,k)) - else - a_to_vol(pr,k)= kr_vol(pr,k)*(hgt_matrix(pr,k)-hgt_matrix(pr,k+1)) - endif - else ! d_gate==-1 - if(k1) then - ! Add to previous value to half of above layer + half of current layer - g_to_vol(pr,k) = g_to_vol(pr,k-1) + & - 0.5*(g_vol(pr,k-1)+g_vol(pr,k))*(hgt_matrix(pr,k-1)-hgt_matrix(pr,k)) - else - g_to_vol(pr,k)= 0.5_wp*g_vol(pr,k)*(hgt_matrix(pr,k)-hgt_matrix(pr,k+1)) - endif - else ! d_gate==-1 - if (k 0._wp) - Ze_non(1:nprof,1:ngate) = 10._wp*log10(z_vol(1:nprof,1:ngate)) - dBZe(1:nprof,1:ngate) = Ze_non(1:nprof,1:ngate)-a_to_vol(1:nprof,1:ngate)-g_to_vol(1:nprof,1:ngate) - elsewhere - dBZe(1:nprof,1:ngate) = R_UNDEF - Ze_non(1:nprof,1:ngate) = R_UNDEF - end where - - ! Save any updates made - if (rcfg%update_scale_LUTs) call save_scale_LUTs(rcfg) - - end subroutine quickbeam_subcolumn - ! ###################################################################################### - ! SUBROUTINE quickbeam_column - ! ###################################################################################### - subroutine quickbeam_column(npoints, ncolumns, nlevels, llm, DBZE_BINS, platform, & - Ze_tot, Ze_tot_non, land, surfelev, t2m, fracPrecipIce, zlev, zlev_half, cfad_ze, & - cloudsat_precip_cover, cloudsat_pia) - ! Inputs - integer,intent(in) :: & - npoints, & ! Number of horizontal grid points - ncolumns, & ! Number of subcolumns - nlevels, & ! Number of vertical layers in OLD grid - llm, & ! Number of vertical layers in NEW grid - DBZE_BINS ! Number of bins for cfad. - character(len=*),intent(in) :: & - platform ! Name of platform (e.g. cloudsat) - real(wp),dimension(Npoints),intent(in) :: & - land, & ! Land/Sea mask. (1/0) - surfelev, & ! Surface Elevation (m) - t2m ! Near-surface temperature - real(wp),dimension(Npoints,Ncolumns),intent(in) :: & - fracPrecipIce ! Fraction of precipitation which is frozen. (1) - real(wp),intent(in),dimension(npoints,ncolumns,Nlevels) :: & - Ze_tot, & ! Effective reflectivity factor (dBZ) - Ze_tot_non ! Effective reflectivity factor w/o attenuation (dBZ) - real(wp),intent(in),dimension(npoints,Nlevels) :: & - zlev ! Model full levels - real(wp),intent(in),dimension(npoints,Nlevels) :: & - zlev_half ! Model half levels - - ! Outputs - real(wp),intent(inout),dimension(npoints,DBZE_BINS,llm) :: & - cfad_ze ! - real(wp),dimension(Npoints,nCloudsatPrecipClass),intent(out) :: & - cloudsat_precip_cover ! Model precip rate in by CloudSat precip flag - real(wp),dimension(Npoints),intent(out) :: & - cloudsat_pia ! Cloudsat path integrated attenuation - - ! Local variables - integer :: i,j - real(wp) :: zstep - real(wp),dimension(npoints,ncolumns,llm) :: ze_toti,ze_noni - logical :: lcloudsat = .false. - - ! Which platforms to create diagnostics for? - if (platform .eq. 'cloudsat') lcloudsat=.true. - - ! Create Cloudsat diagnostics. - if (lcloudsat) then - cloudsat_precip_cover = 0._wp - cloudsat_pia = 0._wp - if (use_vgrid) then - ! Regrid in the vertical (*NOTE* This routine requires SFC-2-TOA ordering, so flip - ! inputs and outputs to maintain TOA-2-SFC ordering convention in COSP2.) - call cosp_change_vertical_grid(Npoints,Ncolumns,Nlevels,zlev(:,nlevels:1:-1),& - zlev_half(:,nlevels:1:-1),Ze_tot(:,:,nlevels:1:-1),llm,vgrid_zl(llm:1:-1),& - vgrid_zu(llm:1:-1),Ze_toti(:,:,llm:1:-1),log_units=.true.) - - ! Effective reflectivity histogram - do i=1,Npoints - do j=1,llm - cfad_ze(i,:,j) = hist1D(Ncolumns,Ze_toti(i,:,j),DBZE_BINS,cloudsat_histRef) - enddo - enddo - where(cfad_ze .ne. R_UNDEF) cfad_ze = cfad_ze/Ncolumns - - ! Compute cloudsat near-surface precipitation diagnostics - ! First, regrid in the vertical Ze_tot_non. - call cosp_change_vertical_grid(Npoints,Ncolumns,Nlevels,zlev(:,nlevels:1:-1),& - zlev_half(:,nlevels:1:-1),Ze_tot_non(:,:,nlevels:1:-1),llm,vgrid_zl(llm:1:-1),& - vgrid_zu(llm:1:-1),Ze_noni(:,:,llm:1:-1),log_units=.true.) - ! Compute the zstep distance between two atmopsheric layers - zstep = vgrid_zl(1)-vgrid_zl(2) - ! Now call routine to generate diagnostics. - call cloudsat_precipOccurence(Npoints, Ncolumns, llm, N_HYDRO, Ze_toti, Ze_noni, & - land, surfelev, t2m, fracPrecipIce, cloudsat_precip_cover, cloudsat_pia, zstep) - else - ! Effective reflectivity histogram - do i=1,Npoints - do j=1,llm - cfad_ze(i,:,j) = hist1D(Ncolumns,Ze_tot(i,:,j),DBZE_BINS,cloudsat_histRef) - enddo - enddo - where(cfad_ze .ne. R_UNDEF) cfad_ze = cfad_ze/Ncolumns - endif - endif - - end subroutine quickbeam_column - ! ############################################################################################## - ! ############################################################################################## - ! ###################################################################################### - ! SUBROUTINE cloudsat_precipOccurence - ! - ! Notes from July 2016: Add precip flag also looped over subcolumns - ! Modified by Tristan L'Ecuyer (TSL) to add precipitation flagging - ! based on CloudSat's 2C-PRECIP-COLUMN algorithm (Haynes et al, JGR, 2009). - ! To mimic the satellite algorithm, this code applies thresholds to non-attenuated - ! reflectivities, Ze_non, consistent with those outlined in Haynes et al, JGR (2009). - ! - ! Procedures/Notes: - ! - ! (1) If the 2-way attenuation exceeds 40 dB, the pixel will be flagged as 'heavy rain' - ! consistent with the multiple-scattering analysis of Battaglia et al, JGR (2008). - ! (2) Rain, snow, and mixed precipitation scenes are separated according to the fraction - ! of the total precipitation hydrometeor mixing ratio that exists as ice. - ! (3) The entire analysis is applied to the range gate from 480-960 m to be consistent with - ! CloudSat's 720 m ground-clutter. - ! (4) Only a single flag is assigned to each model grid since there is no variation in - ! hydrometeor contents across a single model level. Unlike CFADs, whose variation enters - ! due to differening attenuation corrections from hydrometeors aloft, the non-attenuated - ! reflectivities used in the computation of this flag cannot vary across sub-columns. - ! - ! radar_prec_flag = 1-Rain possible 2-Rain probable 3-Rain certain - ! 4-Snow possible 5-Snow certain - ! 6-Mixed possible 7-Mixed certain - ! 8-Heavy Rain - ! 9- default value - ! - ! Modified by Dustin Swales (University of Colorado) for use with COSP2. - ! *NOTE* All inputs (Ze_out, Ze_non_out, fracPrecipIce) are at a single level from the - ! statistical output grid used by Cloudsat. This level is controlled by the - ! parameter cloudsat_preclvl, defined in src/cosp_config.F90 - ! ###################################################################################### - subroutine cloudsat_precipOccurence(Npoints, Ncolumns, llm, Nhydro, Ze_out, Ze_non_out, & - land, surfelev, t2m, fracPrecipIce, cloudsat_precip_cover, cloudsat_pia, zstep) - - ! Inputs - integer,intent(in) :: & - Npoints, & ! Number of columns - Ncolumns, & ! Numner of subcolumns - Nhydro, & ! Number of hydrometeor types - llm ! Number of levels - real(wp),dimension(Npoints),intent(in) :: & - land, & ! Land/Sea mask. (1/0) - surfelev, & ! Surface Elevation (m) - t2m ! Near-surface temperature - real(wp),dimension(Npoints,Ncolumns,llm),intent(in) :: & - Ze_out, & ! Effective reflectivity factor (dBZ) - Ze_non_out ! Effective reflectivity factor, w/o attenuation (dBZ) - real(wp),dimension(Npoints,Ncolumns),intent(in) :: & - fracPrecipIce ! Fraction of precipitation which is frozen. (1) - real(wp),intent(in) :: & - zstep ! Distance between two atmopsheric layers (m) - - ! Outputs - real(wp),dimension(Npoints,nCloudsatPrecipClass),intent(out) :: & - cloudsat_precip_cover ! Model precip rate in by CloudSat precip flag - real(wp),dimension(Npoints),intent(out) :: & - cloudsat_pia ! Cloudsat path integrated attenuation - - ! Local variables - integer,dimension(Npoints,Ncolumns) :: & - cloudsat_pflag, & ! Subcolumn precipitation flag - cloudsat_precip_pia ! Subcolumn path integrated attenutation. - integer,dimension(Npoints) :: & - cloudsat_preclvl_index ! Altitude index for precip flags calculation - ! in 40-level grid (one layer above surfelev) - integer :: pr,i,k - real(wp) :: Zmax - - ! Initialize - cloudsat_pflag(:,:) = pClass_default - cloudsat_precip_pia(:,:) = 0._wp - cloudsat_precip_cover(:,:) = 0._wp - cloudsat_pia(:) = 0._wp - cloudsat_preclvl_index(:) = 0._wp - - ! Computing altitude index for precip flags calculation - cloudsat_preclvl_index(:) = cloudsat_preclvl - floor( surfelev(:)/zstep ) - - ! ###################################################################################### - ! SUBCOLUMN processing - ! ###################################################################################### - do i=1, Npoints - do pr=1,Ncolumns - ! Compute precipitation flag - ! ################################################################################ - ! 1) Oceanic points. - ! ################################################################################ - if (land(i) .eq. 0) then - - ! 1a) Compute the PIA in all profiles containing hydrometeors - if ( (Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.-100) .and. (Ze_out(i,pr,cloudsat_preclvl_index(i)).gt.-100) ) then - if ( (Ze_non_out(i,pr,cloudsat_preclvl_index(i)).lt.100) .and. (Ze_out(i,pr,cloudsat_preclvl_index(i)).lt.100) ) then - cloudsat_precip_pia(i,pr) = Ze_non_out(i,pr,cloudsat_preclvl_index(i)) - Ze_out(i,pr,cloudsat_preclvl_index(i)) - endif - endif - - ! Snow - if(fracPrecipIce(i,pr).gt.0.9) then - if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(2)) then - cloudsat_pflag(i,pr) = pClass_Snow2 ! TSL: Snow certain - endif - if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(4).and. & - Ze_non_out(i,pr,cloudsat_preclvl_index(i)).le.Zenonbinval(2)) then - cloudsat_pflag(i,pr) = pClass_Snow1 ! TSL: Snow possible - endif - endif - - ! Mixed - if(fracPrecipIce(i,pr).gt.0.1.and.fracPrecipIce(i,pr).le.0.9) then - if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(2)) then - cloudsat_pflag(i,pr) = pClass_Mixed2 ! TSL: Mixed certain - endif - if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(4).and. & - Ze_non_out(i,pr,cloudsat_preclvl_index(i)).le.Zenonbinval(2)) then - cloudsat_pflag(i,pr) = pClass_Mixed1 ! TSL: Mixed possible - endif - endif - - ! Rain - if(fracPrecipIce(i,pr).le.0.1) then - if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(1)) then - cloudsat_pflag(i,pr) = pClass_Rain3 ! TSL: Rain certain - endif - if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(3).and. & - Ze_non_out(i,pr,cloudsat_preclvl_index(i)).le.Zenonbinval(1)) then - cloudsat_pflag(i,pr) = pClass_Rain2 ! TSL: Rain probable - endif - if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(4).and. & - Ze_non_out(i,pr,cloudsat_preclvl_index(i)).le.Zenonbinval(3)) then - cloudsat_pflag(i,pr) = pClass_Rain1 ! TSL: Rain possible - endif - if(cloudsat_precip_pia(i,pr).gt.40) then - cloudsat_pflag(i,pr) = pClass_Rain4 ! TSL: Heavy Rain - endif - endif - - ! No precipitation - if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).le.-15) then - cloudsat_pflag(i,pr) = pClass_noPrecip ! TSL: Not Raining - endif - endif ! Ocean points - - ! ################################################################################ - ! 2) Land points. - ! *NOTE* For land points we go up a layer higher, so cloudsat_preclvl_index(i)-1 - ! - ! ################################################################################ - if (land(i) .eq. 1) then - ! 2a) Compute the PIA in all profiles containing hydrometeors - if ( (Ze_non_out(i,pr,cloudsat_preclvl_index(i)-1).gt.-100) .and. (Ze_out(i,pr,cloudsat_preclvl_index(i)-1).gt.-100) ) then - if ( (Ze_non_out(i,pr,cloudsat_preclvl_index(i)-1).lt.100) .and. (Ze_out(i,pr,cloudsat_preclvl_index(i)-1).lt.100) ) then - cloudsat_precip_pia(i,pr) = Ze_non_out(i,pr,cloudsat_preclvl_index(i)-1) - Ze_out(i,pr,cloudsat_preclvl_index(i)-1) - endif - endif - - ! Find Zmax, the maximum reflectivity value in the attenuated profile (Ze_out); - Zmax=maxval(Ze_out(i,pr,:)) - - ! Snow (T<273) - if(t2m(i) .lt. 273._wp) then - if(Ze_out(i,pr,cloudsat_preclvl_index(i)-1) .gt. Zbinvallnd(5)) then - cloudsat_pflag(i,pr) = pClass_Snow2 ! JEK: Snow certain - endif - if(Ze_out(i,pr,cloudsat_preclvl_index(i)-1) .gt. Zbinvallnd(6) .and. & - Ze_out(i,pr,cloudsat_preclvl_index(i)-1).le.Zbinvallnd(5)) then - cloudsat_pflag(i,pr) = pClass_Snow1 ! JEK: Snow possible - endif - endif - - ! Mized phase (273275) - if(t2m(i) .gt. 275) then - if ((Zmax .gt. Zbinvallnd(1) .and. cloudsat_precip_pia(i,pr).gt.30) .or. & - (Ze_out(i,pr,cloudsat_preclvl_index(i)-1) .gt. Zbinvallnd(2))) then - cloudsat_pflag(i,pr) = pClass_Rain3 ! JEK: Rain certain - endif - if((Ze_out(i,pr,cloudsat_preclvl_index(i)-1) .gt. Zbinvallnd(6)) .and. & - (Zmax .gt. Zbinvallnd(3))) then - cloudsat_pflag(i,pr) = pClass_Rain2 ! JEK: Rain probable - endif - if((Ze_out(i,pr,cloudsat_preclvl_index(i)-1) .gt. Zbinvallnd(6)) .and. & - (Zmax.lt.Zbinvallnd(3))) then - cloudsat_pflag(i,pr) = pClass_Rain1 ! JEK: Rain possible - endif - if(cloudsat_precip_pia(i,pr).gt.40) then - cloudsat_pflag(i,pr) = pClass_Rain4 ! JEK: Heavy Rain - endif - endif - - ! No precipitation - if(Ze_out(i,pr,cloudsat_preclvl_index(i)-1) .le. -15) then - cloudsat_pflag(i,pr) = pClass_noPrecip ! JEK: Not Precipitating - endif - endif ! Land points - enddo ! Sub-columns - enddo ! Gridpoints - - ! ###################################################################################### - ! COLUMN processing - ! ###################################################################################### - - ! Aggregate subcolumns - do i=1,Npoints - ! Gridmean precipitation fraction for each precipitation type - do k=1,nCloudsatPrecipClass - if (any(cloudsat_pflag(i,:) .eq. k-1)) then - cloudsat_precip_cover(i,k) = count(cloudsat_pflag(i,:) .eq. k-1) - endif - enddo - - ! Gridmean path integrated attenuation (pia) - cloudsat_pia(i)=sum(cloudsat_precip_pia(i,:)) - enddo - - ! Normalize by number of subcolumns - where ((cloudsat_precip_cover /= R_UNDEF).and.(cloudsat_precip_cover /= 0.0)) & - cloudsat_precip_cover = cloudsat_precip_cover / Ncolumns - where ((cloudsat_pia/= R_UNDEF).and.(cloudsat_pia/= 0.0)) & - cloudsat_pia = cloudsat_pia / Ncolumns - - end subroutine cloudsat_precipOccurence - - ! ############################################################################################## - ! ############################################################################################## - subroutine quickbeam_dplrw(Npoints, Ncolumns, Nlevels, rcfg, & - hgt_matrix, hgt_matrix_half, surfelev, & - at, pfull, & - gwvel, gcumf, & - vfall_in, vfsqu_in, zehyd_in, & - g_vol, krhyd_in, & - vtrm3_in, vtrm0_in, mmnt3_in, mmnt0_in, & - gcumw, & - dplrw_Z, spwid_Z, Zef94_Z, & - dplrw_T, spwid_T, Zef94_T, & - ZefVd_2, & - vfall_Z, gridw_Z, & - vfall_T, gridw_T, ZefVf_2 ) - USE MOD_COSP_CONFIG, ONLY: Nlvgrid, N_HYDRO, & - trbl_LS, trbl_CU, & - Nlvtemp, lvtemp_WID, lvtemp_MAX, lvtemp_MIN, & - NlvdBZe, lvdBZe_WID, lvdBZe_MAX, lvdBZe_MIN, & - Nlvdplr, lvdplr_WID, lvdplr_MAX, lvdplr_MIN, & - Nlvspwd, lvspwd_WID, lvspwd_MAX, lvspwd_MIN - - integer,intent(in) :: Npoints, Ncolumns, Nlevels - type(radar_cfg),intent(in) :: rcfg - real(wp),intent(in),dimension(npoints,nlevels) :: hgt_matrix, hgt_matrix_half, at, pfull - real(wp),intent(in),dimension(npoints) :: surfelev - real(wp),intent(in),dimension(npoints,nlevels) :: gwvel,gcumf - logical,dimension(npoints,ncolumns,nlevels,N_HYDRO) :: flags - real(wp),intent(in),dimension(npoints,ncolumns,nlevels,N_HYDRO) :: vfall_in, vfsqu_in, zehyd_in - real(wp),dimension(npoints,ncolumns,nlevels,N_HYDRO) :: vfall, vfsqu, zehyd - real(wp),intent(in),dimension(npoints,ncolumns,nlevels,N_HYDRO) :: vtrm3_in,vtrm0_in,mmnt3_in,mmnt0_in - real(wp),dimension(npoints,ncolumns,nlevels,N_HYDRO) :: vtrm3,vtrm0,mmnt3,mmnt0 - !=== - real(wp),intent(out),dimension(npoints,nlevels) :: gcumw - !=== - real(wp),dimension(npoints,nlevels+1) :: hgt_bnd - real(wp),intent(in),dimension(npoints,nlevels) :: g_vol - real(wp),dimension(npoints,nlevels) :: att_gas - real(wp),intent(in),dimension(npoints,ncolumns,nlevels,N_HYDRO) :: krhyd_in - real(wp),dimension(npoints,ncolumns,nlevels,N_HYDRO) :: krhyd - real(wp),dimension(npoints,ncolumns,nlevels,0:2) :: att_hyd - real(wp) :: krLS, krCU - integer :: sta,end,dif - !=== - real(wp),intent(out),dimension(npoints,Nlvdplr,Nlvgrid,0:2) :: dplrw_Z - real(wp),intent(out),dimension(npoints,Nlvspwd,Nlvgrid,0:2) :: spwid_Z - real(wp),intent(out),dimension(npoints,NlvdBZe,Nlvgrid,0:2) :: Zef94_Z - real(wp),intent(out),dimension(npoints,Nlvdplr,Nlvtemp,0:2) :: dplrw_T - real(wp),intent(out),dimension(npoints,Nlvspwd,Nlvtemp,0:2) :: spwid_T - real(wp),intent(out),dimension(npoints,NlvdBZe,Nlvtemp,0:2) :: Zef94_T - real(wp),intent(out),dimension(npoints,Nlvdplr,NlvdBZe,0:2) :: ZefVd_2 - !=== - real(wp),intent(out),dimension(npoints,Nlvdplr,Nlvgrid,0:2,3) :: vfall_Z - real(wp),intent(out),dimension(npoints,Nlvdplr,Nlvgrid,0:2) :: gridw_Z - real(wp),intent(out),dimension(npoints,Nlvdplr,Nlvtemp,0:2,3) :: vfall_T - real(wp),intent(out),dimension(npoints,Nlvdplr,Nlvtemp,0:2) :: gridw_T - real(wp),intent(out),dimension(npoints,Nlvdplr,NlvdBZe,0:2,3) :: ZefVf_2 - !=== - integer :: dbin, sbin, zbin, tbin, hbin, vbin, wbin - integer :: i,j,k,n,is,js,id,tp - real(wp) :: zesum(0:2),vdmn(0:2),swmn(0:2) - real(wp) :: vfmn(0:2,3),gwmn(0:2),m0sum(0:2),m3sum(0:2) - real(wp) :: intp,es,qs,Tvs - real(wp),dimension(Npoints,Nlvdplr,Nlevels,0:2) :: workD - real(wp),dimension(Npoints,Nlvspwd,Nlevels,0:2) :: workS - real(wp),dimension(Npoints,NlvdBZe,Nlevels,0:2) :: workZ - real(wp),dimension(Npoints,Nlvdplr,Nlevels,0:2,3) :: workV - real(wp),dimension(Npoints,Nlvdplr,Nlevels,0:2) :: workW - - integer,parameter :: & - I_LSCLIQ = 1, & ! Large-scale (stratiform) liquid - I_LSCICE = 2, & ! Large-scale (stratiform) ice - I_LSRAIN = 3, & ! Large-scale (stratiform) rain - I_LSSNOW = 4, & ! Large-scale (stratiform) snow - I_CVCLIQ = 5, & ! Convective liquid - I_CVCICE = 6, & ! Convective ice - I_CVRAIN = 7, & ! Convective rain - I_CVSNOW = 8, & ! Convective snow - I_LSGRPL = 9 ! Large-scale (stratiform) groupel - integer,parameter :: & - I_ALC = 0, & ! all (stratiform + convective) clouds - I_LSC = 1, & ! stratiform clouds - I_CVC = 2 ! convective clouds - - ! @@@@@ convert: convective mass flux -> cumulus vertical velocity - do k=1,nlevels - do i=1,npoints - if (at(i,k) < 0._wp .or. pfull(i,k) < 0._wp) then - gcumw(i,k) = 0._wp - flags(i,:,k,:) = .false. - else - es = 611.*exp( (2.5e+6 + 3.4e+5*(1-sign(1._wp,at(i,k)-273.15))/2._wp)/461. * (1./273.15 - 1./at(i,k)) ) - qs = (es/pfull(i,k)) * (287./461.) - - Tvs = at(i,k)*( (1+qs/(287./461.))/(1+qs) ) - gcumw(i,k) = gcumf(i,k) * (287.*Tvs/pfull(i,k)) - - end if - end do - end do - - ! @@@@@ flag check @@@@@ - flags = .true. - do j=1,ncolumns - where (gwvel < R_UNDEF * 0.1_wp) - flags(:,j,:,I_LSCLIQ) = .false. - flags(:,j,:,I_LSCICE) = .false. - flags(:,j,:,I_LSRAIN) = .false. - flags(:,j,:,I_LSSNOW) = .false. - flags(:,j,:,I_LSGRPL) = .false. - end where - - where (gcumf < R_UNDEF * 0.1_wp) - flags(:,j,:,I_CVCLIQ) = .false. - flags(:,j,:,I_CVCICE) = .false. - flags(:,j,:,I_CVRAIN) = .false. - flags(:,j,:,I_CVSNOW) = .false. - end where - end do - where (flags) - vfall = vfall_in ; vfsqu = vfsqu_in ; zehyd = zehyd_in ; krhyd = krhyd_in - vtrm3 = vtrm3_in ; vtrm0 = vtrm0_in ; mmnt3 = mmnt3_in ; mmnt0 = mmnt0_in - elsewhere - vfall = 0._wp ; vfsqu = 0._wp ; zehyd = 0._wp ; krhyd = 0._wp - vtrm3 = 0._wp ; vtrm0 = 0._wp ; mmnt3 = 0._wp ; mmnt0 = 0._wp - end where - - hgt_bnd(:,1:Nlevels) = hgt_matrix_half - hgt_bnd(:,Nlevels+1) = surfelev - - ! @@@@@ attenuation: gas, LShyd, and CUhyd - if (rcfg%radar_at_layer_one) then - dif = 1 ; sta = 1 ; end = nlevels - else - dif = -1 ; sta = nlevels ; end = 1 - end if - - att_gas = 0._wp - do k=sta,end,dif - do i=1,npoints - att_gas(i,k) = att_gas(i,k) + & - g_vol(i,k) * (hgt_bnd(i,k+1)-hgt_bnd(i,k))/1000._wp - end do - end do - - att_hyd = 0._wp - do k=sta,end,dif - do j=1,ncolumns - do i=1,npoints - krLS = krhyd(i,j,k,I_LSCLIQ)+krhyd(i,j,k,I_LSCICE)+& - krhyd(i,j,k,I_LSRAIN)+krhyd(i,j,k,I_LSSNOW)+krhyd(i,j,k,I_LSGRPL) - att_hyd(i,j,k,I_LSC) = att_hyd(i,j,k,I_LSC) + & - krLS * (hgt_bnd(i,k+1)-hgt_bnd(i,k))/1000._wp - - krCU = krhyd(i,j,k,I_CVCLIQ)+krhyd(i,j,k,I_CVCICE)+& - krhyd(i,j,k,I_CVRAIN)+krhyd(i,j,k,I_CVSNOW) - att_hyd(i,j,k,I_CVC) = att_hyd(i,j,k,I_CVC) + & - krCU * (hgt_bnd(i,k+1)-hgt_bnd(i,k))/1000._wp - - att_hyd(i,j,k,I_ALC) = att_hyd(i,j,k,I_ALC) + & - (krLS+krCU) * (hgt_bnd(i,k+1)-hgt_bnd(i,k))/1000._wp - end do - end do - end do - - ! @@@@@ Initialiation - dplrw_Z = 0._wp ; spwid_Z = 0._wp ; Zef94_Z = 0._wp ; vfall_Z = 0._wp ; gridw_Z = 0._wp - dplrw_T = 0._wp ; spwid_T = 0._wp ; Zef94_T = 0._wp ; vfall_T = 0._wp ; gridw_T = 0._wp - ZefVd_2 = 0._wp ; ZefVd_2 = 0._wp - workD = 0._wp ; workS = 0._wp ; workZ = 0._wp ; workV = 0._wp ; workW = 0._wp - - ! @@@@@ statistics - do i=1,npoints - do j=1,ncolumns - do k=1,nlevels - tbin = floor( ( (at(i,k)-273.15) - lvtemp_MIN)/lvtemp_WID ) + 1 - hbin = k - if (tbin < 1 .or. tbin > Nlvtemp) cycle - - ! radar parameters: for LS and CU - zesum = 0._wp ; vdmn = 0._wp ; swmn = 0._wp - do tp=1,N_HYDRO - if (tp==I_LSCLIQ .or. tp==I_LSCICE .or. tp==I_LSRAIN .or. tp==I_LSSNOW .or. tp==I_LSGRPL) then - zesum(I_LSC) = zesum(I_LSC) + zehyd(i,j,k,tp) - vdmn(I_LSC) = vdmn(I_LSC) + vfall(i,j,k,tp)*zehyd(i,j,k,tp) - swmn(I_LSC) = swmn(I_LSC) + vfsqu(i,j,k,tp)*zehyd(i,j,k,tp) - else if (tp==I_CVCLIQ .or. tp==I_CVCICE .or. tp==I_CVRAIN .or. tp==I_CVSNOW) then - zesum(I_CVC) = zesum(I_CVC) + zehyd(i,j,k,tp) - vdmn(I_CVC) = vdmn(I_CVC) + vfall(i,j,k,tp)*zehyd(i,j,k,tp) - swmn(I_CVC) = swmn(I_CVC) + vfsqu(i,j,k,tp)*zehyd(i,j,k,tp) - end if - end do - - zesum(I_ALC) = zesum(I_LSC) + zesum(I_CVC) - if (zesum(I_LSC) <= 0 .and. zesum(I_CVC) <= 0.) cycle - - vdmn(I_ALC) = ( vdmn(I_LSC)+gwvel(i,k)*zesum(I_LSC) + vdmn(I_CVC)+gcumw(i,k)*zesum(I_CVC) ) / (zesum(I_LSC)+zesum(I_CVC)) - swmn(I_ALC) = ( swmn(I_LSC) + 2*gwvel(i,k)*vdmn(I_LSC) + gwvel(i,k)**2*zesum(I_LSC) + & - swmn(I_CVC) + 2*gcumw(i,k)*vdmn(I_CVC) + gcumw(i,k)**2*zesum(I_CVC) ) / (zesum(I_LSC)+zesum(I_CVC)) - swmn(I_ALC) = swmn(I_ALC) - vdmn(I_ALC)**2 - swmn(I_ALC) = swmn(I_ALC) + & - ( trbl_LS**2*zesum(I_LSC) + trbl_CU**2*zesum(I_CVC) ) / (zesum(I_LSC)+zesum(I_CVC)) - swmn(I_ALC) = sqrt( swmn(I_ALC) ) - - swmn(I_LSC) = sqrt(trbl_LS**2 + swmn(I_LSC)/zesum(I_LSC)-vdmn(I_LSC)**2/zesum(I_LSC)**2) - vdmn(I_LSC) = vdmn(I_LSC)/zesum(I_LSC) + gwvel(i,k) - - swmn(I_CVC) = sqrt(trbl_CU**2 + swmn(I_CVC)/zesum(I_CVC)-vdmn(I_CVC)**2/zesum(I_CVC)**2) - vdmn(I_CVC) = vdmn(I_CVC)/zesum(I_CVC) + gcumw(i,k) - - ! ~~~ - vfmn = 0._wp ; gwmn = 0._wp ; m3sum = 0._wp ; m0sum = 0._wp - do tp=1,N_HYDRO - if (tp==I_LSCLIQ .or. tp==I_LSCICE .or. tp==I_LSRAIN .or. tp==I_LSSNOW .or. tp==I_LSGRPL) then - vfmn(I_LSC,1) = vfmn(I_LSC,1) + vfall(i,j,k,tp)*zehyd(i,j,k,tp) - vfmn(I_LSC,2) = vfmn(I_LSC,2) + vtrm3(i,j,k,tp)*mmnt3(i,j,k,tp) - vfmn(I_LSC,3) = vfmn(I_LSC,3) + vtrm0(i,j,k,tp)*mmnt0(i,j,k,tp) - - m3sum(I_LSC) = m3sum(I_LSC) + mmnt3(i,j,k,tp) - m0sum(I_LSC) = m0sum(I_LSC) + mmnt0(i,j,k,tp) - - gwmn(I_ALC) = gwmn(I_ALC) + gwvel(i,k)*zehyd(i,j,k,tp) - else if (tp==I_CVCLIQ .or. tp==I_CVCICE .or. tp==I_CVRAIN .or. tp==I_CVSNOW) then - vfmn(I_CVC,1) = vfmn(I_CVC,1) + vfall(i,j,k,tp)*zehyd(i,j,k,tp) - vfmn(I_CVC,2) = vfmn(I_CVC,2) + vtrm3(i,j,k,tp)*mmnt3(i,j,k,tp) - vfmn(I_CVC,3) = vfmn(I_CVC,3) + vtrm0(i,j,k,tp)*mmnt0(i,j,k,tp) - - m3sum(I_CVC) = m3sum(I_CVC) + mmnt3(i,j,k,tp) - m0sum(I_CVC) = m0sum(I_CVC) + mmnt0(i,j,k,tp) - - gwmn(I_ALC) = gwmn(I_ALC) + gcumw(i,k)*zehyd(i,j,k,tp) - end if - - vfmn(I_ALC,1) = vfmn(I_ALC,1) + vfall(i,j,k,tp)*zehyd(i,j,k,tp) - vfmn(I_ALC,2) = vfmn(I_ALC,2) + vtrm3(i,j,k,tp)*mmnt3(i,j,k,tp) - vfmn(I_ALC,3) = vfmn(I_ALC,3) + vtrm0(i,j,k,tp)*mmnt0(i,j,k,tp) - - m3sum(I_ALC) = m3sum(I_ALC) + mmnt3(i,j,k,tp) - m0sum(I_ALC) = m0sum(I_ALC) + mmnt0(i,j,k,tp) - end do - do tp=0,2 - vfmn(tp,1) = vfmn(tp,1)/zesum(tp) - vfmn(tp,2) = vfmn(tp,2)/m3sum(tp) - vfmn(tp,3) = vfmn(tp,3)/m0sum(tp) - end do - gwmn(I_ALC) = gwmn(I_ALC)/zesum(I_ALC) - gwmn(I_LSC) = gwvel(i,k) - gwmn(I_CVC) = gcumw(i,k) - - - do tp=0,2 - if (zesum(tp) <= 0._wp) cycle - - !if (tp > 0) write(*,*) 'test 6: ',tp,vfmn(tp,1),zesum(tp) - !if (tp > 0) write(*,*) 'test 3: ',tp,vfmn(tp,2),m3sum(tp) - !if (tp > 0) write(*,*) 'test 0: ',tp,vfmn(tp,3),m0sum(tp) - - !if (tp==1) write(*,'(a,3(x,I5))') 'test grd: ',i,j,k - !if (tp==1) write(*,'(a,8(x,ES10.3))') 'test v6 : ',vfall(i,j,k,1:8) - !if (tp==1) write(*,'(a,8(x,ES10.3))') 'test v3 : ',vtrm3(i,j,k,1:8) - !if (tp==1) write(*,'(a,8(x,ES10.3))') 'test v0 : ',vtrm0(i,j,k,1:8) - - zbin = floor( ((10*log10(zesum(tp))-att_gas(i,k)-att_hyd(i,j,k,I_ALC)) - lvdBZe_MIN)/lvdBZe_WID ) + 1 - if (zbin < 1 ) cycle - if (zbin > NlvdBZe) cycle - - dbin = floor( (vdmn(tp) - lvdplr_MIN)/lvdplr_WID ) + 1 - if (dbin < 1 ) dbin = 1 - if (dbin > Nlvdplr) dbin = Nlvdplr - - sbin = floor( (swmn(tp) - lvspwd_MIN)/lvspwd_WID ) + 1 - if (sbin < 1 ) sbin = 1 - if (sbin > Nlvspwd) sbin = Nlvspwd - - workZ(i,zbin,hbin,tp) = workZ(i,zbin,hbin,tp) + 1._wp - workD(i,dbin,hbin,tp) = workD(i,dbin,hbin,tp) + 1._wp - workS(i,sbin,hbin,tp) = workS(i,sbin,hbin,tp) + 1._wp - - Zef94_T(i,zbin,tbin,tp) = Zef94_T(i,zbin,tbin,tp) + 1._wp - dplrw_T(i,dbin,tbin,tp) = dplrw_T(i,dbin,tbin,tp) + 1._wp - spwid_T(i,sbin,tbin,tp) = spwid_T(i,sbin,tbin,tp) + 1._wp - - ZefVd_2(i,dbin,zbin,tp) = ZefVd_2(i,dbin,zbin,tp) + 1._wp - - ! ~~~ - do id=1,3 - vbin = floor( (vfmn(tp,id) - lvdplr_MIN)/lvdplr_WID ) + 1 - if (vbin < 1 ) vbin = 1 - if (vbin > Nlvdplr) vbin = Nlvdplr - workV(i,vbin,hbin,tp,id) = workV(i,vbin,hbin,tp,id) + 1._wp - vfall_T(i,vbin,tbin,tp,id) = vfall_T(i,vbin,tbin,tp,id) + 1._wp - ZefVf_2(i,vbin,zbin,tp,id) = ZefVf_2(i,vbin,zbin,tp,id) + 1._wp - end do - - wbin = floor( (gwmn(tp) - lvdplr_MIN)/lvdplr_WID ) + 1 - if (wbin < 1 ) wbin = 1 - if (wbin > Nlvdplr) wbin = Nlvdplr - workW(i,wbin,hbin,tp) = workW(i,wbin,hbin,tp) + 1._wp - gridw_T(i,wbin,tbin,tp) = gridw_T(i,wbin,tbin,tp) + 1._wp - - end do - - end do - end do - end do - - ! @@@@@ vertical grid conversion - if (use_vgrid) then - do tp=0,2 - call cosp_change_vertical_grid(npoints,Nlvdplr,Nlevels, & - hgt_matrix(:,nlevels:1:-1),hgt_matrix_half(:,nlevels:1:-1),workD(:,1:Nlvdplr,nlevels:1:-1,tp), & - Nlvgrid,vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1),dplrw_Z(:,1:Nlvdplr,1:Nlvgrid,tp)) - - call cosp_change_vertical_grid(npoints,Nlvspwd,Nlevels, & - hgt_matrix(:,nlevels:1:-1),hgt_matrix_half(:,nlevels:1:-1),workS(:,1:Nlvspwd,nlevels:1:-1,tp), & - Nlvgrid,vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1),spwid_Z(:,1:Nlvspwd,1:Nlvgrid,tp)) - - call cosp_change_vertical_grid(npoints,NlvdBZe,Nlevels, & - hgt_matrix(:,nlevels:1:-1),hgt_matrix_half(:,nlevels:1:-1),workZ(:,1:NlvdBZe,nlevels:1:-1,tp), & - Nlvgrid,vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1),Zef94_Z(:,1:NlvdBZe,1:Nlvgrid,tp)) - - ! ~~~ - do id=1,3 - call cosp_change_vertical_grid(npoints,Nlvdplr,Nlevels, & - hgt_matrix(:,nlevels:1:-1),hgt_matrix_half(:,nlevels:1:-1),workV(:,1:Nlvdplr,nlevels:1:-1,tp,id), & - Nlvgrid,vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1),vfall_Z(:,1:Nlvdplr,1:Nlvgrid,tp,id)) - end do - - call cosp_change_vertical_grid(npoints,Nlvdplr,Nlevels, & - hgt_matrix(:,nlevels:1:-1),hgt_matrix_half(:,nlevels:1:-1),workW(:,1:Nlvdplr,nlevels:1:-1,tp), & - Nlvgrid,vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1),gridw_Z(:,1:Nlvdplr,1:Nlvgrid,tp)) - - end do - where (dplrw_Z < 0._wp) - dplrw_Z = 0._wp - end where - where (spwid_Z < 0._wp) - spwid_Z = 0._wp - end where - where (Zef94_Z < 0._wp) - Zef94_Z = 0._wp - end where - where (vfall_Z < 0._wp) - vfall_Z = 0._wp - end where - where (gridw_Z < 0._wp) - gridw_Z = 0._wp - end where - - else - do tp=0,2 - dplrw_Z(:,1:Nlvdplr,1:Nlvgrid,tp) = workD(:,1:Nlvdplr,Nlevels:1:-1,tp) - spwid_Z(:,1:Nlvspwd,1:Nlvgrid,tp) = workS(:,1:Nlvspwd,Nlevels:1:-1,tp) - Zef94_Z(:,1:NlvdBZe,1:Nlvgrid,tp) = workZ(:,1:NlvdBZe,Nlevels:1:-1,tp) - - do id=1,3 - vfall_Z(:,1:Nlvdplr,1:Nlvgrid,tp,id) = workV(:,1:Nlvdplr,Nlevels:1:-1,tp,id) - end do - gridw_Z(:,1:Nlvdplr,1:Nlvgrid,tp) = workW(:,1:Nlvdplr,Nlevels:1:-1,tp) - - end do - end if - - end subroutine quickbeam_dplrw - - ! ############################################################################################## - ! ############################################################################################## - subroutine load_scale_LUTs(rcfg) - - type(radar_cfg), intent(inout) :: rcfg - logical :: LUT_file_exists - integer :: i,j,k,ind - - ! Load scale LUT from file - inquire(file=trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat', & - exist=LUT_file_exists) - - if(.not.LUT_file_exists) then - write(*,*) '*************************************************' - write(*,*) 'Warning: Could NOT FIND radar LUT file: ', & - trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat' - write(*,*) 'Will calculated LUT values as needed' - write(*,*) '*************************************************' - return - else - OPEN(unit=12,file=trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat',& - form='unformatted', & - err= 89, & - access='DIRECT',& - recl=28) - write(*,*) 'Loading radar LUT file: ', & - trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat' - - do i=1,maxhclass - do j=1,mt_ntt - do k=1,nRe_types - ind = i+(j-1)*maxhclass+(k-1)*(nRe_types*mt_ntt) - read(12,rec=ind) rcfg%Z_scale_flag(i,j,k), & - rcfg%Ze_scaled(i,j,k), & - rcfg%Zr_scaled(i,j,k), & - rcfg%kr_scaled(i,j,k) - enddo - enddo - enddo - close(unit=12) - return - endif - -89 write(*,*) 'Error: Found but could NOT READ radar LUT file: ', & - trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat' - - end subroutine load_scale_LUTs - - ! ############################################################################################## - ! ############################################################################################## - subroutine save_scale_LUTs(rcfg) - type(radar_cfg), intent(inout) :: rcfg - logical :: LUT_file_exists - integer :: i,j,k,ind - - inquire(file=trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat', & - exist=LUT_file_exists) - - OPEN(unit=12,file=trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat',& - form='unformatted',err= 99,access='DIRECT',recl=28) - - write(*,*) 'Creating or Updating radar LUT file: ', & - trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat' - - do i=1,maxhclass - do j=1,mt_ntt - do k=1,nRe_types - ind = i+(j-1)*maxhclass+(k-1)*(nRe_types*mt_ntt) - if(.not.LUT_file_exists .or. rcfg%Z_scale_added_flag(i,j,k)) then - rcfg%Z_scale_added_flag(i,j,k)=.false. - write(12,rec=ind) rcfg%Z_scale_flag(i,j,k), & - rcfg%Ze_scaled(i,j,k), & - rcfg%Zr_scaled(i,j,k), & - rcfg%kr_scaled(i,j,k) - endif - enddo - enddo - enddo - close(unit=12) - return - -99 write(*,*) 'Error: Unable to create/update radar LUT file: ', & - trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat' - return - - end subroutine save_scale_LUTs - ! ############################################################################################## - ! ############################################################################################## - subroutine quickbeam_init() - - - end subroutine quickBeam_init - ! ############################################################################################## - ! ############################################################################################## - - -end module quickbeam - - diff --git a/dplrw_src/quickbeam_optics.F90 b/dplrw_src/quickbeam_optics.F90 deleted file mode 100644 index 7d63754468..0000000000 --- a/dplrw_src/quickbeam_optics.F90 +++ /dev/null @@ -1,1577 +0,0 @@ -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -! Copyright (c) 2015, Regents of the University of Colorado -! All rights reserved. -! -! Redistribution and use in source and binary forms, with or without modification, are -! permitted provided that the following conditions are met: -! -! 1. Redistributions of source code must retain the above copyright notice, this list of -! conditions and the following disclaimer. -! -! 2. Redistributions in binary form must reproduce the above copyright notice, this list -! of conditions and the following disclaimer in the documentation and/or other -! materials provided with the distribution. -! -! 3. Neither the name of the copyright holder nor the names of its contributors may be -! used to endorse or promote products derived from this software without specific prior -! written permission. -! -! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL -! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT -! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -! -! History: -! May 2015: Dustin Swales - Initial version -! -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -module mod_quickbeam_optics - USE COSP_KINDS, ONLY: wp,dp - USE array_lib, ONLY: infind - USE math_lib, ONLY: path_integral,avint,gamma - USE optics_lib, ONLY: m_wat,m_ice,MieInt - USE cosp_math_constants, ONLY: pi - USE cosp_phys_constants, ONLY: rhoice - use quickbeam, ONLY: dmin,dmax,Re_BIN_LENGTH, & - Re_MAX_BIN,nRe_types,nd,maxhclass - use mod_cosp_config, ONLY: N_HYDRO - use mod_cosp_stats, ONLY: radar_cfg - use mod_cosp_error, ONLY: errorMessage - implicit none - - ! Derived type for particle size distribution - TYPE size_distribution - real(wp),dimension(maxhclass) :: p1,p2,p3,dmin,dmax,apm,bpm,rho - integer, dimension(maxhclass) :: dtype,phase - - ! for DPLRW - integer, dimension(N_HYDRO) :: ftype,fvscs - real(wp),dimension(N_HYDRO) :: f1,f2,f3 - END TYPE size_distribution - - ! Parameters - integer,parameter :: & ! - cnt_liq = 19, & ! Liquid temperature count - cnt_ice = 20 ! Lce temperature count - - ! Initialization variables - real(wp),dimension(cnt_ice) :: mt_tti - real(wp),dimension(cnt_liq) :: mt_ttl - real(wp),dimension(nd) :: D - !logical :: lQuickbeamInit - -contains - ! ###################################################################################### - ! SUBROUTINE quickbeam_optics_init - ! ###################################################################################### - subroutine quickbeam_optics_init() - integer :: j - - mt_tti = (/ ((j-1)*5-90 + 273.15, j = 1, cnt_ice) /) - mt_ttl = (/ ((j-1)*5-60 + 273.15, j = 1, cnt_liq) /) - D(1) = dmin - do j=2,nd - D(j) = D(j-1)*exp((log(dmax)-log(dmin))/(nd-1)) - enddo - !lQuickbeamInit = .true. - end subroutine quickbeam_optics_init - - ! ###################################################################################### - ! SUBROUTINE QUICKBEAM_OPTICS - ! ###################################################################################### - subroutine quickbeam_optics(sd, rcfg, nprof, ngate, undef, hm_matrix, re_matrix, & - Np_matrix, p_matrix, t_matrix, sh_matrix,z_vol,kr_vol, & - vfall, vfsqu, zehyd, krhyd, & - vtrm3, vtrm0, mmnt3, mmnt0 ) - - ! INPUTS - type(size_distribution),intent(inout) :: & - sd ! - type(radar_cfg),intent(inout) :: & - rcfg ! - integer,intent(in) :: & - nprof, & ! Number of hydrometeor profiles - ngate ! Number of vertical layers - real(wp),intent(in) :: & - undef ! Missing data value - real(wp),intent(in),dimension(nprof,ngate) :: & - p_matrix, & ! Pressure profile (hPa) - t_matrix, & ! Temperature profile (K) - sh_matrix ! Specific humidity profile (%) -- only needed if gaseous aborption calculated. - real(wp),intent(in),dimension(nprof,ngate,rcfg%nhclass) :: & - re_matrix, & ! Table of hydrometeor effective radii. 0 ==> use defaults. (units=microns) - hm_matrix ! Table of hydrometeor mixing ratios (g/kg) - real(wp),intent(inout),dimension(nprof,ngate,rcfg%nhclass) :: & - Np_matrix ! Table of hydrometeor number concentration. 0 ==> use defaults. (units = 1/kg) - - ! OUTPUTS - real(wp),intent(out), dimension(nprof, ngate) :: & - z_vol, & ! Effective reflectivity factor (mm^6/m^3) - kr_vol ! Attenuation coefficient hydro (dB/km) - - ! OUTPUTS for DPLRW - real(wp),intent(out), dimension(nprof, ngate, N_HYDRO) :: & - vfall, vfsqu, zehyd, krhyd, & - vtrm3, vtrm0, mmnt3, mmnt0 - - ! INTERNAL VARIABLES - integer :: & - phase, ns,tp,j,k,pr,itt,iRe_type,n - logical :: & - hydro - real(wp) :: & - t_kelvin,Re_internal - real(wp) :: & - rho_a,kr,ze,zr,scale_factor,Re,Np,base,step - - ! INTERNAL VARIABLES for DPLRW - real(wp) :: vf,vq - real(wp) :: vt3,vt0,D3int,D0int - real(wp),dimension(:),allocatable :: fall_speed - - real(wp),dimension(:),allocatable :: & - Deq, & ! Discrete drop sizes (um) - Ni, & ! Discrete concentrations (cm^-3 um^-1) - rhoi, & ! Discrete densities (kg m^-3) - xxa, & ! - Di ! Discrete drop sizes (um) - - real(wp), dimension(nprof, ngate) :: & - z_ray ! Reflectivity factor, Rayleigh only (mm^6/m^3) - - ! PARAMETERS - logical, parameter :: & ! - DO_LUT_TEST = .false., & ! - DO_NP_TEST = .false. ! - real(wp), parameter :: & - one_third = 1._wp/3._wp ! - - ! Initialization - z_vol = 0._wp - z_ray = 0._wp - kr_vol = 0._wp - vfall = 0._wp - vfsqu = 0._wp - zehyd = 0._wp - krhyd = 0._wp - vtrm3 = 0._wp - vtrm0 = 0._wp - mmnt3 = 0._wp - mmnt0 = 0._wp - - do k=1,ngate ! Loop over each profile (nprof) - do pr=1,nprof - ! Determine if hydrometeor(s) present in volume - hydro = .false. - do j=1,rcfg%nhclass - if ((hm_matrix(pr,k,j) > 1E-12) .and. (sd%dtype(j) > 0)) then - hydro = .true. - exit - endif - enddo - - t_kelvin = t_matrix(pr,k) - ! If there is hydrometeor in the volume - if (hydro) then - rho_a = (p_matrix(pr,k))/(287._wp*(t_kelvin)) - - ! Loop over hydrometeor type - do tp=1,rcfg%nhclass - Re_internal = re_matrix(pr,k,tp) - - if (hm_matrix(pr,k,tp) <= 1E-12) cycle - - ! Index into temperature dimension of scaling tables - ! These tables have regular steps -- exploit this and abandon infind - phase = sd%phase(tp) - if (phase==0) then - itt = infind(mt_ttl,t_kelvin) - else - itt = infind(mt_tti,t_kelvin) - endif - - ! Compute effective radius from number concentration and distribution parameters - if (Re_internal .eq. 0) then - call calc_Re(hm_matrix(pr,k,tp),Np_matrix(pr,k,tp),rho_a, & - sd%dtype(tp),sd%apm(tp),sd%bpm(tp),sd%rho(tp),sd%p1(tp),sd%p2(tp),sd%p3(tp),Re) - Re_internal=Re - !re_matrix(pr,k,tp)=Re - else - if (Np_matrix(pr,k,tp) > 0) then - call errorMessage('WARNING(optics/quickbeam_optics.f90): Re and Np set for the same volume & hydrometeor type. Np is being ignored.') - endif - Re = Re_internal - !Re = re_matrix(pr,k,tp) - endif - - ! Index into particle size dimension of scaling tables - iRe_type=1 - if(Re.gt.0) then - ! Determine index in to scale LUT - ! Distance between Re points (defined by "base" and "step") for - ! each interval of size Re_BIN_LENGTH - ! Integer asignment, avoids calling floor intrinsic - n=Re/Re_BIN_LENGTH - if (n>=Re_MAX_BIN) n=Re_MAX_BIN-1 - step = rcfg%step_list(n+1) - base = rcfg%base_list(n+1) - iRe_type=Re/step - if (iRe_type.lt.1) iRe_type=1 - Re=step*(iRe_type+0.5_wp) ! set value of Re to closest value allowed in LUT. - iRe_type=iRe_type+base-int(n*Re_BIN_LENGTH/step) - - ! Make sure iRe_type is within bounds - if (iRe_type.ge.nRe_types) then - !write(*,*) 'Warning: size of Re exceed value permitted ', & - ! 'in Look-Up Table (LUT). Will calculate. ' - ! No scaling allowed - iRe_type=nRe_types - rcfg%Z_scale_flag(tp,itt,iRe_type)=.false. - else - ! Set value in re_matrix to closest values in LUT - if (.not. DO_LUT_TEST) re_internal=Re - !if (.not. DO_LUT_TEST) re_matrix(pr,k,tp)=Re - endif - endif - - ! Use Ze_scaled, Zr_scaled, and kr_scaled ... if know them - ! if not we will calculate Ze, Zr, and Kr from the distribution parameters -! if( rcfg%Z_scale_flag(tp,itt,iRe_type) .and. .not. DO_LUT_TEST) then -! ! can use z scaling -! scale_factor=rho_a*hm_matrix(pr,k,tp) -! zr = rcfg%Zr_scaled(tp,itt,iRe_type) * scale_factor -! ze = rcfg%Ze_scaled(tp,itt,iRe_type) * scale_factor -! kr = rcfg%kr_scaled(tp,itt,iRe_type) * scale_factor -! else - if( (.not. rcfg%Z_scale_flag(tp,itt,iRe_type)) .or. DO_LUT_TEST) then - ! Create a discrete distribution of hydrometeors within volume - select case(sd%dtype(tp)) - case(4) - ns = 1 - allocate(Di(ns),Ni(ns),rhoi(ns),xxa(ns),Deq(ns)) - Di = sd%p1(tp) - Ni = 0._wp - case default - ns = nd ! constant defined in simulator/quickbeam.f90 - allocate(Di(ns),Ni(ns),rhoi(ns),xxa(ns),Deq(ns)) - Di = D - Ni = 0._wp - end select - call dsd(hm_matrix(pr,k,tp),re_internal,Np_matrix(pr,k,tp), & - Di,Ni,ns,sd%dtype(tp),rho_a,t_kelvin, & - sd%dmin(tp),sd%dmax(tp),sd%apm(tp),sd%bpm(tp), & - sd%rho(tp),sd%p1(tp),sd%p2(tp),sd%p3(tp)) - - ! Calculate particle density - if (phase == 1) then - if (sd%rho(tp) < 0) then - ! Use equivalent volume spheres. - rcfg%rho_eff(tp,1:ns,iRe_type) = rhoice ! solid ice == equivalent volume approach - Deq = ( ( 6/pi*sd%apm(tp)/rhoice) ** one_third ) * ( (Di*1E-6) ** (sd%bpm(tp)/3._wp) ) * 1E6 - ! alternative is to comment out above two lines and use the following block - ! MG Mie approach - adjust density of sphere with D = D_characteristic to match particle density - ! - ! rcfg%rho_eff(tp,1:ns,iRe_type) = (6/pi)*sd%apm(tp)*(Di*1E-6)**(sd%bpm(tp)-3) !MG Mie approach - - ! as the particle size gets small it is possible that the mass to size relationship of - ! (given by power law in hclass.data) can produce impossible results - ! where the mass is larger than a solid sphere of ice. - ! This loop ensures that no ice particle can have more mass/density larger than an ice sphere. - ! do i=1,ns - ! if(rcfg%rho_eff(tp,i,iRe_type) > 917 ) then - ! rcfg%rho_eff(tp,i,iRe_type) = 917 - ! endif - ! enddo - else - ! Equivalent volume sphere (solid ice rhoice=917 kg/m^3). - rcfg%rho_eff(tp,1:ns,iRe_type) = rhoice - Deq=Di * ((sd%rho(tp)/rhoice)**one_third) - ! alternative ... coment out above two lines and use the following for MG-Mie - ! rcfg%rho_eff(tp,1:ns,iRe_type) = sd%rho(tp) !MG Mie approach - endif - else - ! I assume here that water phase droplets are spheres. - ! sd%rho should be ~ 1000 or sd%apm=524 .and. sd%bpm=3 - Deq = Di - endif - - ! Calculate effective reflectivity factor of volume - ! xxa are unused (Mie scattering and extinction efficiencies) - xxa(1:ns) = -9.9_wp - rhoi = rcfg%rho_eff(tp,1:ns,iRe_type) - - allocate(fall_speed(ns)) - call fall_velocity(ns,Deq*1e-6,sd,p_matrix(pr,k),t_matrix(pr,k),tp,& - & fall_speed) - call zeff(rcfg%freq,Deq,Ni,ns,rcfg%k2,t_kelvin,phase,rcfg%do_ray, & - ze,zr,kr,xxa,xxa,rhoi, & - fall_speed, vf, vq, & - vt3, vt0, D3int, D0int) - - ! Test compares total number concentration with sum of discrete samples - ! The second test, below, compares ab initio and "scaled" computations - ! of reflectivity - ! These should get broken out as a unit test that gets called on - ! data. That routine could write to std out. - - ! Test code ... compare Np value input to routine with sum of DSD - ! NOTE: if .not. DO_LUT_TEST, then you are checking the LUT approximation - ! not just the DSD representation given by Ni - if(Np_matrix(pr,k,tp)>0 .and. DO_NP_TEST ) then - Np = path_integral(Ni,Di,1,ns-1)/rho_a*1.E6_wp - ! Note: Representation is not great or small Re < 2 - if( (Np_matrix(pr,k,tp)-Np)/Np_matrix(pr,k,tp)>0.1 ) then - call errorMessage('ERROR(optics/quickbeam_optics.f90): Error: Np input does not match sum(N)') - endif - endif - - ! Clean up space - deallocate(Di,Ni,rhoi,xxa,Deq) - deallocate(fall_speed) - - ! LUT test code - ! This segment of code compares full calculation to scaling result - if ( rcfg%Z_scale_flag(tp,itt,iRe_type) .and. DO_LUT_TEST ) then - scale_factor=rho_a*hm_matrix(pr,k,tp) - ! if more than 2 dBZe difference print error message/parameters. - if ( abs(10*log10(ze) - 10*log10(rcfg%Ze_scaled(tp,itt,iRe_type) * & - scale_factor)) > 2 ) then - call errorMessage('ERROR(optics/quickbeam_optics.f90): ERROR: Roj Error?') - endif - endif - else - ! Use z scaling - scale_factor=rho_a*hm_matrix(pr,k,tp) - zr = rcfg%Zr_scaled(tp,itt,iRe_type) * scale_factor - ze = rcfg%Ze_scaled(tp,itt,iRe_type) * scale_factor - kr = rcfg%kr_scaled(tp,itt,iRe_type) * scale_factor - - vf = rcfg%vf_scaled(tp,itt,iRe_type) * scale_factor - vq = rcfg%vq_scaled(tp,itt,iRe_type) * scale_factor - - vt3 = rcfg%v3_scaled(tp,itt,iRe_type) * scale_factor - vt0 = rcfg%v0_scaled(tp,itt,iRe_type) * scale_factor - D3int = rcfg%m3_scaled(tp,itt,iRe_type) * scale_factor - D0int = rcfg%m0_scaled(tp,itt,iRe_type) * scale_factor - endif ! end z_scaling - - kr_vol(pr,k) = kr_vol(pr,k) + kr - z_vol(pr,k) = z_vol(pr,k) + ze - z_ray(pr,k) = z_ray(pr,k) + zr - - vfall(pr,k,tp) = vf/ze - vfsqu(pr,k,tp) = vq/ze - zehyd(pr,k,tp) = ze - krhyd(pr,k,tp) = kr - - vtrm3(pr,k,tp) = vt3/D3int - vtrm0(pr,k,tp) = vt0/D0int - mmnt3(pr,k,tp) = D3int - mmnt0(pr,k,tp) = D0int - - ! Construct Ze_scaled, Zr_scaled, and kr_scaled ... if we can - if ( .not. rcfg%Z_scale_flag(tp,itt,iRe_type) ) then - if (iRe_type>1) then - scale_factor=rho_a*hm_matrix(pr,k,tp) - rcfg%Ze_scaled(tp,itt,iRe_type) = ze/ scale_factor - rcfg%Zr_scaled(tp,itt,iRe_type) = zr/ scale_factor - rcfg%kr_scaled(tp,itt,iRe_type) = kr/ scale_factor - rcfg%Z_scale_flag(tp,itt,iRe_type) = .true. - rcfg%Z_scale_added_flag(tp,itt,iRe_type)=.true. - - rcfg%vf_scaled(tp,itt,iRe_type) = vf/ scale_factor - rcfg%vq_scaled(tp,itt,iRe_type) = vq/ scale_factor - - rcfg%v3_scaled(tp,itt,iRe_type) = vt3/ scale_factor - rcfg%v0_scaled(tp,itt,iRe_type) = vt0/ scale_factor - rcfg%m3_scaled(tp,itt,iRe_type) = D3int/ scale_factor - rcfg%m0_scaled(tp,itt,iRe_type) = D0int/ scale_factor - endif - endif - enddo ! end loop of tp (hydrometeor type) - endif - enddo - enddo - - where(kr_vol(:,:) <= EPSILON(kr_vol)) - ! Volume is hydrometeor-free - !z_vol(:,:) = undef - z_ray(:,:) = undef - end where - - end subroutine quickbeam_optics - ! ############################################################################################## - ! ############################################################################################## - subroutine calc_Re(Q,Np,rho_a,dtype,apm,bpm,rho_c,p1,p2,p3,Re) - ! ############################################################################################## - ! Purpose: - ! Calculates Effective Radius (1/2 distribution 3rd moment / 2nd moment). - ! - ! For some distribution types, the total number concentration (per kg), Np - ! may be optionally specified. Should be set to zero, otherwise. - ! - ! Roj Marchand July 2010 - ! - ! Inputs: - ! - ! [Q] hydrometeor mixing ratio (g/kg) ! not needed for some distribution types - ! [Np] Optional Total number concentration (per kg). 0 = use defaults (p1, p2, p3) - ! [rho_a] ambient air density (kg m^-3) - ! - ! Distribution parameters as per quickbeam documentation. - ! [dtype] distribution type - ! [apm] a parameter for mass (kg m^[-bpm]) - ! [bmp] b params for mass - ! [p1],[p2],[p3] distribution parameters - ! - ! Outputs: - ! [Re] Effective radius, 1/2 the 3rd moment/2nd moment (um) - ! - ! Created: - ! July 2010 Roj Marchand - ! Modified: - ! 12/18/14 Dustin Swales: Define type REALs as double precision (dustin.swales@noaa.gov) - ! - ! ############################################################################################## - ! ############################################################################################## - - ! Inputs - real(wp), intent(in) :: Q,Np,rho_a,rho_c,p1,p2,p3 - integer, intent(in) :: dtype - real(wp), intent(inout) :: apm,bpm - - ! Outputs - real(wp), intent(out) :: Re - - ! Internal - integer :: local_dtype - real(wp) :: local_p3,local_Np,tmp1,tmp2 - real(wp) :: N0,D0,vu,dm,ld,rg,log_sigma_g ! gamma, exponential variables - - - ! If density is constant, set equivalent values for apm and bpm - if ((rho_c > 0) .and. (apm < 0)) then - apm = (pi/6)*rho_c - bpm = 3._wp - endif - - ! Exponential is same as modified gamma with vu =1 - ! if Np is specified then we will just treat as modified gamma - if(dtype .eq. 2 .and. Np .gt. 0) then - local_dtype = 1 - local_p3 = 1 - else - local_dtype = dtype - local_p3 = p3 - endif - select case(local_dtype) - - ! ---------------------------------------------------------! - ! Modified gamma ! - ! Np = total number concentration (1/kg) = Nt / rho_a ! - ! D0 = characteristic diameter (um) ! - ! dm = mean diameter (um) - first moment over zeroth moment! - ! vu = distribution width parameter ! - ! ---------------------------------------------------------! - case(1) - - if( abs(local_p3+2) < 1E-8) then - if(Np>1E-30) then - ! Morrison scheme with Martin 1994 shape parameter (NOTE: vu = pc +1) - ! fixed Roj. Dec. 2010 -- after comment by S. Mcfarlane - vu = (1/(0.2714_wp + 0.00057145_wp*Np*rho_a*1E-6))**2 ! units of Nt = Np*rhoa = #/cm^3 - else - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify a value for Np in each volume with Morrison/Martin Scheme.') - return - endif - elseif (abs(local_p3+1) > 1E-8) then - ! vu is fixed in hp structure - vu = local_p3 - else - ! vu isn't specified - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify a value for vu for Modified Gamma distribution') - return - endif - - if( Np.eq.0 .and. p2+1 > 1E-8) then ! use default value for MEAN diameter as first default - dm = p2 ! by definition, should have units of microns - D0 = gamma(vu)/gamma(vu+1)*dm - else ! use value of Np - if(Np.eq.0) then - if( abs(p1+1) > 1E-8 ) then ! use default number concentration - local_Np = p1 ! total number concentration / pa --- units kg^-1 - else - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify Np or default value (p1=Dm [um] or p2=Np [1/kg]) for Modified Gamma distribution') - return - endif - else - local_Np=Np; - endif - D0 = 1E6 * ( Q*1E-3*gamma(vu)/(apm*local_Np*gamma(vu+bpm)) )**(1/bpm) ! units = microns - endif - Re = 0.5_wp*D0*gamma(vu+3)/gamma(vu+2) - - ! ---------------------------------------------------------! - ! Exponential ! - ! N0 = intercept parameter (m^-4) ! - ! ld = slope parameter (um) ! - ! ---------------------------------------------------------! - case(2) - - ! Np not specified (see if statement above) - if((abs(p1+1) > 1E-8) ) then ! N0 has been specified, determine ld - N0 = p1 - tmp1 = 1._wp/(1._wp+bpm) - ld = ((apm*gamma(1._wp+bpm)*N0)/(rho_a*Q*1E-3))**tmp1 - ld = ld/1E6 ! set units to microns^-1 - elseif (abs(p2+1) > 1E-8) then ! lambda=ld has been specified as default - ld = p2 ! should have units of microns^-1 - else - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify Np or default value (p1=No or p2=lambda) for Exponential distribution') - return - endif - Re = 1.5_wp/ld - - ! ---------------------------------------------------------! - ! Power law ! - ! ahp = Ar parameter (m^-4 mm^-bhp) ! - ! bhp = br parameter ! - ! dmin_mm = lower bound (mm) ! - ! dmax_mm = upper bound (mm) ! - ! ---------------------------------------------------------! - case(3) - - Re=0._wp ! Not supporting LUT approach for power-law ... - if(Np>0) then - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Variable Np not supported for Power Law distribution') - return - endif - - ! ---------------------------------------------------------! - ! Monodisperse ! - ! D0 = particle diameter (um) == Re ! - ! ---------------------------------------------------------! - case(4) - - Re = p1 - if(Np>0) then - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Variable Np not supported for Monodispersed distribution') - return - endif - - ! ---------------------------------------------------------! - ! Lognormal ! - ! N0 = total number concentration (m^-3) ! - ! np = fixed number concentration (kg^-1) ! - ! rg = mean radius (um) ! - ! log_sigma_g = ln(geometric standard deviation) ! - ! ---------------------------------------------------------! - case(5) - - if( abs(local_p3+1) > 1E-8 ) then - !set natural log width - log_sigma_g = local_p3 - else - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify a value for sigma_g when using a Log-Normal distribution') - return - endif - - ! get rg ... - if( Np.eq.0 .and. (abs(p2+1) > 1E-8) ) then ! use default value of rg - rg = p2 - else - if(Np>0) then - local_Np=Np; - elseif(abs(p2+1) < 1E-8) then - local_Np=p1 - else - call errorMessage('ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify Np or default value (p2=Rg or p1=Np) for Log-Normal distribution') - endif - log_sigma_g = p3 - tmp1 = (Q*1E-3)/(2._wp**bpm*apm*local_Np) - tmp2 = exp(0.5_wp*bpm*bpm*(log_sigma_g))*exp(0.5_wp*bpm*bpm*(log_sigma_g)) - rg = ((tmp1/tmp2)**(1._wp/bpm))*1E6 - endif - Re = rg*exp(2.5_wp*(log_sigma_g*log_sigma_g)) - end select - end subroutine calc_Re - ! ############################################################################################## - ! ############################################################################################## - subroutine dsd(Q,Re,Np,D,N,nsizes,dtype,rho_a,tk,dmin,dmax,apm,bpm,rho_c,p1,p2,p3) - ! ############################################################################################## - ! Purpose: - ! Create a discrete drop size distribution - ! - ! Starting with Quickbeam V3, this routine now allows input of - ! both effective radius (Re) and total number concentration (Nt) - ! Roj Marchand July 2010 - ! - ! The version in Quickbeam v.104 was modified to allow Re but not Nt - ! This is a significantly modified form for the version - ! - ! Originally Part of QuickBeam v1.03 by John Haynes - ! http://reef.atmos.colostate.edu/haynes/radarsim - ! - ! Inputs: - ! - ! [Q] hydrometeor mixing ratio (g/kg) - ! [Re] Optional Effective Radius (microns). 0 = use defaults (p1, p2, p3) - ! - ! [D] array of discrete drop sizes (um) where we desire to know the number concentraiton n(D). - ! [nsizes] number of elements of [D] - ! - ! [dtype] distribution type - ! [rho_a] ambient air density (kg m^-3) - ! [tk] temperature (K) - ! [dmin] minimum size cutoff (um) - ! [dmax] maximum size cutoff (um) - ! [rho_c] alternate constant density (kg m^-3) - ! [p1],[p2],[p3] distribution parameters - ! - ! Input/Output: - ! [apm] a parameter for mass (kg m^[-bpm]) - ! [bmp] b params for mass - ! - ! Outputs: - ! [N] discrete concentrations (cm^-3 um^-1) - ! or, for monodisperse, a constant (1/cm^3) - ! - ! Requires: - ! function infind - ! - ! Created: - ! 11/28/05 John Haynes (haynes@atmos.colostate.edu) - ! Modified: - ! 01/31/06 Port from IDL to Fortran 90 - ! 07/07/06 Rewritten for variable DSD's - ! 10/02/06 Rewritten using scaling factors (Roger Marchand and JMH), Re added V1.04 - ! July 2020 "N Scale factors" (variable fc) removed (Roj Marchand). - ! 12/18/14 Define type REALs as double precision (dustin.swales@noaa.gov) - ! ############################################################################################## - - ! Inputs - integer, intent(in) :: & - nsizes,& ! Number of elements of [D] - dtype ! distribution type - real(wp),intent(in),dimension(nsizes) :: & - D ! Array of discrete drop sizes (um) where we desire to know the number concentraiton n(D). - real(wp),intent(in) :: & - Q, & ! Hydrometeor mixing ratio (g/kg) - Np, & ! - rho_a, & ! Ambient air density (kg m^-3) - tk, & ! Temperature (K) - dmin, & ! Minimum size cutoff (um) - dmax, & ! Maximum size cutoff (um) - rho_c, & ! Alternate constant density (kg m^-3) - p1, & ! Distribution parameter 1 - p2, & ! Distribution parameter 2 - p3 ! Distribution parameter 3 - real(wp),intent(inout) :: & - apm, & ! a parameter for mass (kg m^[-bpm]) - bpm, & ! b params for mass - Re ! Optional Effective Radius (microns) - - ! Outputs - real(wp),intent(out),dimension(nsizes) :: & - N ! Discrete concentrations (cm^-3 um^-1) - ! or, for monodisperse, a constant (1/cm^3) - - ! Internal Variables - real(wp),dimension(nsizes) :: & - fc - real(wp) :: & - N0,D0,vu,local_np,dm,ld, & ! gamma, exponential variables - dmin_mm,dmax_mm,ahp,bhp, & ! power law variables - rg,log_sigma_g, & ! lognormal variables - rho_e, & ! particle density (kg m^-3) - tmp1,tmp2,tc - integer :: & - k,lidx,uidx - - ! Convert temperature from Kelvin to Celsius - tc = tk - 273.15_wp - - ! If density is constant, store equivalent values for apm and bpm - if ((rho_c > 0) .and. (apm < 0)) then - apm = (pi/6)*rho_c - bpm = 3._wp - endif - - ! Will preferentially use Re input over Np. - ! if only Np given then calculate Re - ! if neigher than use other defaults (p1,p2,p3) following quickbeam documentation - if(Re==0 .and. Np>0) then - call calc_Re(Q,Np,rho_a,dtype,apm,bpm,rho_c,p1,p2,p3,Re) - endif - select case(dtype) - - ! ---------------------------------------------------------! - ! Modified gamma ! - ! np = total number concentration ! - ! D0 = characteristic diameter (um) ! - ! dm = mean diameter (um) - first moment over zeroth moment! - ! vu = distribution width parameter ! - ! ---------------------------------------------------------! - case(1) - - if( abs(p3+2) < 1E-8) then - if( Np>1E-30) then - ! Morrison scheme with Martin 1994 shape parameter (NOTE: vu = pc +1) - ! fixed Roj. Dec. 2010 -- after comment by S. Mcfarlane - vu = (1/(0.2714_wp + 0.00057145_wp*Np*rho_a*1E-6))**2._wp ! units of Nt = Np*rhoa = #/cm^3 - else - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Must specify a value for Np in each volume with Morrison/Martin Scheme.') - return - endif - elseif (abs(p3+1) > 1E-8) then - ! vu is fixed in hp structure - vu = p3 - else - ! vu isn't specified - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Must specify a value for vu for Modified Gamma distribution') - return - endif - - if(Re>0) then - D0 = 2._wp*Re*gamma(vu+2)/gamma(vu+3) - fc = (((D*1E-6)**(vu-1)*exp(-1*D/D0)) / & - (apm*((D0*1E-6)**(vu+bpm))*gamma(vu+bpm))) * 1E-12 - N = fc*rho_a*(Q*1E-3) - elseif( p2+1 > 1E-8) then ! use default value for MEAN diameter - dm = p2 - D0 = gamma(vu)/gamma(vu+1)*dm - fc = (((D*1E-6)**(vu-1)*exp(-1*D/D0)) / & - (apm*((D0*1E-6)**(vu+bpm))*gamma(vu+bpm))) * 1E-12 - N = fc*rho_a*(Q*1E-3) - elseif(abs(p3+1) > 1E-8) then! use default number concentration - local_np = p1 ! total number concentration / pa check - tmp1 = (Q*1E-3)**(1./bpm) - fc = (D*1E-6 / (gamma(vu)/(apm*local_np*gamma(vu+bpm)))**(1._wp/bpm))**vu - N = ((rho_a*local_np*fc*(D*1E-6)**(-1._wp))/(gamma(vu)*tmp1**vu) * & - exp(-1._wp*fc**(1._wp/vu)/tmp1)) * 1E-12 - else - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): No default value for Dm or Np provided!') - return - endif - - ! ---------------------------------------------------------! - ! Exponential ! - ! N0 = intercept parameter (m^-4) ! - ! ld = slope parameter (um) ! - ! ---------------------------------------------------------! - case(2) - - if(Re>0) then - ld = 1.5_wp/Re ! units 1/um - fc = (ld*1E6)**(1.+bpm)/(apm*gamma(1._wp+bpm))*exp(-1._wp*(ld*1E6)*(D*1E-6))*1E-12 - N = fc*rho_a*(Q*1E-3) - elseif (abs(p1+1) > 1E-8) then - ! Use N0 default value - N0 = p1 - tmp1 = 1._wp/(1._wp+bpm) - fc = ((apm*gamma(1._wp+bpm)*N0)**tmp1)*(D*1E-6) - N = (N0*exp(-1._wp*fc*(1._wp/(rho_a*Q*1E-3))**tmp1)) * 1E-12 - elseif (abs(p2+1) > 1E-8) then - ! Use default value for lambda - ld = p2 - fc = (ld*1E6)**(1._wp+bpm)/(apm*gamma(1._wp+bpm))*exp(-1._wp*(ld*1E6)*(D*1E-6))*1E-12 - N = fc*rho_a*(Q*1E-3) - else - ! ld "parameterized" from temperature (carry over from original Quickbeam). - ld = 1220._wp*10._wp**(-0.0245_wp*tc)*1E-6 - N0 = ((ld*1E6)**(1._wp+bpm)*Q*1E-3*rho_a)/(apm*gamma(1._wp+bpm)) - N = (N0*exp(-ld*D)) * 1E-12 - endif - - ! ---------------------------------------------------------! - ! Power law ! - ! ahp = Ar parameter (m^-4 mm^-bhp) ! - ! bhp = br parameter ! - ! dmin_mm = lower bound (mm) ! - ! dmax_mm = upper bound (mm) ! - ! ---------------------------------------------------------! - case(3) - - if(Re>0) then - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Variable Re not supported for Power-Law distribution') - return - elseif(Np>0) then - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Variable Np not supported for Power-Law distribution') - return - endif - - ! br parameter - if (abs(p1+2) < 1E-8) then - ! if p1=-2, bhp is parameterized according to Ryan (2000), - ! applicatable to cirrus clouds - if (tc < -30) then - bhp = -1.75_wp+0.09_wp*((tc+273._wp)-243.16_wp) - elseif ((tc >= -30) .and. (tc < -9)) then - bhp = -3.25_wp-0.06_wp*((tc+273._wp)-265.66_wp) - else - bhp = -2.15_wp - endif - elseif (abs(p1+3) < 1E-8) then - ! if p1=-3, bhp is parameterized according to Ryan (2000), - ! applicable to frontal clouds - if (tc < -35) then - bhp = -1.75_wp+0.09_wp*((tc+273._wp)-243.16_wp) - elseif ((tc >= -35) .and. (tc < -17.5)) then - bhp = -2.65_wp+0.09_wp*((tc+273._wp)-255.66_wp) - elseif ((tc >= -17.5) .and. (tc < -9)) then - bhp = -3.25_wp-0.06_wp*((tc+273._wp)-265.66_wp) - else - bhp = -2.15_wp - endif - else - ! Otherwise the specified value is used - bhp = p1 - endif - - ! Ar parameter - dmin_mm = dmin*1E-3 - dmax_mm = dmax*1E-3 - - ! Commented lines are original method with constant density - ! rc = 500. ! (kg/m^3) - ! tmp1 = 6*rho_a*(bhp+4) - ! tmp2 = pi*rc*(dmax_mm**(bhp+4))*(1-(dmin_mm/dmax_mm)**(bhp+4)) - ! ahp = (Q*1E-3)*1E12*tmp1/tmp2 - - ! New method is more consistent with the rest of the distributions - ! and allows density to vary with particle size - tmp1 = rho_a*(Q*1E-3)*(bhp+bpm+1) - tmp2 = apm*(dmax_mm**bhp*dmax**(bpm+1)-dmin_mm**bhp*dmin**(bpm+1)) - ahp = tmp1/tmp2 * 1E24 - ! ahp = tmp1/tmp2 - lidx = infind(D,dmin) - uidx = infind(D,dmax) - do k=lidx,uidx - N(k) = (ahp*(D(k)*1E-3)**bhp) * 1E-12 - enddo - - ! ---------------------------------------------------------! - ! Monodisperse ! - ! D0 = particle diameter (um) ! - ! ---------------------------------------------------------! - case(4) - - if (Re>0) then - D0 = Re - else - D0 = p1 - endif - - rho_e = (6._wp/pi)*apm*(D0*1E-6)**(bpm-3) - fc(1) = (6._wp/(pi*D0*D0*D0*rho_e))*1E12 - N(1) = fc(1)*rho_a*(Q*1E-3) - - ! ---------------------------------------------------------! - ! Lognormal ! - ! N0 = total number concentration (m^-3) ! - ! np = fixed number concentration (kg^-1) ! - ! rg = mean radius (um) ! - ! og_sigma_g = ln(geometric standard deviation) ! - ! ---------------------------------------------------------! - case(5) - if (abs(p1+1) < 1E-8 .or. Re>0 ) then - ! rg, log_sigma_g are given - log_sigma_g = p3 - tmp2 = (bpm*log_sigma_g)*(bpm*log_sigma_g) - if(Re.le.0) then - rg = p2 - else - !rg = Re*exp(-2.5*(log_sigma_g*log_sigma_g)) - rg =Re*exp(-2.5_wp*(log_sigma_g**2)) - - endif - - fc = 0.5_wp*((1._wp/((2._wp*rg*1E-6)**(bpm)*apm*(2._wp*pi)**(0.5_wp) * & - log_sigma_g*D*0.5_wp*1E-6))*exp(-0.5_wp*((log(0.5_wp*D/rg)/log_sigma_g)**2._wp+tmp2)))*1E-12 - N = fc*rho_a*(Q*1E-3) - - elseif (abs(p2+1) < 1E-8 .or. Np>0) then - ! Np, log_sigma_g are given - if(Np>0) then - local_Np = Np - else - local_Np = p1 - endif - - log_sigma_g = p3 - N0 = local_np*rho_a - tmp1 = (rho_a*(Q*1E-3))/(2._wp**bpm*apm*N0) - tmp2 = exp(0.5_wp*bpm*bpm*(log_sigma_g))*exp(0.5_wp*bpm*bpm*(log_sigma_g)) - rg = ((tmp1/tmp2)**(1/bpm))*1E6 - - N = 0.5_wp*(N0 / ((2._wp*pi)**(0.5_wp)*log_sigma_g*D*0.5_wp*1E-6) * & - exp((-0.5_wp*(log(0.5_wp*D/rg)/log_sigma_g)**2._wp)))*1E-12 - else - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Must specify a value for sigma_g') - return - endif - end select - end subroutine dsd - ! ############################################################################################## - ! ############################################################################################## - subroutine zeff(freq,D,N,nsizes,k2,tt,ice,xr,z_eff,z_ray,kr,qe,qs,rho_e, & - fall_speed, vf, vq, vt3, vt0, D3int, D0int) - ! ############################################################################################## - ! Purpose: - ! Simulates radar return of a volume given DSD of spheres - ! Part of QuickBeam v1.03 by John Haynes - ! http://reef.atmos.colostate.edu/haynes/radarsim - ! - ! Inputs: - ! [freq] radar frequency (GHz) - ! [D] discrete drop sizes (um) - ! [N] discrete concentrations (cm^-3 um^-1) - ! [nsizes] number of discrete drop sizes - ! [k2] |K|^2, -1=use frequency dependent default - ! [tt] hydrometeor temperature (K) - ! [ice] indicates volume consists of ice - ! [xr] perform Rayleigh calculations? - ! [qe] if using a mie table, these contain ext/sca ... - ! [qs] ... efficiencies; otherwise set to -1 - ! [rho_e] medium effective density (kg m^-3) (-1 = pure) - ! - ! Outputs: - ! [z_eff] unattenuated effective reflectivity factor (mm^6/m^3) - ! [z_ray] reflectivity factor, Rayleigh only (mm^6/m^3) - ! [kr] attenuation coefficient (db km^-1) - ! - ! Created: - ! 11/28/05 John Haynes (haynes@atmos.colostate.edu) - ! Modified: - ! 12/18/14 Dustin Swales: Define type REALs as double precision (dustin.swales@noaa.gov) - ! ############################################################################################## - ! Inputs - integer, intent(in) :: & - ice, & ! Indicates volume consists of ice - xr, & ! Perform Rayleigh calculations? - nsizes ! Number of discrete drop sizes - real(wp), intent(in),dimension(nsizes) :: & - D, & ! Discrete drop sizes (um) - N, & ! Discrete concentrations (cm^-3 um^-1) - rho_e, & ! Medium effective density (kg m^-3) (-1 = pure) - qe, & ! Extinction efficiency, when using Mie tables - qs ! Scatering efficiency, when using Mie tables - real(wp),intent(in) :: & - freq, & ! Radar frequency (GHz) - tt ! Hydrometeor temperature (K) - real(wp), intent(inout) :: & - k2 ! |K|^2, -1=use frequency dependent default - real(wp), intent(in), dimension(nsizes) :: & - fall_speed ! droplet fall speed - - ! Outputs - real(wp), intent(out) :: & - z_eff, & ! Unattenuated effective reflectivity factor (mm^6/m^3) - z_ray, & ! Reflectivity factor, Rayleigh only (mm^6/m^3) - kr ! Attenuation coefficient (db km^-1) - real(wp), intent(out) :: & - vf, vq ! Ze weighted - real(wp), intent(out) :: & - vt0, vt3, D3int, D0int ! for terminal velocity - - ! Internal Variables - integer :: correct_for_rho ! Correct for density flag - real(wp), dimension(nsizes) :: & - D0, & ! D in (m) - N0, & ! N in m^-3 m^-1 - sizep, & ! Size parameter - qext, & ! Extinction efficiency - qbsca, & ! Backscatter efficiency - f, & ! Ice fraction - xtemp ! - real(wp) :: & - wl, cr,eta_sum,eta_mie,const,z0_eff,z0_ray,k_sum,n_r,n_i,dqv(1),dqsc,dg,dph(1) - complex(wp) :: & - m, & ! Complex index of refraction of bulk form - Xs1(1), Xs2(1) ! - integer :: & - i, err ! - integer, parameter :: & - one=1 ! - real(wp),parameter :: & - conv_d = 1e-6, & ! Conversion factor for drop sizes (to m) - conv_n = 1e12, & ! Conversion factor for drop concentrations (to m^-3) - conv_f = 0.299792458 ! Conversion for radar frequency (to m) - complex(wp),dimension(nsizes) ::& - m0 ! Complex index of refraction - real(wp) :: fall_sum ! temporal array for DPLRW - - ! Initialize - z0_ray = 0._wp - - ! Conversions - D0 = d*conv_d - N0 = n*conv_n - wl = conv_f/freq - - ! // dielectric constant |k^2| defaults - if (k2 < 0) then - k2 = 0.933_wp - if (abs(94.-freq) < 3.) k2=0.75_wp - if (abs(35.-freq) < 3.) k2=0.88_wp - if (abs(13.8-freq) < 3.) k2=0.925_wp - endif - - if (qe(1) < -9) then - - ! Get the refractive index of the bulk hydrometeors - if (ice == 0) then - call m_wat(freq,tt,n_r,n_i) - else - call m_ice(freq,tt,n_r,n_i) - endif - m = cmplx(n_r,-n_i) - m0(1:nsizes) = m - - correct_for_rho = 0 - if ((ice == 1) .and. (minval(rho_e) >= 0)) correct_for_rho = 1 - - ! Correct refractive index for ice density if needed - if (correct_for_rho == 1) then - f = rho_e/rhoice - m0 = sqrt((2+(m0*m0)+2*f*((m0*m0)-1))/(2+(m0*m0)+f*(1-(m0*m0)))) - endif - - ! Mie calculations - sizep = (pi*D0)/wl - dqv(1) = 0._wp - do i=1,nsizes - call mieint(sizep(i), m0(i), one, dqv, qext(i), dqsc, qbsca(i), & - dg, xs1, xs2, dph, err) - end do - - else - ! Mie table used - qext = qe - qbsca = qs - endif - - ! eta_mie = 0.25*sum[qbsca*pi*D^2*N(D)*deltaD] - ! <--------- eta_sum ---------> - ! z0_eff = (wl^4/!pi^5)*(1./k2)*eta_mie - eta_sum = 0._wp - if (size(D0) == 1) then - eta_sum = qbsca(1)*(n(1)*1E6)*D0(1)*D0(1) - else - xtemp = qbsca*N0*D0*D0 - call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),eta_sum) - endif - - eta_mie = eta_sum*0.25_wp*pi - const = ((wl*wl*wl*wl)/(pi*pi*pi*pi*pi))*(1._wp/k2) - - z0_eff = const*eta_mie - - ! kr = 0.25*cr*sum[qext*pi*D^2*N(D)*deltaD] - ! <---------- k_sum ---------> - k_sum = 0._wp - if (size(D0) == 1) then - k_sum = qext(1)*(n(1)*1E6)*D0(1)*D0(1) - else - xtemp = qext*N0*D0*D0 - call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),k_sum) - endif - ! DS2014 START: Making this calculation in double precision results in a small - ! amount of very small errors in the COSP output field,dBZE94, - ! so it will be left as is. - !cr = 10._wp/log(10._wp) - cr = 10./log(10.) - ! DS2014 STOP - kr = k_sum*0.25_wp*pi*(1000._wp*cr) - - ! <---------- vf_sum ---------> - fall_sum = 0._wp - if (size(D0) == 1) then - fall_sum = fall_speed(1)*qbsca(1)*(n(1)*1E6)*D0(1)*D0(1) - else - xtemp = fall_speed*qbsca*N0*D0*D0 - call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),fall_sum) - end if - const = ((wl*wl*wl*wl)/(pi*pi*pi*pi*pi))*(1._wp/k2) - vf = fall_sum*const*0.25_wp*pi*1E18 - - fall_sum = 0._wp - if (size(D0) == 1) then - fall_sum = fall_speed(1)*fall_speed(1)*qbsca(1)*(n(1)*1E6)*D0(1)*D0(1) - else - xtemp = fall_speed*fall_speed*qbsca*N0*D0*D0 - call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),fall_sum) - end if - const = ((wl*wl*wl*wl)/(pi*pi*pi*pi*pi))*(1._wp/k2) - vq = fall_sum*const*0.25_wp*pi*1E18 - - ! <---------- vf_sum for terminal velocity ---------> - fall_sum = 0._wp - if (size(D0) == 1) then - fall_sum = fall_speed(1)*(n(1)*1E6)*D0(1)*D0(1)*D0(1) - else - xtemp = fall_speed*N0*D0*D0*D0 - call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),fall_sum) - end if - vt3 = fall_sum - - fall_sum = 0._wp - if (size(D0) == 1) then - fall_sum = (n(1)*1E6)*D0(1)*D0(1)*D0(1) - else - xtemp = N0*D0*D0*D0 - call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),fall_sum) - end if - D3int = fall_sum - - fall_sum = 0._wp - if (size(D0) == 1) then - fall_sum = fall_speed(1)*(n(1)*1E6) - else - xtemp = fall_speed*N0 - call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),fall_sum) - end if - vt0 = fall_sum - - fall_sum = 0._wp - if (size(D0) == 1) then - fall_sum = (n(1)*1E6) - else - xtemp = N0 - call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),fall_sum) - end if - D0int = fall_sum - - ! z_ray = sum[D^6*N(D)*deltaD] - if (xr == 1) then - z0_ray = 0._wp - if (size(D0) == 1) then - z0_ray = (n(1)*1E6)*D0(1)*D0(1)*D0(1)*D0(1)*D0(1)*D0(1) - else - xtemp = N0*D0*D0*D0*D0*D0*D0 - call avint(xtemp,D0,nsizes,D0(1),D0(size(D0)),z0_ray) - endif - endif - - ! Convert to mm^6/m^3 - z_eff = z0_eff*1E18 ! 10.*alog10(z0_eff*1E18) - z_ray = z0_ray*1E18 ! 10.*alog10(z0_ray*1E18) - - end subroutine zeff - ! ############################################################################################## - ! ############################################################################################## - function gases(PRES_mb,T,SH,f) - ! ############################################################################################## - ! Purpose: - ! Compute 2-way gaseous attenuation through a volume in microwave - ! - ! Inputs: - ! [PRES_mb] pressure (mb) (hPa) - ! [T] temperature (K) - ! [RH] relative humidity (%) - ! [f] frequency (GHz), < 300 GHz - ! - ! Returns: - ! 2-way gaseous attenuation (dB/km) - ! - ! Reference: - ! Uses method of Liebe (1985) - ! - ! Created: - ! 12/09/05 John Haynes (haynes@atmos.colostate.edu) - ! Modified: - ! 01/31/06 Port from IDL to Fortran 90 - ! 12/19/14 Dustin Swales: Define type REALs as double precision (dustin.swales@noaa.gov) - ! ############################################################################################## - - ! INPUTS - real(wp), intent(in) :: & ! - PRES_mb, & ! Pressure (mb) (hPa) - T, & ! Temperature (K) - SH, & ! Specific humidity - f ! Frequency (GHz), < 300 GHz - - ! PARAMETERS - integer, parameter :: & ! - nbands_o2 = 48, & ! Number of O2 bands - nbands_h2o = 30 ! Number of h2o bands - ! LOCAL VARIABLES - real(wp) :: & - gases, th, e, p, sumo, gm0, a0, ap, term1, & - term2, term3, bf, be, term4, npp,e_th,one_th, & - pth3,eth35,aux1,aux2,aux3, aux4,gm,delt,x,y, & - gm2,fpp_o2,fpp_h2o,s_o2,s_h2o - integer :: i - - ! Table1 parameters v0, a1, a2, a3, a4, a5, a6 - real(wp),dimension(nbands_o2),parameter :: & - v0 = (/49.4523790,49.9622570,50.4742380,50.9877480,51.5033500, & - 52.0214090,52.5423930,53.0669060,53.5957480,54.1299999,54.6711570, & - 55.2213650,55.7838000,56.2647770,56.3378700,56.9681000,57.6124810, & - 58.3238740,58.4465890,59.1642040,59.5909820,60.3060570,60.4347750, & - 61.1505580,61.8001520,62.4112120,62.4862530,62.9979740,63.5685150, & - 64.1277640,64.6789000,65.2240670,65.7647690,66.3020880,66.8368270, & - 67.3695950,67.9008620,68.4310010,68.9603060,69.4890210,70.0173420, & - 118.7503410,368.4983500,424.7631200,487.2493700,715.3931500, & - 773.8387300, 834.1453300/), & - a1 = (/0.0000001,0.0000003,0.0000009,0.0000025,0.0000061,0.0000141, & - 0.0000310,0.0000641,0.0001247,0.0002280,0.0003918,0.0006316,0.0009535, & - 0.0005489,0.0013440,0.0017630,0.0000213,0.0000239,0.0000146,0.0000240, & - 0.0000211,0.0000212,0.0000246,0.0000250,0.0000230,0.0000193,0.0000152, & - 0.0000150,0.0000109,0.0007335,0.0004635,0.0002748,0.0001530,0.0000801, & - 0.0000395,0.0000183,0.0000080,0.0000033,0.0000013,0.0000005,0.0000002, & - 0.0000094,0.0000679,0.0006380,0.0002350,0.0000996,0.0006710,0.0001800/),& - a2 = (/11.8300000,10.7200000,9.6900000,8.8900000,7.7400000,6.8400000, & - 6.0000000,5.2200000,4.4800000,3.8100000,3.1900000,2.6200000,2.1150000, & - 0.0100000,1.6550000,1.2550000,0.9100000,0.6210000,0.0790000,0.3860000, & - 0.2070000,0.2070000,0.3860000,0.6210000,0.9100000,1.2550000,0.0780000, & - 1.6600000,2.1100000,2.6200000,3.1900000,3.8100000,4.4800000,5.2200000, & - 6.0000000,6.8400000,7.7400000,8.6900000,9.6900000,10.7200000,11.8300000,& - 0.0000000,0.0200000,0.0110000,0.0110000,0.0890000,0.0790000,0.0790000/),& - a3 = (/0.0083000,0.0085000,0.0086000,0.0087000,0.0089000,0.0092000, & - 0.0094000,0.0097000,0.0100000,0.0102000,0.0105000,0.0107900,0.0111000, & - 0.0164600,0.0114400,0.0118100,0.0122100,0.0126600,0.0144900,0.0131900, & - 0.0136000,0.0138200,0.0129700,0.0124800,0.0120700,0.0117100,0.0146800, & - 0.0113900,0.0110800,0.0107800,0.0105000,0.0102000,0.0100000,0.0097000, & - 0.0094000,0.0092000,0.0089000,0.0087000,0.0086000,0.0085000,0.0084000, & - 0.0159200,0.0192000,0.0191600,0.0192000,0.0181000,0.0181000,0.0181000/),& - a4 = (/0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & - 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & - 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & - 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & - 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & - 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & - 0.0000000,0.6000000,0.6000000,0.6000000,0.6000000,0.6000000,0.6000000/),& - a5 = (/0.0056000,0.0056000,0.0056000,0.0055000,0.0056000,0.0055000, & - 0.0057000,0.0053000,0.0054000,0.0048000,0.0048000,0.0041700,0.0037500, & - 0.0077400,0.0029700,0.0021200,0.0009400,-0.0005500,0.0059700,-0.0024400,& - 0.0034400,-0.0041300,0.0013200,-0.0003600,-0.0015900,-0.0026600, & - -0.0047700,-0.0033400,-0.0041700,-0.0044800,-0.0051000,-0.0051000, & - -0.0057000,-0.0055000,-0.0059000,-0.0056000,-0.0058000,-0.0057000, & - -0.0056000,-0.0056000,-0.0056000,-0.0004400,0.0000000,0.0000000, & - 0.0000000,0.0000000,0.0000000,0.0000000/), & - a6 = (/1.7000000,1.7000000,1.7000000,1.7000000,1.8000000,1.8000000, & - 1.8000000,1.9000000,1.8000000,2.0000000,1.9000000,2.1000000,2.1000000, & - 0.9000000,2.3000000,2.5000000,3.7000000,-3.1000000,0.8000000,0.1000000, & - 0.5000000,0.7000000,-1.0000000,5.8000000,2.9000000,2.3000000,0.9000000, & - 2.2000000,2.0000000,2.0000000,1.8000000,1.9000000,1.8000000,1.8000000, & - 1.7000000,1.8000000,1.7000000,1.7000000,1.7000000,1.7000000,1.7000000, & - 0.9000000,1.0000000,1.0000000,1.0000000,1.0000000,1.0000000,1.0000000/) - - ! Table2 parameters v1, b1, b2, b3 - real(wp),dimension(nbands_h2o),parameter :: & - v1 = (/22.2350800,67.8139600,119.9959400,183.3101170,321.2256440, & - 325.1529190,336.1870000,380.1973720,390.1345080,437.3466670,439.1508120, & - 443.0182950,448.0010750,470.8889740,474.6891270,488.4911330,503.5685320, & - 504.4826920,556.9360020,620.7008070,658.0065000,752.0332270,841.0735950, & - 859.8650000,899.4070000,902.5550000,906.2055240,916.1715820,970.3150220, & - 987.9267640/), & - b1 = (/0.1090000,0.0011000,0.0007000,2.3000000,0.0464000,1.5400000, & - 0.0010000,11.9000000,0.0044000,0.0637000,0.9210000,0.1940000,10.6000000, & - 0.3300000,1.2800000,0.2530000,0.0374000,0.0125000,510.0000000,5.0900000, & - 0.2740000,250.0000000,0.0130000,0.1330000,0.0550000,0.0380000,0.1830000, & - 8.5600000,9.1600000,138.0000000/), & - b2 = (/2.1430000,8.7300000,8.3470000,0.6530000,6.1560000,1.5150000, & - 9.8020000,1.0180000,7.3180000,5.0150000,3.5610000,5.0150000,1.3700000, & - 3.5610000,2.3420000,2.8140000,6.6930000,6.6930000,0.1140000,2.1500000, & - 7.7670000,0.3360000,8.1130000,7.9890000,7.8450000,8.3600000,5.0390000, & - 1.3690000,1.8420000,0.1780000/), & - b3 = (/0.0278400,0.0276000,0.0270000,0.0283500,0.0214000,0.0270000, & - 0.0265000,0.0276000,0.0190000,0.0137000,0.0164000,0.0144000,0.0238000, & - 0.0182000,0.0198000,0.0249000,0.0115000,0.0119000,0.0300000,0.0223000, & - 0.0300000,0.0286000,0.0141000,0.0286000,0.0286000,0.0264000,0.0234000, & - 0.0253000,0.0240000,0.0286000/) - - ! Conversions - th = 300._wp/T ! unitless - - ! DS2014 START: Using _wp for the exponential in the denominator results in slight errors - ! for dBze94. 0.01 % of values differ, relative range: 1.03e-05 to 1.78e-04 - !e = (RH*th*th*th*th*th)/(41.45_wp*10**(9.834_wp*th-10)) ! kPa - !e = (RH*th*th*th*th*th)/(41.45_wp*10**(9.834_wp*th-10)) ! kPa - e = SH*PRES_mb/(SH+0.622_wp)/1000._wp !kPa - ! DS2014 END - - p = PRES_mb/1000._wp-e ! kPa - e_th = e*th - one_th = 1 - th - pth3 = p*th*th*th - eth35 = e*th**(3.5) - - ! Term1 - sumo = 0._wp - aux1 = 1.1_wp*e_th - do i=1,nbands_o2 - aux2 = f/v0(i) - aux3 = v0(i)-f - aux4 = v0(i)+f - gm = a3(i)*(p*th**(0.8_wp-a4(i))+aux1) - gm2 = gm*gm - delt = a5(i)*p*th**a6(i) - x = aux3*aux3+gm2 - y = aux4*aux4+gm2 - fpp_o2 = (((1._wp/x)+(1._wp/y))*(gm*aux2) - (delt*aux2)*((aux3/(x))-(aux4/(x)))) - s_o2 = a1(i)*pth3*exp(a2(i)*one_th) - sumo = sumo + fpp_o2 * s_o2 - enddo - term1 = sumo - - ! Term2 - gm0 = 5.6E-3_wp*(p+1.1_wp*e)*th**(0.8_wp) - a0 = 3.07E-4_wp - ap = 1.4_wp*(1-1.2_wp*f**(1.5_wp)*1E-5)*1E-10 - term2 = (2*a0*(gm0*(1+(f/gm0)*(f/gm0))*(1+(f/60._wp)**2))**(-1) + ap*p*th**(2.5_wp))*f*p*th*th - - ! Term3 - sumo = 0._wp - aux1 = 4.8_wp*e_th - do i=1,nbands_h2o - aux2 = f/v1(i) - aux3 = v1(i)-f - aux4 = v1(i)+f - gm = b3(i)*(p*th**(0.8)+aux1) - gm2 = gm*gm - x = aux3*aux3+gm2 - y = aux4*aux4+gm2 - fpp_h2o = ((1._wp/x)+(1._wp/y))*(gm*aux2) ! - (delt*aux2)*((aux3/(x))-(aux4/(x))) - s_h2o = b1(i)*eth35*exp(b2(i)*one_th) - sumo = sumo + fpp_h2o * s_h2o - enddo - term3 = sumo - - ! Term4 - bf = 1.4E-6_wp - be = 5.41E-5_wp - term4 = (bf*p+be*e*th*th*th)*f*e*th**(2.5_wp) - - ! Summation and result - npp = term1 + term2 + term3 + term4 - gases = 0.182_wp*f*npp - - end function gases - subroutine hydro_class_init(lsingle,ldouble,sd) - ! ############################################################################################## - ! Purpose: - ! - ! Initialize variables used by the radar simulator. - ! Part of QuickBeam v3.0 by John Haynes and Roj Marchand - ! - ! Inputs: - ! NAME SIZE DESCRIPTION - ! [lsingle] (1) Logical flag to use single moment - ! [ldouble] (1) Logical flag to use two moment - ! Outputs: - ! [sd] Structure that define hydrometeor types - ! - ! Local variables: - ! [n_hydro] (1) Number of hydrometeor types - ! [hclass_type] (nhclass) Type of distribution (see quickbeam documentation) - ! [hclass_phase] (nhclass) 1==ice, 0=liquid - ! [hclass_dmin] (nhclass) Minimum diameter allowed is drop size distribution N(DDmax)=0 - ! [hclass_apm] (nhclass) Density of partical apm*D^bpm or constant = rho - ! [hclass_bpm] (nhclass) Density of partical apm*D^bpm or constant = rho - ! [hclass_rho] (nhclass) Density of partical apm*D^bpm or constant = rho - ! [hclass_p1] (nhclass) Default values of DSD parameters (see quickbeam documentation) - ! [hclass_p2] (nhclass) Default values of DSD parameters (see quickbeam documentation) - ! [hclass_p3] (nhclass) Default values of DSD parameters (see quickbeam documentation) - ! Modified: - ! 08/23/2006 placed into subroutine form (Roger Marchand) - ! June 2010 New interface to support "radar_simulator_params" structure - ! 12/22/2014 Moved radar simulator (CLOUDSAT) configuration initialization to cloudsat_init - ! ############################################################################################## - - ! #################################################################################### - ! NOTES on HCLASS variables - ! - ! TYPE - Set to - ! 1 for modified gamma distribution, - ! 2 for exponential distribution, - ! 3 for power law distribution, - ! 4 for monodisperse distribution, - ! 5 for lognormal distribution. - ! - ! PHASE - Set to 0 for liquid, 1 for ice. - ! DMIN - The minimum drop size for this class (micron), ignored for monodisperse. - ! DMAX - The maximum drop size for this class (micron), ignored for monodisperse. - ! Important note: The settings for DMIN and DMAX are - ! ignored in the current version for all distributions except for power - ! law. Except when the power law distribution is used, particle size - ! is fixed to vary from zero to infinity, a restriction that is expected - ! to be lifted in future versions. A placeholder must still be specified - ! for each. - ! Density of particles is given by apm*D^bpm or a fixed value rho. ONLY specify ONE of these two!! - ! APM - The alpha_m coefficient in equation (1) (kg m**-beta_m ) - ! BPM - The beta_m coefficient in equation (1), see section 4.1. - ! RHO - Hydrometeor density (kg m-3 ). - ! - ! P1, P2, P3 - are default distribution parameters that depend on the type - ! of distribution (see quickmbeam documentation for more information) - ! - ! Modified Gamma (must set P3 and one of P1 or P2) - ! P1 - Set to the total particle number concentration Nt /rho_a (kg-1 ), where - ! rho_a is the density of air in the radar volume. - ! P2 - Set to the particle mean diameter D (micron). - ! P3 - Set to the distribution width nu. - ! - ! Exponetial (set one of) - ! P1 - Set to a constant intercept parameter N0 (m-4). - ! P2 - Set to a constant lambda (micron-1). - ! - ! Power Law - ! P1 - Set this to the value of a constant power law parameter br - ! - ! Monodisperse - ! P1 - Set to a constant diameter D0 (micron) = Re. - ! - ! Log-normal (must set P3 and one of P1 or P2) - ! P1 - Set to the total particle number concentration Nt /rho_a (kg-1 ) - ! P2 - Set to the geometric mean particle radius rg (micron). - ! P3 - Set to the natural logarithm of the geometric standard deviation. - ! #################################################################################### - ! INPUTS - logical,intent(in) :: & - lsingle, & ! True -> use single moment - ldouble ! True -> use two moment - - ! OUTPUTS - type(size_distribution),intent(out) ::& - sd ! - - ! SINGLE MOMENT PARAMETERS - integer,parameter,dimension(N_HYDRO) :: & - ! LSL LSI LSR LSS CVL CVI CVR CVS LSG -! HCLASS1_TYPE = (/5, 1, 2, 2, 5, 1, 2, 2, 2/), & ! - HCLASS1_TYPE = (/1, 1, 1, 1, 1, 1, 2, 2, 1/), & ! - HCLASS1_PHASE = (/0, 1, 0, 1, 0, 1, 0, 1, 1/) ! - real(wp),parameter,dimension(N_HYDRO) ::& - ! LSL LSI LSR LSS CVL CVI CVR CVS LSG - HCLASS1_DMIN = (/ -1., -1., -1., -1., -1., -1., -1., -1., -1. /), & - HCLASS1_DMAX = (/ -1., -1., -1., -1., -1., -1., -1., -1., -1. /), & -! HCLASS1_APM = (/524., 110.8, 524., -1., 524., 110.8, 524., -1., -1. /), & -! HCLASS1_BPM = (/ 3., 2.91, 3., -1., 3., 2.91, 3., -1., -1. /), & -! HCLASS1_RHO = (/ -1., -1., -1., 100., -1., -1., -1., 100., 400. /), & - HCLASS1_APM = (/524., -1., 524., -1., 524., -1., 524., -1., -1. /), & - HCLASS1_BPM = (/ 3., -1., 3., -1., 3., -1., 3., -1., -1. /), & - HCLASS1_RHO = (/ -1., 500., -1., 250., -1., 500., -1., 250., 500. /), & -! HCLASS1_P1 = (/ -1., -1., 8.e6, 3.e6, -1., -1., 8.e6, 3.e6, 4.e6/), & -! HCLASS1_P2 = (/ 6., 40., -1., -1., 6., 40., -1., -1., -1. /), & -! HCLASS1_P3 = (/ 0.3, 2., -1., -1., 0.3, 2., -1., -1., -1. /) - HCLASS1_P1 = (/ -1., -1., -1., -1., -1., -1., 8.e6, 3.e6, -1. /), & - HCLASS1_P2 = (/ 6., 40., 20., 40., 6., 40., -1., -1., 60. /), & - HCLASS1_P3 = (/ 1., 1., 5., 1., 1., 5., -1., -1., 1. /) - - ! TWO MOMENT PARAMETERS - integer,parameter,dimension(N_HYDRO) :: & - ! LSL LSI LSR LSS CVL CVI CVR CVS LSG - HCLASS2_TYPE = (/ 1, 1, 1, 1, 1, 1, 1, 1, 1/), & - HCLASS2_PHASE = (/ 0, 1, 0, 1, 0, 1, 0, 1, 1/) - - real(wp),parameter,dimension(N_HYDRO) :: & - ! LSL LSI LSR LSS CVL CVI CVR CVS LSG - HCLASS2_DMIN = (/ -1, -1, -1, -1, -1, -1, -1, -1, -1/), & - HCLASS2_DMAX = (/ -1, -1, -1, -1, -1, -1, -1, -1, -1/), & - HCLASS2_APM = (/524, -1, 524, -1, 524, -1, 524, -1, -1/), & - HCLASS2_BPM = (/ 3, -1, 3, -1, 3, -1, 3, -1, -1/), & - HCLASS2_RHO = (/ -1, 500, -1, 100, -1, 500, -1, 100, 900/), & - HCLASS2_P1 = (/ -1, -1, -1, -1, -1, -1, -1, -1, -1/), & - HCLASS2_P2 = (/ -1, -1, -1, -1, -1, -1, -1, -1, -1/), & - HCLASS2_P3 = (/ -2, 1, 1, 1, -2, 1, 1, 1, 1/) - - integer,parameter,dimension(N_HYDRO) :: & - ! type1 -> p1*D^p2 ; type2 -> Posselt and Lohmann (2008) Eq.11 - ! LSL LSI LSR LSS CVL CVI CVR CVS LSG - ftype = (/ 2, 1, 2, 1, 2, 1, 1, 1, 1 /),& - fvscs = (/ 0, 0, 0, 0, 0, 0, 1, 1, 0 /) - - real(wp),parameter,dimension(N_HYDRO) :: & - ! LSL LSI LSR LSS CVL CVI CVR CVS LSG - f1 = (/ 9.65 , 1.107 , 9.65 , 3.321 , 9.65 , 1.107 , 8.42E+2, 4.84 , 19.3 /),& - f2 = (/ 10.43 , 0.22 , 10.43 , 0.22 , 10.43 , 0.22 , 0.8 , 0.25 , 0.37 /),& - f3 = (/ 6.00E+2, 0.00 , 6.00E+2, 0.00 , 6.00E+2, 0.00 , 0.00 , 0.00 , 0.00 /) - - if (lsingle) then - sd%dtype(1:N_HYDRO) = HCLASS1_TYPE(1:N_HYDRO) - sd%phase(1:N_HYDRO) = HCLASS1_PHASE(1:N_HYDRO) - sd%dmin(1:N_HYDRO) = HCLASS1_DMIN(1:N_HYDRO) - sd%dmax(1:N_HYDRO) = HCLASS1_DMAX(1:N_HYDRO) - sd%apm(1:N_HYDRO) = HCLASS1_APM(1:N_HYDRO) - sd%bpm(1:N_HYDRO) = HCLASS1_BPM(1:N_HYDRO) - sd%rho(1:N_HYDRO) = HCLASS1_RHO(1:N_HYDRO) - sd%p1(1:N_HYDRO) = HCLASS1_P1(1:N_HYDRO) - sd%p2(1:N_HYDRO) = HCLASS1_P2(1:N_HYDRO) - sd%p3(1:N_HYDRO) = HCLASS1_P3(1:N_HYDRO) - endif - if (ldouble) then - sd%dtype(1:N_HYDRO) = HCLASS2_TYPE(1:N_HYDRO) - sd%phase(1:N_HYDRO) = HCLASS2_PHASE(1:N_HYDRO) - sd%dmin(1:N_HYDRO) = HCLASS2_DMIN(1:N_HYDRO) - sd%dmax(1:N_HYDRO) = HCLASS2_DMAX(1:N_HYDRO) - sd%apm(1:N_HYDRO) = HCLASS2_APM(1:N_HYDRO) - sd%bpm(1:N_HYDRO) = HCLASS2_BPM(1:N_HYDRO) - sd%rho(1:N_HYDRO) = HCLASS2_RHO(1:N_HYDRO) - sd%p1(1:N_HYDRO) = HCLASS2_P1(1:N_HYDRO) - sd%p2(1:N_HYDRO) = HCLASS2_P2(1:N_HYDRO) - sd%p3(1:N_HYDRO) = HCLASS2_P3(1:N_HYDRO) - endif - - sd%ftype = ftype - sd%fvscs = fvscs - sd%f1 = f1 - sd%f2 = f2 - sd%f3 = f3 - - end subroutine hydro_class_init - - subroutine fall_velocity(nsizes,D0,sd,p_matrix,t_matrix,tp,fall) - implicit none - integer,intent(in) :: & - nsizes,tp - real(wp),intent(in), dimension(nsizes) :: & - D0 ! [m], equivalent volume spheres - type(size_distribution),intent(in) :: & - sd - real(wp),intent(in) :: & - p_matrix,t_matrix - real(wp),intent(out),dimension(nsizes) :: & - fall ! positive = ascending, [m/s] - - ! internal work - real(wp) :: rho,rho0 - integer,parameter :: & ! same index as in subsample_and_optics - LSCLIQ = 1, & - LSCICE = 2, & - LSRAIN = 3, & - LSSNOW = 4, & - CVCLIQ = 5, & - CVCICE = 6, & - CVRAIN = 7, & - CVSNOW = 8, & - LSGRPL = 9 - real(wp),dimension(N_HYDRO) :: vscs_fct - - rho0 = 101300/273.15/287 - rho = p_matrix/t_matrix/287 - vscs_fct = merge(sqrt(rho0/rho),1._wp,sd%fvscs==1) - - if (sd%ftype(tp) == 1) then - ! p1 * D^p2 - fall = -1 * vscs_fct(tp) * & - ( sd%f1(tp) * D0**sd%f2(tp) + sd%f3(tp) ) - else if (sd%ftype(tp) == 2) then - ! Posselt and Lohmann (2008), Eq.11 - fall = -1 * vscs_fct(tp) * & - ( sd%f1(tp) - sd%f2(tp)*exp(-1*sd%f3(tp)*D0) + (sd%f2(tp)-sd%f1(tp))*exp(-5*sd%f3(tp)*D0) ) - else - write(*,*) 'WARNING: size_distribution, undefined ftype; STOP' - stop - end if - - end subroutine fall_velocity - -end module mod_quickbeam_optics diff --git a/driver/check/.ipynb_checkpoints/COSP2_global-map-checkpoint.ipynb b/driver/check/.ipynb_checkpoints/COSP2_global-map-checkpoint.ipynb deleted file mode 100644 index 172fc48830..0000000000 --- a/driver/check/.ipynb_checkpoints/COSP2_global-map-checkpoint.ipynb +++ /dev/null @@ -1,260 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "cf1bab3d-ca36-498f-983d-9ac15198597a", - "metadata": { - "jupyter": { - "source_hidden": true - } - }, - "outputs": [], - "source": [ - "import xarray\n", - "import pygmt\n", - "import pandas\n", - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "id": "5292ce3c-d43f-4ffd-8151-ba2d81658dc3", - "metadata": {}, - "source": [ - "## This is global map figure" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "1050bc03-232b-4b98-a74b-e0018328d31d", - "metadata": {}, - "outputs": [], - "source": [ - "# valid only for variables with following shape: (loc).\n", - "\n", - "vname='cltatlid'\n", - "vmin=0.\n", - "vmax=100." - ] - }, - { - "cell_type": "markdown", - "id": "2317395a-d769-479a-806a-eee0285f3d1e", - "metadata": { - "jp-MarkdownHeadingCollapsed": true - }, - "source": [ - "### internal work" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "b0efb38e-f221-4943-a019-581e93556deb", - "metadata": {}, - "outputs": [], - "source": [ - "ds = xarray.open_dataset(\"../data/MIROC_outputs/ctrl_MIROC-COSP2.nc\")" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "65ec4419-02fe-4e9a-9f3d-50513d55cb91", - "metadata": {}, - "outputs": [], - "source": [ - "%%capture\n", - "\n", - "var=ds[vname].values\n", - "\n", - "lat=ds[\"latitude\"].values\n", - "lon=ds[\"longitude\"].values" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "5df1e741-aa79-4bde-b5fa-e0bf3e5dcbbd", - "metadata": {}, - "outputs": [], - "source": [ - "mask = (var >= vmin) & (var <= vmax)\n", - "data = np.column_stack([lon[mask], lat[mask], var[mask]])" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "e77e1cd0-4ccf-4a6c-b700-5c1eb56a2fa9", - "metadata": {}, - "outputs": [], - "source": [ - "check_rows = np.isfinite(data).all(axis=1)\n", - "Nerror = np.where(~check_rows)[0]\n", - "\n", - "if Nerror.size > 0:\n", - " raise ValueError(\"invalid data\")\n", - "\n", - "if data.size == 0:\n", - " raise RuntimeError(\"no valid points\")" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "4c550b99-7ca3-464f-a6f1-38b3f124d014", - "metadata": {}, - "outputs": [], - "source": [ - "fig = pygmt.Figure()\n", - "region = [-180, 180, -75, 75]" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "4965afac-3f2c-448c-ace7-2886ffb00fdd", - "metadata": {}, - "outputs": [], - "source": [ - "tbl_block = pygmt.blockmean(\n", - " data=data,\n", - " region=region,\n", - " spacing=\"1.5d\"\n", - ")\n", - "\n", - "grid = pygmt.surface(\n", - " data=tbl_block,\n", - " region=region,\n", - " spacing=\"1.5d\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "bddcfba4-0c3d-4060-ae86-64738174caa3", - "metadata": {}, - "outputs": [], - "source": [ - "gxyz = pygmt.xyz2grd(\n", - " data=data,\n", - " region=region,\n", - " spacing=\"1.5d\",\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "34824734-03a7-4643-98b7-b98c8f41b400", - "metadata": {}, - "outputs": [], - "source": [ - "fig.coast(\n", - " region=region,\n", - " projection=\"W15c\",\n", - " frame=\"afg\",\n", - " land=\"lightgray\",\n", - " water=\"white\"\n", - ")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "4e557933-95ff-482e-a729-aa6b5996ab3e", - "metadata": {}, - "outputs": [], - "source": [ - "fig.grdimage(\n", - " grid=gxyz,\n", - " cmap=\"turbo\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "de1908e4-92e5-4591-9181-0c41b65aa48f", - "metadata": {}, - "outputs": [], - "source": [ - "fig.colorbar(frame='af+l\"Total Cloud Cover (%)\"')" - ] - }, - { - "cell_type": "markdown", - "id": "1dd9302c-8fcd-4870-a667-d21bd295da05", - "metadata": {}, - "source": [ - "### result" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "5b18919b-7518-469c-8b1b-c6d21c99d612", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": { - "image/png": { - "width": "80%" - } - }, - "output_type": "display_data" - } - ], - "source": [ - "fig.show(width=\"80%\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fe996e44-9a38-4f18-bd8d-50735fb5b8b6", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ee5ac3d9-4e0d-48f0-9b2e-481bda326725", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.13.1" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/driver/check/.ipynb_checkpoints/COSP2_zonal-mean-checkpoint.ipynb b/driver/check/.ipynb_checkpoints/COSP2_zonal-mean-checkpoint.ipynb deleted file mode 100644 index bc07f697df..0000000000 --- a/driver/check/.ipynb_checkpoints/COSP2_zonal-mean-checkpoint.ipynb +++ /dev/null @@ -1,208 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "54f959e2-ee4f-4720-ad04-e37b8dcd8bde", - "metadata": { - "jupyter": { - "source_hidden": true - } - }, - "outputs": [], - "source": [ - "import xarray\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "from matplotlib.colors import ListedColormap,LinearSegmentedColormap\n", - "from matplotlib.ticker import MultipleLocator\n", - "import matplotlib.ticker as mticker" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "2f901612-cbe6-4dfe-acd8-12d0097973f7", - "metadata": {}, - "outputs": [], - "source": [ - "# valid only for variables with following shape: (levStat, loc).\n", - "\n", - "vname=\"clatlid\"\n", - "\n", - "vmin=0.\n", - "vmax=100." - ] - }, - { - "cell_type": "markdown", - "id": "8e71e2f0-fc47-4140-98b4-e0d7492d835b", - "metadata": { - "jp-MarkdownHeadingCollapsed": true - }, - "source": [ - "### internal work" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "9a2a0996-b59b-4f5f-a74c-06ac6e3f075c", - "metadata": {}, - "outputs": [], - "source": [ - "ds = xarray.open_dataset(\"../data/MIROC_outputs/ctrl_MIROC-COSP2.nc\")" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "3e978297-3afd-426e-bb95-6512458516f9", - "metadata": {}, - "outputs": [], - "source": [ - "lat = ds[\"latitude\"]\n", - "lon = ds[\"longitude\"]\n", - "lev = ds[\"levStat\"]\n", - "\n", - "var = ds[vname]\n", - "var = var.where((var >= vmin) & (var <= vmax))\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "2d26d842-eed2-4663-bab1-aef67eb24d3b", - "metadata": {}, - "outputs": [], - "source": [ - "var = var.assign_coords(latitude=(\"loc\", lat.data))\n", - "var_zonal = var.groupby(\"latitude\").mean(\"loc\")" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "96bbc0ad-da9c-4386-b9b5-426387b422a3", - "metadata": {}, - "outputs": [], - "source": [ - "colors=np.array(\n", - " [\n", - " [248,248,248,1],#white\n", - " [160,210,255,1],\n", - " [ 33,140,255,1],\n", - " [ 0, 65,255,1],\n", - " [ 0,185, 0,1],\n", - " [250,245, 0,1],\n", - " [255,153, 0,1],\n", - " [255, 40, 0,1],\n", - " [180, 0,104,1],\n", - " [ 45, 45, 45,1],\n", - " ],dtype=np.float64\n", - ")\n", - "colors[:,:3] /=256\n", - "color_listed=ListedColormap(colors)\n", - "color_linear=LinearSegmentedColormap.from_list('color_linear',colors=colors)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "7158e1b2-3ad4-407a-9dff-4d0311afa2c2", - "metadata": {}, - "outputs": [], - "source": [ - "%%capture\n", - "\n", - "fig, ax = plt.subplots(figsize=(12,7))\n", - "\n", - "pcm = ax.pcolormesh(\n", - " var_zonal.latitude,\n", - " var_zonal.levStat,\n", - " var_zonal,\n", - " shading=\"auto\",\n", - " vmin=vmin,\n", - " vmax=vmax,\n", - " cmap=color_linear\n", - ")\n", - "\n", - "ax.set_title(\"zonal mean: \"+vname, fontsize=32, pad=16)\n", - "\n", - "ax.xaxis.set_major_locator(MultipleLocator(30.))\n", - "ax.set_xlabel(\"latitude\",fontsize=22)\n", - "\n", - "ax.yaxis.set_major_locator(MultipleLocator(3000.))\n", - "ax.yaxis.set_major_formatter(\n", - " mticker.FuncFormatter(lambda y, pos: f\"{y/1000:g}\")\n", - ")\n", - "ax.set_ylabel(\"level (km)\",fontsize=22)\n", - "ax.tick_params(axis='both', which='major', labelsize=18)\n", - "\n", - "cbar = fig.colorbar(pcm, ax=ax, pad=0.02)\n", - "cbar.set_label(\"\", fontsize=13)\n", - "cbar.ax.tick_params(labelsize=16)\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "97208430-407f-44b8-8f52-16c38e312aaa", - "metadata": {}, - "source": [ - "### Figure" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "be27ca04-76ab-46e4-90fb-711aae66ad44", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA8UAAAKrCAYAAADYuy/yAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAm1VJREFUeJzt3QeYFOX9wPHf7t7tFe44uihSbIgtKPauEVEUu8YuoEax/aOiRqIRjAqxm0SNMYKIkaCIJWoExdiwIfYCVkA6AnJwXNnb8n/e1+zlyvu7u7nbvdu7+X6eZ7jl3Zl33pl5Z3bffVsgkUgkBAAAAAAAHwq2dgIAAAAAAGgtFIoBAAAAAL5FoRgAAAAA4FsUigEAAAAAvkWhGAAAAADgWxSKAQAAAAC+RaEYAAAAAOBbFIoBAAAAAL5FoRgAAAAA4FsUigGgHQgEAjUWAA3r169fjftm0aJF7e60HXLIITWO8bXXXqt3/cmTJ9dYf8SIEWlPI88vAK2NQjEAAAAAwLeyWjsBAAAAqOnjjz+WZ555pur/u+66qxx//PGcJgBIAwrFAAAAGVgovvHGG6v+P3z4cArFAJAmNJ8GAAAAAPgWNcUAAACwzMBaLTG4FgBkEmqKAQAAAAC+RaEYAAAAAOBbFIoBAAAAAL5Fn2IAGaekpETefvttWbZsmfz4448SCoWkR48e0rdvX9lnn30kHA6nZb8rV660+124cKFUVFRIly5dpF+/fnLggQdKhw4dmh2/OZ758+fL999/L8XFxVJZWSmdOnWSrl27ym677Sb9+/eXti6RSNhRc82yevVq+/8ttthC9t13X9luu+0a3N6ck/fee08+//xzWbdunT3vvXr1kkMPPdSep1T56aef5J133pFVq1bZPJaVlSXdu3e3adxzzz1tnmuu9evXy5dffinffPONPZbS0lIpLCyUzp07y/bbby+DBg2y+02HWCwm77//vnz66aeyZs0ayc3Ntce311572X23deb+effdd+09a47P3K8dO3aUPn36yE477STbbLNNi6TD5Nevv/5aFixYICtWrJANGzZIdna2fXaYfG+eV+Z6+5G5t5LPcXO9zHkYMGCA7LfffjY/AkBGSQCAw/DhwxPmEZGK5eGHH27UOZ49e3Zi8ODBiXA4rMZVUFCQOPnkkxOffvqpp+s2duzYGvGY/yfNnTs3ccQRRyQCgYBznyY9I0eOTCxdutTTPisqKhLPPvtsYsSIEYm+ffs2eJ569OiRuOaaaxIrVqxIeFU7rnQ5+OCDa+zn1VdfteGxWCxx//3313ucBx10UOLDDz90xltcXJz43e9+l+jSpYtz21AolDj99NMTy5Yta3Lao9GozYv77LOPjU9Lp0nDqFGjEsuXL/e8j3feeSdx5ZVXJgYOHKjmp+TSoUMHe0wfffRRyq53eXl54uabb7Z5Sdtv//79E//85z8TbU0kEkk88MADib322qve62eWLbfcMnHBBRck3n333XrjrJ1fFy5c2GA6TL6455577DPDXMP60mHywO6775549NFHE5WVlQ3GbfJnU5+z5li83LONTYP5LPBi3rx59jmuXSNzzi699NLEmjVrWvz5BQAanjwAWr1QvH79+sSwYcM8xRkMBhOXXHJJo75o1lco/uMf/9jgF+zk0q1bt8T777/f6Byz2WabNel8mS+N06dP95QzW+pLpesLtrl+hx12WKOOLScnJzFjxowacX722WeJrbfeulHb9+zZMzF//nzP6TbXbccdd/R0HfLz8xOTJk1q9D5OPfXUJt8jY8aMsT8sNOd6f//994mdd9650fs8//zz7Q8FzXkmtJSZM2cm+vTp06Rzu2jRopQVip9//nn77GlKOvbYY4/EkiVL2nWh2DxXG/s8Nfdy8nnaWvkKAJLoUwygVZkmh6Z58vPPP+98v6CgQPLy8uqEx+Nxue++++S4446TsrKyJu37D3/4g1x77bW2qWmSac5qmj66ms+aZppHHnmkbRbY2OazLsl9mOaegUCgzvubNm2SU045RaZMmSKZzjRbHTZsmLzyyis1wk0z4fz8fOf6Z555pm1ebZimp6ZptGlSnmTOiWlW7momb5rLDh061DZFbqxnnnlGDj74YNuUuTazr6KiImfzeLOPc889V/74xz8263qbfZhrbZqPas2yJ0yYIL/+9a+lqZYuXWqP0TQ7r30dtKb/Dz30kIwdO1Yy3V133SVHH320/PDDD873c3Jy1HvW+LnMlRobN260zx4X0yTYNPHXmgbPmzdP9t57b5uH26Pf/va3cuONN9Z4nla/RuYeqM6chyFDhtjuBQDQ2uhTDMBp+PDhtj+cV2+99Zb84x//qBGmfVk1X55+9atfyWeffVYj3PQ7+93vfmcLW8n+eMuXL5ennnpKbrnllhpfKv/973/Lb37zG3nwwQc9pXPWrFm276ph9jF69Gg58cQT7b5NIcakzfSHu/nmm+Wll16q2m7t2rVy1VVXyaOPPtqo/ZhjN+fRHIv5QrzLLrtIt27dahQSTb/Pp59+Wu6//37b9y7poosusttkch/QG264QebOnWtfm7645ovx4YcfXvUFePHixfL3v/9dbrvtNtv/0igvL5dLL73UFqRPOOEE+2ODOeennnqqXHjhhbbPYbJA/NFHH9lrPmPGjKp9Llq0yIaZpSHmGpofGKLRaFWYud5mP2bfpi+36QOavLbmWt96663yySefVK1v8uLAgQNtYbwxdthhB1uIM4XUnXfe2faFT/74YQpU5ocAs5977723RoFg0qRJ9geCs846S7wy99GSJUvs68GDB8v//d//ySGHHGILxYa5Z/75z3/aQkv1PGaO1ezP5PtMNHnyZHtv1maunUm3OUZTIE4yBWdT+DQ/spkfQ0zf8XQwP9qYH8iOOOII2XXXXe35q14YNv3UTZ91c02fffbZqnDzHDPpnj17tjNe0/f+r3/9q31ttq/+w5h5jpjnsiZ5rVvD448/bu/x6swzwPzoeNppp8lWW21lw0yf6xdffNH+CGTuMXN9zj777FZKNQBUU1VnDADN9Pnnnyc6depUpx+p6efoMmHChDrN5s444wx1fWPdunWJ/fbbr852//rXvzw1n04ue+65Z2LlypXqdvF43PYJrt3HePXq1Q2eD9MktjF9FJNMOkx/yaY0XWyp5oe1m2Iml6uuusqeK83UqVPrbHPsscfav7m5uYmnnnqq3v2apr7Vt+3evbvtY1qftWvXJnr37l1jO9PMu77rbZgm+RdffHGN7Uwf3U2bNtW73Z///Gfbp7ixTD43/V6r78c0I29MM2rXNcjKyko8+OCD9W73ySefJAoLC2tsd/nll2dk82kzboDJG7W7MLz++uuN2t5crz/96U+JVatWpaz59Jw5cxITJ05MlJWVNfo4TJNr0xTfSxPmVPTtbanm0+Y+M/dj9W222WabxOLFi+u9x84991y1aTUAtDSePABSwvSVM4PbVP9iY/o3/vTTT871S0tLE127dq2xvvny1pg+wqYPa79+/eoUbr0Wik2ByXyha0hJSUmd/sF///vfE+lgBp8xX/yr98FtTBpbs1Bs+tI2htbvuKGCXHIgrqKiohrbvfzyy/Vuc91119VYf9999210YcYU8JOF9uTyl7/8JZEOhx56aI39mEJUQ1zn8bbbbmvU/m6//fYa2/Xq1SsjC8W1z78ZZK8p/clTPdBWUzzyyCM19mMGC2wvheJbbrmlxvp5eXmJb775psF0mR9/zIBcFIoBZAL6FANoNtOX0jQlNP0ak8zUKDNnzrTNDF2mTp1qm6tWb2b8t7/9rVFT1Jg+oPfcc0+NMDP9jGlu6IVpOlq96aXG9Mk0/WCr++CDDyQdTJ9E04+1evNq0wQ4U5lmzrWvhab2OTRM09PG9KU1TTGPPfbYRl8DM62XaY5ePX+ZPrSNnQrGNHe+8847azT999pEv7GuvvrqGv9/9dVXPcdhmu+aZv2NYfJX9fvMTJnT2H7yLeWLL76Q5557rk7f4kxt5t0Q02S6Z8+eVf9/7bXXpD0w3QFM94jqrrnmGtl2220b3DYYDNpxIVIx/RkANBeFYgDNYvqHmsKK+RKbZAqapkBs5pfVmL7A1Zm+eV76zpp9mjmE64uzocKn6WvaWPvvv3+N/5t5SdOldl9uMx9rpjJ9pat/2a+P6XNc2/nnn9/ofdXe3sz5XF+f8er9SQ877DDZcccdxQvzxX6PPfao+n9y7uRMvN6mj7Rr0DYXc3+afs9e87Pp3/vfFmZVS7qY8QOqx2+eJSNHjpS2yhQAzRzRSaYf/bfffittnRkPwvTxTzIF3FGjRjV6ezM3u+kDDwCtjYG2ADSrlsDU/r355ptVYWakaFPDU/tLd221az9POukkT/s2BQCzjanN0+JsqJDbmFrppK233rpRIw03xHwZNqMgm1pyM5KtGTm7duHCDMRUXXIApUx00EEHNXpd03qgNjPyeFO3r+8avP766zX+39hBsmobNGhQ1YBs5jqZAutRRx3V6O3NCNbmByMzyrq53mZkcW304uZcbzOolxcmP1cf4K6p+TldatekmkHYvNyvLclcTzN6uinkmoGkzHVODipX3erVq+tc58bUqGay5L2RZAr+jf2RLOn444+3P2IBQGvKzE8YAG2CGeHW1OhUryWYNm2aHT24PmZk1trTklSvkWus2tuYUZwbq3Ytc0Nqj+xqvvw21ocffmhr2cwI09WbmDdWphVYqjMjKzeWa2ogL9ub6bmqM4UPTe3aVjPK8wMPPCBeLVy4sMb/TeG2IaY58sMPPyxPPPGELRA3VAhOxfVuyfzcEsw9U11Dz5SWZkYzN9fXjOj9n//8x9MUYW3hvm6s6qO0J39E8qop2wBAqlEoBtAk48ePt/3BqjNTidTu9+niaoKanLLDi9rbmOaypjavMc1Itb7Omtr93lxzcdZmpr4xPxyY6Zua09S0vsJfazP9uxvL1Xew9tylqboGtfvIVu9f3Bz1NZ8219jMaWym8WpKIak517sl8nNLMbWstQuM22yzjWQK0yLF9IN3zXvdXu7rxqo+LoTXH7ma+oMOAKQDhWIAnplaz+uuu65G2Lhx4xo1YJJRe+5Q09+udi1gUwpk5ou9qfFqTEGtsf0vm8p8qTd95VIxIJfXmsaW1NzzmK7rkI6+v0Z9hV2T/ydOnNjsfTTlB5R05+eW5Lp2Xgv96fLyyy/LcccdZ7s9tOf7urFq/3jh5UeupvywBgDpQqEYgCcvvvhincKvGeRn7NixnMlqrrzyyjoF4t69e8tpp50m++67r+3TaQYPys/PtyMimx8GqvenPPTQQzmfzRCJRNJy/rQC65QpU+oUiM0PPb/61a9sf1/Tx95cb1NoMNe7dv/Y9lSoba9MYf2MM86oUyA296rpZ7777rvbe7x79+72Gufk5NRYb8SIEfLII4+0cKoBAI1BoRhAo5lpj8yIzaY/XZKpNandjLohnTt3rlNjYqbQqd3PsTHNk2s3CW1KTUWqmQF3TG16daNHj7ZNaxszWJA5F2geM8Jy9X7rZmTypg621ZiC8u9///saYWa068cff9yOct4QrndNrmnSMqH/rZl6zAyUV7322oyp0NgfsNrjda5dg9+Uvum1n+MA0BqYkglAowt6Rx99tB09t/oIzmagGa/zTLoKCtWn9WjqIEimsJ0JNW7PPPNMjRrFQw45RO64445Gj55b/Ys3msbU1tXX9zGVTIuAH374oUZBYfr06Y0qEBtc75qys7PrFLYyYfqi6oMKGnfffbenFh3t8TrXzuOLFy/2HEdTnv0AkGoUigE0yAxaZOYRNqNGJ5k5X83US2YKJq+6desmm2++eY2wefPmeY6n9ja/+MUvJBPUHgX7rLPO8lwjj+bZdddda/z/o48+arHrbeZurt0aoj5c77pMU+TqvEy3lg6mdUz1gbVMwd10hWgsM95B7RG124OBAwfW+H9TjrE9nhcAbQ+FYgANNvkz/eXMPJxJW265pcycOdPTF//aTL/a6sx0RV6YmtjaNTeZMm1L7flITT/DxjJNyU1TXzTP4YcfXqcvfHNGAE/X9TbMj0uoybSuqM5Mf1S920ZLM7W81fOP+WHP9BtuLDNvttfRpmu3LMmkEcKT9t577xr/nzt3bp3p9hrTsgYAWhuFYgD1To1y0kkn1fgl3zRrNAUMr1/8azNNsaszcX733XeN3v7555+v03y6dpytJRwON7k/pGl2S3PC5jP9h80gZknz589P25fv5lzvJUuW2L7HqOnkk0+u0RUiOfdza6l9jU3fWS+jR99+++2e91l7jIVM7Hu7yy671JiGyRTc//a3vzV6+6+//lpmz56dptQBQONRKAbgZGpFzj33XHnppZeqwkzNyL/+9S/Zeeedm33WTj/99Br90Uwt0EUXXdSoL5rmC+lvfvObGmF77rmn7LPPPpIJTE167QJ8Y5gaFjOvMZrP1ORdfPHFNcJM/mpKn8ckraa59vWeNWtWo2o1TQHinHPOSdtI2almRk82BdXqS7oMGDBAjj/++DqD1S1YsEBag2kVU/1HFjO2ghklvjEmTZpkW9Z41bNnzxr/Nz/sZBozan7t2QhuvfXWRvUBN8/6Sy65JCNrwAH4D4ViAE6//e1v5R//+Mf/HhbBoEydOlUOPPDAlJwx0xf5qquuqjMH6Pnnn29rqDWmFs7UCNeuJb7hhhskU5t+PvbYY7YmvD6mebrZrnZTXDQvD2+xxRY1+sab/Pvmm296isf0JTUF6muvvdb5vplyqXoB0VzLhvKjKVSZVhiNLVj50U033VRjzALT/Piggw5q9PUzc0r/5S9/Sck9Za6vuc7VmR+was+5XpuZgslMWdfUWtjqgxiagqb5wSXTmOMzP0IlmSmrjjzySNsKQmN+NLrggguoJQaQMZiSCUAd5stM7eZ+ZqRpU6h44IEHPJ8xM0Lr9ttvXyf86quvlhdeeEHmzJlTFWaaSJqBh0wBxBR+k6PQrlixwvY7vvnmm+3r6syXKzO4UaY45phjbGFs+fLlVTUixx57rP0Sfd5559k5a82XbBP+ySefyLRp0+yX9+T8p+bLt+mDiOYxX9RNnjHns7y8vCpvm/+bgeNMLa3J16YrQLJQa66JWccMnvXOO+/Is88+WzXAkqnVctlss81srWb1fvETJkyQL774wv7wY1owmIGZDFNTbeK87bbbbJNgrrdup512kvvvv19GjhxZFWYG+zMF4xNPPFHOPvtsey2rj21grp0ZgM+0zjDXwxRazf2YCqNGjarx45a5vrvttpuMGzfO7iPZ8sWMw/Dqq6/KvffeW9XSxrSyMQMBmj63jWVqpgcPHlyjIGz2Y551ZiAy82ysXmg2za3PPPNMaY377E9/+lONfZuuMKZFkXmOm7mdk02szQ8b5hya++Pjjz+2Yeb+ePfdd1s83QBQQwIAalm4cKFpJ5qy5eGHH1bP8fLlyxM777yzum1hYWEiLy9PfX/o0KGJ0tLSBq/h2LFja2xn/t+cc9K3b99613/iiSfUNOfk5CS6du2aCAaDdd4bPHhw4qWXXqoRdvDBBzeYvtrxpItJS/X9vPrqq562b046zb68nhdj1qxZic6dO6vXIxQKJbp06WLzWiAQUNe75JJL1H188803iU6dOjm3y8rKstc7HA7Xea9Xr16JJUuWeD4vzb3ew4cPb/Q9qm3TUl8h7rjjDue9klxyc3Pt9TPn2fW+uXc15j5u7LrGsGHD1HR07NjRLq73Jk2a1KRz/vrrr9d77I15Jnm9Z026qq9v0t0Yo0ePrveZ5zo35rqZe6c18hUAVEfzaQCtykzNZGqKtZpeU7OQrEGtzjTnNn1GTR/npkwLlW6nnHKK3HPPPc45nCsqKuy8ubX7Tx933HF2MKhkrSJSY8iQIXYuYVPD6GL6NK5bt87mNa3fsKnpM/1cNdtuu62tAXbNTWyaiprrXbvvsInPNJ+u3ScZUqcvsTm31ZvCV2daAZjrp/XjNs+KVDFdSLS5ic1YB2apPUDXQw89VKO22wuTZ//+97/X6M+cqcxc7Ndff73zfJtnXu1zY/pMm5p0c+8AQGujUAyg1RUVFdlpacwopIcddli9hcKCggI7Mq2Zd/a+++6rM21JJjGDgZn+j7/85S8bnFP3n//8py0Qd+jQocXS5ydbbbWVbZJuCqGmqXPHjh0b3MY0yz3hhBNsocQMgnbppZc2WIAx+dIMSFVfHjaFu1tuucWuS4GgccyPZqZJ7l133WX72jbENNc118s0g+/Tp4+kimmibMY+MD941fdjhikMm3mMzf5Nl4nmMAMemmM3hU5zHkxeNvnX9YNbJvQDN02hzXNc+zHCPONMV4TPP/+8znzUANBaAqa6uNX2DgAOpk/eW2+9Zftcmj6E5stfjx497BddM79x7elR2gLTD9rUiJtjMsdnan7Ml3Uzanb1KU3QMkztsCmUmsGLTC2uGcAtJyfHFnpMYcfU4prCR1NrGU2ts8nDpjBj4jaFZFMzZvqVDhw4MK0jN/uB+ZHC9M81g2iZOYQNU1A095Lpi9yvX7+0pyE5JoCZss6kweQp08+3f//+9jnl9x+4zDVKPsfN/WDOjbmvTD9+L3M8A0BLoFAMAAAAAPAtmk8DAAAAAHyLQjEAAAAAwLcoFAMAAAAAfItCMQAAAADAtygUAwAAAAB8i0IxAAAAAMC3KBQDAAAAAHyLQjEAAAAAwLcoFAMAAAAAfItCMQAAAADAtygUAwAAAAB8i0IxAAAAAMC3KBQDAAAAAJrkq6++kr/85S8yYsQI2WWXXSQrK0sCgYDcfPPNDW47e/ZsOeqoo6Rbt26Sl5cnAwYMkOuuu05KSkrq3e7bb7+1+9tyyy0lJyfH/jX///7775t0DIFEIpFo0pYAAAAAAF+7/PLL5U9/+lOd8Jtuukmuv/56dbu7775brrzySluAPvDAA2WzzTaTN998U1auXCnbb7+9zJkzxxaWa3vrrbdkyJAhUlpaKjvttJPsvPPO8vnnn8sXX3whHTp0sAXtffbZx9MxUFMMAAAAAGgSUyi96qqr5LHHHpP58+fL2Wef3eA2H330kYwePVpCoZC88MIL8vrrr8sTTzwh3333nRx22GG29nnUqFF1tjMF4V/96lf275gxY2xheNq0afav+f+mTZvs+2VlZZ6OIcvT2gAAAAAA/Nf5558v1QWDDde7TpgwQUyD5ZEjR8rQoUOrwvPz82XixImy9dZby4wZM2TBggW2SXXS5MmTZfny5dK/f/86zbPN/802X3/9tUyZMkUuvPDCBtNRleZGrwkAAAAAQDNEIhFbO2ycccYZdd7v27ev7L///vb1008/XeO95P9PO+20OoVv8/9TTz3Vvn7qqac8pYlCMQAAAACgRZiaXNP82dhjjz2c6yTDTTPr6pL/97pdQygUAwAAAABaxMKFC+3fTp06SWFhoXOd3r1711jX2Lhxo6xdu9a+7tOnT73b/fjjj7Z/cWPRpzgN4vG4betuLrIZTQ0AAACAf5j+sqYQt8UWWzSqj21DysvLbbPjlkp7oFYZxkx7ZJZUMOfFMCNFawoKCuzfDRs21Nmuvm2T2yW3rW8f1VEoTgNTIE7+SgEAAADAn5YsWWLn0G1ugdhUtkWjUWkJBQUFdeYJHjt2rIwbN07aKwrFaZBsBmAmldaaBAAAAABon0yt5rbbbpuSsoCpITYFYjMKcypqnRtq8bpgwQJbmO/YsWNVeKpqiY3kOamveXOyUF49DdXPpbZt9cJ89W0bQqE4DZLNDcyF83IxAAAAALQfqexKmSNZEgqEJJ1iErN/TRkmXeWYfv362b/r16+3Px64fjgwhfLq6xpmvS5dusi6devkhx9+kIEDB6rbdevWrdFNpw0G2gIAAAAAtIjtt9/ezkdszJs3z7lOMnzQoEE1wpP/97pdQygUAwAAAECGy0oEW2RJt3A4LEcffbR9PXXq1DrvL168WN5++237+oQTTqjxXvL/06ZNs029qzP/f/zxx+3rE0880VOaKBQDAAAAAFrMtddea5uWP/zwwzJz5syqcDN/8XnnnSexWExOOukk24+6uhEjRtgRvc1cx7///e9rvGf+b8LNwGbnnHOOp/QEEmbMbaSUGf67qKhIVq1aRZ9iAAAAwIflgc0220yKi4ubXR5Ili323m5XyQqlt09xNBaT97752FO6P/zwQ7n44our/v/dd9/JmjVrbOG0V69eVeFPP/20bL755lX/v/vuu+XKK6+0heODDz5YevToIW+++aasWLHCNrGeM2eO7Rtc21tvvSVDhgyxBeidd97ZLp9//rldTD/i2bNnyz777OPpuBloCwAAAADQ5EL7e++9Vyd86dKldkmqqKio8f4VV1whu+yyi9x5550yd+5cO6J0nz59ZMyYMXbRRu7ef//95ZNPPpGbbrrJFoBnzJgh3bt3t7XDN9xwg2yzzTaej4Ga4jSgphgAAADwr3TUFB+wzaAWqSme892HKUl3W0KfYgAAAACAb9F8GgAAAAAyXHYikPbRoQOJmiM6+wU1xQAAAAAA36KmGAAAAAAyXMjMIxxPb51mogXmKc5E/jxqAAAAAACoKQYAAACAzJedCNolrRL+rDP151EDAAAAAEChGAAAAADgZwy0BQAAAAAZLjselOx0N/SN+7MhsT+PGgAAAAAAaooBAAAAIPMx0Fb6UFMMAAAAAPAt+hQDAAAAQIYLxUOSJaG07iMeT4gfUVMMAAAAAPAtaooBAAAAIMO1xOjTCUafBgAAAADAX9p08+nS0lJ58cUX5eabb5YTTzxR+vbtK4FAwC7jxo1rVBxPPvmkHHPMMbLFFltIOByWDh06yPbbby+//vWv5eOPP077MQAAAABAY0efTvfiR226+fTcuXPlqKOOatK2FRUVcsopp8hzzz1XFVZQUCCRSES+/vpru0yaNEnuuOMOueKKK1KYagAAAABApmjzPwV07txZDjvsMLn66qvln//8p/Ts2bNR240fP76qQHzxxRfL0qVLZePGjVJWVibz5s2TAw44QOLxuIwePVo++OCDNB8FAAAAADTQp7gFFj9q0zXFBx54oKxbt65G2LXXXtuobadMmWL/HnzwwXLfffdVhQeDQdl9993l+eefly233FJKSkpsE2sTBgAAAABoX9p0oTgUavo8XStWrLB/99hjD+f7RUVF0r9/f/nwww9twRgAAAAAWksoEZCsNPf5jSUC4kf+rB8Xka233tr+1ZpGFxcX237F9RWcAQAAAABtm28LxRdddJH9+9prr8kll1wiy5Yts/9PJBK2dnjYsGG2hnjfffeVs846q5VTCwAAAMDP6FOcPr4tFJuC8DXXXGP7EN9///22/3BhYaHk5uba/sPffvut7Z/8yiuvNNhM24xkvWHDhhoLAAAAACDz+bZQbArDEyZMsNMumamYDFMzbKZkMsrLy20T6k2bNjUYl4nH9EFOLr179057+gEAAAD4B/MUp49vC8Vr1qyxUzmNGDHCNpGeM2eOrF+/3g7A9dRTT0n37t3lr3/9q+y9995VTas1Y8aMsQXo5LJkyZIWOw4AAAAAgE9Hn26O4cOH2/7EZkqmWbNmSSDw80hrpqb3hBNOkP3331922mkn+f77720z6kcffVSNKycnxy4AAAAAgLbFlzXF8+fPl3//+9/29ejRo6sKxNX16NFDzjnnHPva1BybAbgAAAAAoNWaT8fTvCR8WTz0Z6H4yy+/rHq9zTbbqOttt9129m9paamsXr26RdIGAAAAAGg5WX4dZCtp8eLFsuOOOzrXW7VqVdXr5GBcAAAAANDSQvGgZAXSW6cZpabYPwYNGlT12gym5WJGnZ4yZYp9/Ytf/EI6dOjQYukDAAAAALSMNt98+qeffrIjSSeXeDxe1eS5eriZbimpb9++cswxx9jXzz33nJx99tny3Xff2X7DlZWV8vbbb8shhxxiB9lK9jsGAMBPYglvCwAgvZiSKX0CiTY+glS/fv1s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sWPH2qbQLm+99ZaceOKJkpWVJVOnTpVf/vKXEg6HbfiVV14p5513nn1tBtDKVBSKAQAAACDDhQIxCQXiad5Hwv5dsmRJjdpdrZbYjCp9wgkn2DmFTW3x3nvvXfXesGHDbE3xLrvsIpMmTZKzzjpLDj300Kom02ZOY01JSYn9Wz0N6dTmB9oynbRffPFFOwS4+YXCjFZmJoo2i/ZrRpJ5P7lufYuZYwsAAAAA/KBjx441Fq1QbPoQ//jjj7L11lvXKBAnVQ+fPXu2/duvX7+qAnWyKXVtplBefd10a/M1xXPnzrUdu5vDzKfVpUsX9X3TFAAAAAAAWkswGJVgML39P4LirY/MDz/80GCNblFRkf27bt26qj7IZj5iU7k5b948W3tcmwk3Bg0aJC2hzdcUG507d5bDDjtMrr76avnnP/8pPXv29LT9fvvtJytXrlSXlvqFAgAAAADail69etm/CxYskOLi4jrvmymaPvzwQ/t6q622sn9Nf+Ojjz7avjZ9kGtbvHixvP322/a1aZrdEtp8odjMi2V+dTDV8bfddpucdtppniaRBgAAAIC20ac4/YsXZv5hM4q0mYv417/+dVVfYCMSicgVV1xha5NNy9yTTz656r1rr73WdlN9+OGHZebMmVXhpvbYDMwVi8XkpJNOkgEDBkhLaPPtgs0cWAAAAACAltW9e3d54IEHZOTIkTJ9+nR57bXXZM8997SFYNME2kzPFAwG5c9//rPtX5xkmkXfeeeddnRq0xX24IMPlh49esibb74pK1assE2sTbwtpc3XFAMAAAAAWsdZZ51lC8AjRoywI0u/8sordiBkMy7TmWeeaUelHjVqVJ3tTC3yyy+/LEcccYR8+umn8uyzz9r5iceMGSPvv/++dOvWrcWOoc3XFKfCF198ITvvvLN8//339pcM0zb+oIMOkosvvlh222231k4eAAAAAJ8LSVSdxz11+0g0abuBAwfaptBeDR482C6tjZpiETuv1vz58yUvL08qKirk66+/loceekh23313uf766xs8iWabDRs21FgAAAAAAJnP14Xi7bbbzg7O9dVXX0l5ebmsXbvWTiI9a9YsWyBOJBJyyy232Pbu9ZkwYYIdajy59O7du8WOAQAAAIBfpmRK/+JHvi4UmzbuZhqn/v37287gySHChwwZInPmzLGdxI1x48Y5hxhPMu3e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zZo1DY4ibfoTG+ZvcjTm6su4ceMaNfr05MmTbfjIkSOrwsxrV5zVmZGfk+ENNc1O7sMs5nV93nvvPTnzzDOld+/ekpubK7169ZIjjzxSnnjiCWmKN954Qy644ALZYYcd7KBkJk4T90knnSQzZsyQRCLRpHgBAMhk9CkGAGSkKVOmyPDhw53v/fjjj3Z588035fbbb5epU6fK0UcfLX5iCvI33XSTxOPxqrDly5fbZdasWTJ9+nQZP358o+IyI3OfffbZ8vzzz9d5b+nSpXZ56qmn7A8RpnDcrVu3lB4LAACtiUIxACAjlZaW2trSgQMH2sLYgAEDpEuXLvY9U0ibPXu2zJw5UzZs2GBrMt9++20ZNGhQjTgefPBBG4+p/TSF6O7du9uw2kzcjfHLX/5Snn76afnPf/4jf/nLX2zYZZddZsNb0t133101+rVhatKHDh0qhYWFMn/+fJk0aZI8+eSTNQrMGnP+9t9/f/nyyy/t/02N/CmnnGJri02t/Pfffy///Oc/5dNPP7U1yYMHD5Z3333X1iIDANAeUCgGAGSkAw880Daf3nbbbZ3vjx492haMjzvuOFvwveaaa+z/qxsyZIj9m5yGKT8/384r3FR9+vSxi6lZTTIF8ebE6ZUppP7ud7+zr0OhkEybNk1OPvnkOudm2LBhtna3IRdeeGFVgdjUPl9//fU23urMuTXLnXfeKZ988olttm4WAADaA/oUAwAy0k477aQWiJNMreWVV15pX7/yyiuybNkyae/uvfdeKS8vt6+vuOKKOgVio2PHjvL444/bmuP6mNpfU6g2zjvvPBk7dmydArERDAbljjvusDXKyTRUVFSk6IgAAGhdFIoBAG3aAQccUPXaNOtt75K1v6agagrFms0331zOOuuseuN65JFHql6bmuCGnHPOOfZvcXGxHeQLAID2gObTAICMNmfOHNunde7cubbp8MaNG6WystK5rulr3J6tXr26aiRt0w96iy22qHf9ww47TP7617+q75s+wobpH2yaUCebUWuq18SbdU1fbwAA2joKxQCAjFRSUmJrOp999tlGb2MGjWrPzMjSSQ01LW/MOsnpoUxzbDNYlxfr1q3ztD4AAJmKQjEAICOdeuqp8u9//9u+7tChg51yabfddrO1o2bArKysnz/CPv/8c/n9739vX8diMWnvPxQkmXPQEHPe6lN9wDCvIpFIk7cFACCTUCgGAGSct956q6pAvMsuu8hLL70kPXv2dK6bnZ0t7Ul9BfuCgoKq12bE7YZs2rSp3vdNfKZgbKa6Wrt2rceUAgDQPjDQFgAg45hCcNL48ePVArGxcOFCyXQ5OTmNrmFds2aN+l71PsTffvttg/ttaJ0tt9zS/jUF4+q10AAA+AmFYgBAxlm5cmWj+8W++OKLDcZnRmo2EolEClL3v/gaG2fnzp2rXjc0bdTbb7+tvtejRw/p16+ffb1gwYIafYxdzDRV9Tn44IPt33g8LrNmzap3XQAA2isKxQCAjFO9L2x9tZ3vvPNOowrFyWbHDTUnbqzqzZgbE6eZczlp9uzZ6npfffVVVbNxTXJALFOQ/dOf/qSut2rVKnnssccaNcWS8Yc//KFq/mMAAPyEQjEAIOPsueeeVa9vvPFGZ2Ht008/lZNPPrlRNbVbbbWV/Wv6zf7www/NTl8yPuPDDz9scP3DDz+8amCw++67z1nQNzXIJ510kkSj0XrjuvTSS+0USsZdd90lTz/9dJ11zLRVZqCyhkbj3muvveSUU06pOp/HHXec/Pjjj+r65lyb/t5XXXVVvfECANCWMNAWACDjnHjiidKnTx9bgJ03b55sv/32cv7559um1GaAqddff12mTZtm5ysePny4PPLII/XGN3jwYPnXv/5VVdM6atQo6dWrV1UzaBNvY6Y4SjKDf2222Wa2NvYf//iHdOvWTfbZZ58aI0IfeeSRVa9Nn2hTKztp0iQpLi62hdGLLrpIfvGLX0hFRYW8//779hjMsZnC7OOPP67ue+utt7b9rK+88kpbgDbnyixDhw6VwsJCmT9/vt3PkiVLbPhTTz1V77FMnDhRvv76a/nkk09sX27TPNsUzs3xdO/e3Z5jc5ym0Gxquc1c0Ntss43ccccdjT5fAABktAQAAK1g4cKFporXLsOHD6/z/rx58xLdunWrWqf2EgqFEn/84x8Tr776alXY2LFjnfsqKSlJDBgwQI2r9nZ9+/a14eav5qGHHlLjc328rl+/PrH33nur6+fl5SWmTJmSePjhh6vCzGvNDTfckAgEAmp8p5xySuLrr7+u9xwnbdy4MXH22WfXG1/15eCDD1bjAgCgraH5NAAgI+2+++62dnL06NG2ptg0GTZ9efv37y8XXnihzJ07V3772982uo/yu+++KzfccIPsscceUlRUVGOwrKY477zz5OWXX7a1qqZWO9mkWWP2aWq477nnHtl7772lY8eOdhtT63rxxRfLRx99JGeffXaj92+alZtBuU4//XRb6x0Oh2XzzTeXI444wtaiP/HEE42ersqc1ylTptg5n6+++mpbk21qiU2Tb1P73bdvXxkyZIiMGzdO3nvvPXnttdcanU4AADJdwJSMWzsRAAAAAAC0BmqKAQAAAAC+RaEYAAAAAOBbFIoBAAAAAL5FoRgAAAAA4FsUigEAAAAAvkWhGAAAAADgWxSKAQAAAAC+RaEYAAAAAOBbFIoBAAAAAL5FoRgAAAAA4FsUigEAAAAAvkWhGAAAAADgWxSKAQAAAAC+RaEYAAAAAOBbFIoBAAAAAOJX/w+WOECBEpCrQQAAAABJRU5ErkJggg==", - "text/plain": [ - "

" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display(fig)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9bb7d525-f727-4fbd-bc95-126111f52d0c", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.13.1" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/driver/check/.ipynb_checkpoints/EC_check-checkpoint.ipynb b/driver/check/.ipynb_checkpoints/EC_check-checkpoint.ipynb deleted file mode 100644 index dd8cd18dcf..0000000000 --- a/driver/check/.ipynb_checkpoints/EC_check-checkpoint.ipynb +++ /dev/null @@ -1,582 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "887c003d-0904-4443-b0a8-d2c2675e4263", - "metadata": { - "jupyter": { - "source_hidden": true - } - }, - "outputs": [], - "source": [ - "import xarray\n", - "import pygmt\n", - "import pandas\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "from matplotlib.colors import ListedColormap,LinearSegmentedColormap\n", - "from matplotlib.ticker import MultipleLocator\n", - "from IPython.display import display" - ] - }, - { - "cell_type": "markdown", - "id": "4065b987-8ecd-4aa5-aa85-760c8a90cd14", - "metadata": {}, - "source": [ - "### config" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "cb5587d5-bcc4-4023-b0ae-e28743fc0e76", - "metadata": {}, - "outputs": [], - "source": [ - "# variables\n", - "\n", - "#vname='Doppler velocity'\n", - "vname='radar reflectivity'\n", - "#vname='terminal velocity'\n", - "#vname='vertical air motion'\n", - "#vname='Ze-Doppler'\n", - "#vname='Ze-terminal'" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "5a951cf4-47ec-439a-bd6a-5b71e6ff3239", - "metadata": {}, - "outputs": [], - "source": [ - "# meridional zone\n", - "\n", - "zone='tropics'\n", - "#zone='mid-north'\n", - "#zone='pol-north'\n", - "#zone='mid-south'\n", - "#zone='pol-south'" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "25a7ea7c-98c0-4b2d-8174-d2995d734cb4", - "metadata": {}, - "outputs": [], - "source": [ - "# cloud regime\n", - "#ctype='ALL'\n", - "ctype='stratiform'\n", - "#ctype='convective'" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "950f2697-2451-4634-816b-139f78f8e0ea", - "metadata": {}, - "outputs": [], - "source": [ - "# only for Doppler or terminal or air velocity\n", - "\n", - "zonal_mean_flag = False\n", - "# True: zonal mean\n", - "# False: CFED" - ] - }, - { - "cell_type": "markdown", - "id": "414f7d1c-1b87-4fce-a618-92cb0b56a08c", - "metadata": { - "jp-MarkdownHeadingCollapsed": true - }, - "source": [ - "### internal process" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "3295478a-ad57-45a5-924d-89965bf9a1cc", - "metadata": {}, - "outputs": [], - "source": [ - "Nlvdplr = 80\n", - "Nlvtemp = 57\n", - "NlvdBZe = 35\n", - "\n", - "temp = -79.0 + 2.0 * np.arange(Nlvtemp)\n", - "zgrd = -39.0 + 2.0 * np.arange(NlvdBZe)\n", - "vgrd = -7.9 + 0.2 * np.arange(Nlvdplr)\n", - "\n", - "Nlvhght = 60\n", - "hght = 0.125 + 0.25 * np.arange(Nlvhght)\n", - "\n", - "Nlvglat = 144\n", - "glat = -89.375 + 1.25 * np.arange(Nlvglat)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "125d2e01-a852-416d-a93c-86052f30bfdc", - "metadata": {}, - "outputs": [], - "source": [ - "# target region\n", - "\n", - "if zone=='tropics':\n", - " rgnID = 0\n", - "elif zone=='mid-north':\n", - " rgnID = 1\n", - "elif zone=='pol-north':\n", - " rgnID = 2\n", - "elif zone=='mid-south':\n", - " rgnID = 3\n", - "elif zone=='pol-south':\n", - " rgnID = 4" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "62a61e04-41b7-4dc0-af99-b8dfcc7b42b7", - "metadata": {}, - "outputs": [], - "source": [ - "# data access\n", - "\n", - "if vname=='Doppler velocity':\n", - " if zonal_mean_flag:\n", - " var=np.fromfile(\"../data/EarthCARE/vd_zonal_mean.grd\", dtype=np.float32)\n", - " var = var.reshape( (5,8,Nlvhght,Nlvglat) )\n", - " else:\n", - " var=np.fromfile(\"../data/EarthCARE/cfed_Vd.bin\", dtype=np.float32)\n", - "elif vname=='radar reflectivity':\n", - " var=np.fromfile(\"../data/EarthCARE/cfed_Ze.bin\", dtype=np.float32)\n", - " zonal_mean_flag = False\n", - "elif vname=='terminal velocity':\n", - " if zonal_mean_flag:\n", - " var=np.fromfile(\"../data/EarthCARE/vd_zonal_mean.grd\", dtype=np.float32)\n", - " var = var.reshape( (5,8,Nlvhght,Nlvglat) )\n", - " else:\n", - " var=np.fromfile(\"../data/EarthCARE/cfed_Vf.bin\", dtype=np.float32)\n", - "elif vname=='vertical air motion':\n", - " if zonal_mean_flag:\n", - " var=np.fromfile(\"../data/EarthCARE/vd_zonal_mean.grd\", dtype=np.float32)\n", - " var = var.reshape( (5,8,Nlvhght,Nlvglat) )\n", - " else:\n", - " var=np.fromfile(\"../data/EarthCARE/cfed_Wa.bin\", dtype=np.float32)\n", - "elif vname=='Ze-Doppler':\n", - " var=np.fromfile(\"../data/EarthCARE/pdf2_zv.bin\", dtype=np.float32)\n", - " zonal_mean_flag = False\n", - "elif vname=='Ze-terminal':\n", - " var=np.fromfile(\"../data/EarthCARE/cfed_zf.bin\", dtype=np.float32)\n", - " zonal_mean_flag = False" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "5f3a14a2-0e88-40be-9248-240a590fd3a1", - "metadata": {}, - "outputs": [], - "source": [ - "if zonal_mean_flag:\n", - " pass\n", - "else:\n", - " if vname=='radar reflectivity':\n", - " var = var.reshape( (5,5,Nlvtemp,NlvdBZe) )\n", - " window = 2.0\n", - " extent = [ -40.0, 30.0, 20.0, -80.0 ]\n", - " iy = np.where((temp >= -80.0) & (temp <= 20.0))[0]\n", - " ix = np.where((zgrd >= -40.0) & (zgrd <= 30.0))[0]\n", - " xtics = 5.0 ; ytics = 10.0\n", - " vmax = 0.2\n", - " origin='upper'\n", - " elif vname=='Ze-Doppler' or vname=='Ze-terminal':\n", - " var = var.reshape( (5,5,Nlvdplr,NlvdBZe) )\n", - " window = 2.0*0.2\n", - " extent = [ -40.0, 30.0, -6.0, 6.0 ]\n", - " iy = np.where((vgrd >= -6.0) & (vgrd <= 6.0))[0]\n", - " ix = np.where((zgrd >= -40.0) & (zgrd <= 30.0))[0]\n", - " xtics = 5.0 ; ytics = 1.0\n", - " vmax = 3\n", - " origin='lower'\n", - " else:\n", - " var = var.reshape( (5,5,Nlvtemp,Nlvdplr) )\n", - " window = 0.2\n", - " extent = [ -6.0, 6.0, 20.0, -80.0 ]\n", - " iy = np.where((temp >= -80.0) & (temp <= 20.0))[0]\n", - " ix = np.where((vgrd >= -6.0) & (vgrd <= 6.0))[0]\n", - " xtics = 1.0 ; ytics = 10.0\n", - " vmax = 2.0\n", - " origin='upper'" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "02c2d337-fb7c-4c23-a78b-111110b75c4c", - "metadata": {}, - "outputs": [], - "source": [ - "# cloud regime\n", - "if zonal_mean_flag:\n", - " pass\n", - "else:\n", - " if ctype=='ALL':\n", - " sel = var[rgnID,0:3,:,:].sum(axis=0)\n", - " elif ctype=='stratiform':\n", - " sel = var[rgnID,3,:,:]\n", - " elif ctype=='convective':\n", - " sel = var[rgnID,2,:,:]\n", - "\n", - "# warm:0 upper:1 conv:2 strat:3 other:4 all:5 w/o warm:6" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "5410286f-6ef3-4f4f-8545-9d9c00c979cb", - "metadata": {}, - "outputs": [], - "source": [ - "if zonal_mean_flag:\n", - " pass\n", - "else:\n", - " if vname=='Ze-Doppler' or vname=='Ze-terminal':\n", - " smpl = sel.sum()\n", - " smpl = smpl.T\n", - " nrm = 1e-2 * window * smpl.sum()\n", - " else:\n", - " smpl = ( sel.sum(axis=1) * window )[:,None]\n", - " nrm = np.broadcast_to(smpl,sel.shape)\n", - " \n", - " zero_check = (nrm < window)\n", - " work = np.zeros_like(sel)\n", - " \n", - " work[~zero_check] = sel[~zero_check]/nrm[~zero_check]\n", - " work[zero_check] = np.nan\n", - " cfed = work[np.ix_(iy,ix)]" - ] - }, - { - "cell_type": "markdown", - "id": "7c08110a-4bf0-420b-9d4d-5d05368ccc7b", - "metadata": {}, - "source": [ - "---" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "43319578-dbc9-4500-88fa-5192ce01bbcf", - "metadata": {}, - "outputs": [], - "source": [ - "if not zonal_mean_flag:\n", - " pass\n", - "else:\n", - " if vname=='Doppler velocity':\n", - " sumID = 0 ; numID = 1\n", - " elif vname=='terminal velocity':\n", - " sumID = 2 ; numID = 3\n", - " elif vname=='vertical air motion':\n", - " sumID = 4 ; numID = 5\n", - "\n", - " if ctype=='ALL':\n", - " totl = var[0:3,sumID,:,:].sum(axis=0)\n", - " smpl = var[0:3,numID,:,:].sum(axis=0)\n", - " elif ctype=='stratiform':\n", - " totl = var[3,sumID,:,:]\n", - " smpl = var[3,numID,:,:]\n", - " elif ctype=='convective':\n", - " totl = var[2,sumID,:,:]\n", - " smpl = var[2,numID,:,:]\n", - "\n", - " zero_check = (smpl < 1.0)\n", - " zmn_work = np.zeros_like(smpl)\n", - " \n", - " zmn_work[~zero_check] = totl[~zero_check]/smpl[~zero_check]\n", - " zmn_work[zero_check] = np.nan" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "843e2f9c-a5d2-42ba-be18-29d4a07ffe0e", - "metadata": {}, - "outputs": [], - "source": [ - "if not zonal_mean_flag:\n", - " pass\n", - "else:\n", - " window = 0.2\n", - " xtics = 30.0 ; ytics = 2.0\n", - " origin='lower'\n", - "\n", - " extent = [ -90.0, 90.0, 0.0, 15.0 ]\n", - " zmn = zmn_work" - ] - }, - { - "cell_type": "markdown", - "id": "e316738a-98f2-4d0c-ad2f-73b2184e6b36", - "metadata": { - "jp-MarkdownHeadingCollapsed": true - }, - "source": [ - "### make figure" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "21c37598-91ff-4b32-a1bb-cd565146fcc9", - "metadata": {}, - "outputs": [], - "source": [ - "colors=np.array(\n", - " [\n", - " [248,248,248,1],#white\n", - " [160,210,255,1],\n", - " [ 33,140,255,1],\n", - " [ 0, 65,255,1],\n", - " [ 0,185, 0,1],\n", - " [250,245, 0,1],\n", - " [255,153, 0,1],\n", - " [255, 40, 0,1],\n", - " [180, 0,104,1],\n", - " [ 45, 45, 45,1],\n", - " ],dtype=np.float64\n", - ")\n", - "colors[:,:3] /=256\n", - "color_listed=ListedColormap(colors)\n", - "color_linear=LinearSegmentedColormap.from_list('color_linear',colors=colors)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "e594689e-b171-4ff0-876b-ab02247e8ee0", - "metadata": {}, - "outputs": [], - "source": [ - "tmp=np.array(\n", - " [\n", - " [ 1, 64, 38,1],\n", - " [ 71,108, 25,1],\n", - " [154,125, 66,1],\n", - " [206,185,156,1],\n", - " [242,239,246,1],\n", - " [236,196,225,1],\n", - " [204,124,186,1],\n", - " [164, 65,138,1],\n", - " [101, 2, 75,1],\n", - " ],dtype=np.float64\n", - ")\n", - "tmp[:,:3] /=256\n", - "near0=LinearSegmentedColormap.from_list('lower',colors=tmp)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "e20b3b56-8732-400a-9ed0-8fb9d706bd6a", - "metadata": {}, - "outputs": [], - "source": [ - "tmp=np.array(\n", - " [\n", - " [ 26, 51, 51,1],\n", - " [ 35, 85,130,1],\n", - " [ 61,144,199,1],\n", - " [120,197,204,1],\n", - " [231,255,232,1],\n", - " ],dtype=np.float64\n", - ")\n", - "tmp[:,:3] /=256\n", - "lower=LinearSegmentedColormap.from_list('near0',colors=tmp)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "036d42bd-7b01-4dd1-8832-103e506fd51b", - "metadata": {}, - "outputs": [], - "source": [ - "N1 = 128\n", - "N2 = 256\n", - "\n", - "lower_linear = lower(np.linspace(0, 1, N1))\n", - "near0_linear = near0(np.linspace(0, 1, N2))\n", - "\n", - "hoge = np.vstack([lower_linear, near0_linear])\n", - "\n", - "zmn_color = ListedColormap(hoge)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "63251813-c7d4-4e45-a235-8341f6135216", - "metadata": {}, - "outputs": [], - "source": [ - "%%capture\n", - "if zonal_mean_flag:\n", - " pass\n", - "else:\n", - " plt.ioff()\n", - " \n", - " fig, ax = plt.subplots(figsize=(16,9))\n", - " im = ax.imshow(cfed,\n", - " extent=extent,\n", - " interpolation='nearest',\n", - " origin=origin,\n", - " vmin=0, vmax=vmax,\n", - " cmap=color_linear,\n", - " aspect='auto')\n", - " \n", - " if vname=='Ze-Doppler' or vname=='Ze-terminal':\n", - " ax.set_title(\"2d-PDF: \"+vname, fontsize=32, pad=16)\n", - " else:\n", - " ax.set_title(\"CFED: \"+vname, fontsize=32, pad=16)\n", - "\n", - " if vname=='radar reflectivity' or vname=='Ze-Doppler' or vname=='Ze-terminal':\n", - " ax.set_xlabel(\"reflectivity (dB Ze)\",fontsize=22)\n", - " else:\n", - " ax.set_xlabel(\"velocity (m/s)\",fontsize=22)\n", - "\n", - " if vname=='Ze-Doppler' or vname=='Ze-terminal':\n", - " ax.set_ylabel(\"velocity (m/s)\",fontsize=22)\n", - " else:\n", - " ax.set_ylabel(\"Temperature (degC)\",fontsize=22)\n", - " \n", - " ax.xaxis.set_major_locator(MultipleLocator(xtics))\n", - " ax.yaxis.set_major_locator(MultipleLocator(ytics))\n", - " ax.tick_params(axis='both', which='major', labelsize=18)\n", - " \n", - " cbar = fig.colorbar(im, ax=ax,\n", - " orientation='vertical',\n", - " pad=0.02,\n", - " fraction=0.045,\n", - " shrink=1.0)\n", - " cbar.set_label(\"\", fontsize=13)\n", - " cbar.ax.tick_params(labelsize=16)\n", - " \n", - " \n", - " fig.tight_layout()" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "59fc2653-f03d-4c20-9206-7589e180b816", - "metadata": {}, - "outputs": [], - "source": [ - "%%capture\n", - "if not zonal_mean_flag:\n", - " pass\n", - "else:\n", - " plt.ioff()\n", - " \n", - " fig, ax = plt.subplots(figsize=(16,9))\n", - " im = ax.imshow(zmn,\n", - " extent=extent,\n", - " interpolation='nearest',\n", - " origin=origin,\n", - " vmin=-4.0, vmax=2.0,\n", - " cmap=zmn_color,\n", - " aspect='auto')\n", - " \n", - " ax.set_title(\"zonal mean: \"+vname, fontsize=32, pad=16)\n", - "\n", - " ax.set_xlabel(\"latitude\",fontsize=22)\n", - " ax.set_ylabel(\"height\",fontsize=22)\n", - " \n", - " ax.xaxis.set_major_locator(MultipleLocator(xtics))\n", - " ax.yaxis.set_major_locator(MultipleLocator(ytics))\n", - " ax.tick_params(axis='both', which='major', labelsize=18)\n", - " \n", - " cbar = fig.colorbar(im, ax=ax,\n", - " orientation='vertical',\n", - " pad=0.02,\n", - " fraction=0.045,\n", - " shrink=1.0)\n", - " cbar.set_label(\"\", fontsize=13)\n", - " cbar.ax.tick_params(labelsize=16)\n", - " \n", - " \n", - " fig.tight_layout()" - ] - }, - { - "cell_type": "markdown", - "id": "bfc0da8a-a5c5-40b8-a0f7-ac1496802524", - "metadata": {}, - "source": [ - "### results" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "009c34ad-ecaf-426e-8917-5be596ed7295", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABjAAAAN5CAYAAACmCHL9AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA91xJREFUeJzs3Qd0VNXWwPGdTAoJCYFQpSMqHaSKFBVBAQFFxAIWmopdbE9ABRQF9aF+2AsqdgSlKk1AkKJIURFREOkgvYQSUudb++jkTZKZMJNJOZn8f2vdNe3euWfunYRw9t17hzidTqcAAAAAAAAAAABYJLSwBwAAAAAAAAAAAJAVAQwAAAAAAAAAAGAdAhgAAAAAAAAAAMA6BDAAAAAAAAAAAIB1CGAAAAAAAAAAAADrEMAAAAAAAAAAAADWIYABAAAAAAAAAACsQwADAAAAAAAAAABYhwAGAAAAAAAAAACwTlhhDwAAABQdW7dulQ0bNsjOnTslISFBUlJSJC4uTkqXLi3VqlWTZs2aSWxsbGEPEygUNWvWlO3bt2f6edHnEBxOnTolH374ocydO1d+/vlnOXTokJw4cSLTOk6nM+N+//795YMPPsh4/P7775vn4J9LLrlElixZkvH422+/Nc/ZICQkxOv5BwAAQN4ggAEAAHK0dOlS+eijj2TWrFmyd+/eHNcNDQ2VunXrypVXXik333yz1K9f/4xHd9SoUfLkk0/myVnIacI46+RyoPr16ycTJ070edLN2/GKjIyUEiVKSPny5aVixYpy7rnnmuPWpk0badGihYSHh+fZmAHkjv4sX3/99bJv3z4OIQAAAFCACGAAAACPfvzxRxkyZIh8//33Ph+h9PR0k6Ghy7PPPitt27Y1t+3ateMoezleiYmJZjly5Ihs2rTJBIxcSpUqJVdddZXceuutctFFF3EMgUKwfv166dq1q/k5he80S2X69OkZj88//3zp2bNnsT6Eejz0uLjo8dDjAgAAAO8IYAAAgEzS0tJk5MiRMmbMmBzLYWj2QJkyZSQpKSlbGRWX5cuXS/v27eU///mPPPfccxxpP2mZLs1+0UUzMl555RVTpgtAwbn//vszBS+io6Old+/e0rhxYylZsiSnwgudqHfPrtOsNQIY0zOVFdPMQAIYAAAAOSOAAQAAMmhPiz59+siXX36Z7ajUqFFDrrnmGnMlcpMmTaRs2bImiKE0gPH777/L4sWLZcqUKbJq1apM227cuNHnoxwfHy/PPPNMrs6KjslX3bp1k+7du0tu1alTx6/1W7dubSbwPNXVP3r0qFm2bNkiP/zwg6mtn9WKFSukVatW8vTTT8vQoUNzPW4AvtOfyUWLFmU8joqKkpUrV0rDhg05jAAAAEABIIABAAAyDBgwIFvwQht0P/HEE3LPPfdIRESEx6MVExMjLVu2NMsjjzxiJvgef/xxWbBggd9HV5uA33HHHfl+VrS/REHsxz3g4ev+tJTUu+++K++8844pLeWeHTNs2DDZs2ePvPzyy/k4WgCuLDJ3GsQleFGwNDBuK5p2AwAA5L9/LpsEAADFnk6If/LJJ5mOQ9WqVc2V/w8++KDX4IUnF1xwgXzzzTem9JEGJOCf8847z5Tc2rlzp9x+++3ZXtdSUi+99BKHFchnf/zxR6bHTZs25ZgDAAAABYgABgAAkG3btpkr+7OWY1q2bJnUq1cv10fopptuMs3Azz77bI5yLmh9/bfeeksmTJggISEhmV579NFHTdkuAPlHS7tlzUgDAAAAUHAIYAAAABk1apTpxZD1Kn/texGounXryrhx4zjKARg0aJApzZW1X4kGMQDkn6y/F119fwAAAAAUDHpgAABQzO3duzdb6agOHTqYZt55hUm/wGlj89mzZ8v69esznvvqq6/kzz//lHPPPVeKmu3bt8vq1atlx44dcvLkSZNtcuGFF5pm5zk5cOCAbNiwQTZv3myujj99+rTExcVJmTJlpFGjRqY/QV5+344dOybfffed7Nq1Sw4fPmxKommJr7Zt2+Z5eTT9LFqySJve79u3T44fPy4lSpQwje2rVatmjo32m8kvut+ffvpJdu/eLYmJiVKqVCm59NJLC6zng34PtIm99oDR3i96HitVqiT9+/f3aXvNSPrtt9/Md0S312yJChUqSKtWraR69epFuseBfp7vv//efC/084WFhUn58uXNz772HnI4HHm2L/3Mv/76q/k+HDx40Ow7MjLSZOVpLx/9OcvP7yEAAACQiRMAABRr48aN0xm6TMuUKVMKbP8jR47MtO8aNWrky370fd33o/vNTxdffHGm/fXr1y/g95wwYUK2c/X44487baOf1X2M77//fsZrn3/+ubNZs2bZPoe3Y5SamupcsGCB884773TWqVPH43bu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qVKl5Isvvsh05bL2jch6lXlWuo1ere+i53nGjBnmSnZvdB3N8MhtiRktCdO7d29xOBw+b3PrrbfKiBEjMh5rKRjXFe/+uuCCC0y9/8jISCks2vvC159fzUp45JFHsmX3PPzww2fs66JZJl9//XWm8ljaf+PAgQNiixdffFF27tyZ8VivzP/qq69Mhk5ONEPi1VdfNb1RXDTLRD+fNz/99JN88sknmZ677bbbzDZavswXzZo1Czg7Ia9l/Vn88ssvTbk0X79fH330UY7vV9jKlStn+gi5aAxFM7N8pRkb7m6//XaPJfgAAABswl8rAAAUYydOnMj2XGFOzuPMPJ0fT30AbDNu3DiJiYkpkH1pCaKszYW1lExOsk4CamkX7Q3gazPpguobofSzuffGONNn80bLbfkTPMlrWq5JF19NnjzZBDjdJ/i1hJavNIih5adctCRS1gnrwvxd/Prrr2c81vOipcG0740vNICjJc3cz6f2OvAma58MbQA+fvx4Keq0lJ42I3fRUmhaQswX2th63759mUppaX8I22Qtc6c9O7KWgvRk48aNmX5XaHks7UEDAABgOwIYAAAUY8nJydme89asFXbwFATwdB7dab8AvVLXfSlI2vdCe14UpKzNzrM2q3enNfOXLl2a6Tntp+ArbbZ9ww03SEHRYEndunUDauSuV89rX5HCpFd/+0OzRdzde++9Z8y8yCrredLsHBvMmzdPjhw5kvFYe3lo/wl/aBDCvYeR9kg5fPiwx98X2i/G3YMPPihRUVESDLJmTWRtyu1N1vU0iOmpEbwNQZpWrVplPD548KDpSeJv9kXPnj0z9XsBAACwlX1/kQEAgALjfhW3LVfzawmrZ555xq9tKleu7Pd+tGGxP1d/uyvMkjueyqEU5nh80b59+zydCDx27JgpCaXlf7Qxs15lnTUoow2O3bmX5slKmxG7b68Nwv1tiq6Tgf6UcsmpjM2mTZtMA2L9bHq+tVF7Vu4BC91Gy4jVqlXL5/106NBBCpMGHnxprO5eKkubR7vLzdXxGvjRiXrX8dNG0zbIGkg5UwPunAJTK1euNPf1O62BO23G7U5fd//+aAmhvn37SrC46aabZOjQoaZhtasx+p9//innnnuu1200CKDlumwuH5U1wOreRF2DE/q5vdHzrQ3E3d155535OkYAAIC8QgADAIBizNPV/Do5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DxO80JOkmRwnT54020+aNEliY2NN9Oumm27y+0QBAAAAAAAAAILP9OnTzQS/BhxWrlxpggtffvml/Pnnn6bKz7Jly+SJJ57w+f2aN28ukydPloMHD5ogyGeffWYCCTo3rfPWP/74ozz44IPZttN5bK1MpLfDhg0zgQud19Zbfaxz3fq6+8X+LrfffruZT9esD83g0P1rNaOvvvpKQkNDTYBm3bp1fh8bMjDcdOjQQRYvXiznnHOO/P777yba5U5Ta+rWrWtSZW644QZz4t29++67cuutt5r7K1askAsvvDDT67p+3759zX2NVOnJBAAAAAAAAAAUX5oRsWrVKnn66aflsccey/TasmXLTGaDlnLSjAZtVxCIjz/+WG6++WaTzXHs2LGMbA31+uuvy9133y3nnXeemR/XwINLenq61KtXzwQp3nzzTRk8eHDGaxs2bDDZGg6HQ/766y/TmsGdzpnr3LmnOfUzIQPDzd9//21utbZY1uCF0pN5/vnnm/snTpzI9voHH3yQEQjJGrxQeoJq1apl7n/44Yd+nSgAAAAAAAAAQHDZvXu3CV4o18Xv7tq1ayfVqlUzLQpmz54d8P60xYHSLArN0HDnqjqk89juwQulj6+//npzf+rUqR63a9u2bbbghfvnmjVrlt/9PAhguNFG3eqXX34x5aCy0oP7888/m/stWrTI9Jqm1Wh9MNW1a1ePBzskJES6dOli7mvNMgAAAAAAAABA8aVlnVR8fHzGxe9Ztfh3Ltq1biC0LJWKiIgw+/Q0lqxz32cah6/baQkq1/59lT3NoBjTBt5z5swxNbr69OljOrVrOSm1ceNGGTp0qCkfVbt2bdPI252m1GgajdLGJt64Xtu7d68cPnw425fERSNqrsbfSt9b1y9btqwJhAAAAAAAAACALZxOpxw/flwqV66c7er9/HT69GlJTk4W245F1jlcLQGlS1Zbt241t9WrV/f6ftWqVcu0biDjev7558397t27ZxqPnrtDhw7lOBbXOA4cOGCCEdrU25fPUKpUKbMkJCSYdevXr+/zmAlguNEG3Nqg+9FHH5UvvvjCLK7O7ppSo13ZNcihtcj0gLvbs2dPxv0qVap4PeDur+k23gIYGjx58sknfT6RAAAAAAAAAFDYdu7cKVWrVi2w4EVsbKzHajqFSZtxZ21BMHLkSBk1alS2dTVwoFzB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3Q4ePGiKG9WuXdvkByxVqpQZ6jZ9+nRTkAjpaWGot99+2wxNrFevnsm1GB0dLZUqVZKbbrrJFIfKjA5dzM5xv2zZMro/wH3vxvnef5qjc9GiRWZobNeuXc3QW/exmtEoy7Q43wev79043wcW5/K8xXk6/3FM230e5xyev/3O75bg/2bneyD/+57vgeBfo+Fcj1xzoUD56aefXEWKFNGrr54pM3v27HFVq1bNs2zRokVd0dHRnn83atTIdfTo0Xxrf0Hx8MMPp+pj7fO4uLhUz5UpU8a1evXqDNd//vnnzTKRkZGusmXL+px2796d758t1PterV+/3lW6dGnP8sWKFXNFRER4/n3NNde4EhIS8vVzFQTefeTu+9jY2FTPde7c2XX69OkM13/77bfNMuHh4Zke9998802+f7ZQ73vF+T5nvvzyy1T97D3puTwrnO+D1/eK833gcS7PO5yng4Nj2t7zOOfw/O93frcE9zc73wPB6Xu+B4J7jYZzPQKBERgFiBYD79OnjykI3rJlyyyXT05Oluuvv97U9tACLVqpXiu/6x0b7733nsTFxcmmTZtMBBupNW/eXF599VX59ttv5dixY3L27Fk5efKkuVti5syZpsD74cOHTaRfC+D4csUVV5iiN76matWq0fUB7nt9TosR6R0aenfAunXrzLp67E+YMMHcKbBkyRIZMGAAfZ/BOUP7f9KkSabQkvb9qVOnTC2fe++91yyjd3vdf//9mfZd5cqVMz3udSQMAtv3nO9zp2TJktK+fXt54okn5D//+Y+UK1fO721wvs//vud8n7c4lwcW5+ng45i26zzOOTw4/e7G75b8/83O90Dw/6/K90D+X6PhXI+ACUgYBPli3LhxJrJ5xx13eO6cyGwXTp8+3bNMRpHQOXPmeF5ftmxZHrc+tCxZssTTd7NmzUr3unv/XHnllUFpX2Hu+2effda8FhMT49q1a1e610eMGGFedzgcrh07duRTqwuGL774ItPX77//fk/f79271+edLVWrVs3DVoam3PY95/ucS05OTvecHsP+jsDgfJ//fc/5Pm9wLs8bnKeDh2PazvM45/Dg9Du/W4L3m53vgeD1Pd8DwbtGw7kegcIIjAJCo8rPPPOMyTH32muvZWsdjYSqtm3bZjhio3v37lK9enUz/8477wS4xaGtRYsWnvnff/89qG0pbLLqe/ex7H18e+vfv7+pBeN0OmX27Nl53NqCRc8VmXHf2aLWr1+fDy0qPHLb95zvc87hcORibQSz7znfoyDhPI1QlJvzOOfw4PQ7gvebne+B4PU9gneNhnM9AoUARgFx3333mRQ4Y8eONcOzsqJpolatWmXmO3funOEyWuSrU6dOZn7p0qUBbnFoW7FihWf+4osvDmpbCpvM+n7Hjh2yd+/eTI97DV64Uxhx3PunSJEinnkNACH/ZNb3nO9RGHG+R0HCeRpIjXM4Cttvdr4Hgtf3CN41Gs71CCQCGAXAtGnTZPny5dKhQwfp1atXttbZvn27qZmh6tev73M592ual/7o0aMBanFoSkhIMPVEtI7CXXfdZZ675JJLTJ0RX7Zt22b6uGjRoubCee3atU0wSmuPIPB9v3XrVs98do77H3/8kd3gh6+++soz36BBA5/L/fXXX9KkSRNzzMfExEiNGjVMrR3v9RG4vud8bwfO9/mL833e41weOJyn7cAxbQ/O4cHH75b8/c3O94Ad/1fleyB/r9FwrkcgEcCw3P79+01hLr0IOGXKlGyvd+DAAc98xYoVfS7n/Zr3OkgdydfRKvqoKYk0BZEWLmrVqpUJLEVHR/vsLi1kpD9WdP/pCf7nn3+W6dOnm4u7zz77LN0c4L7397jXwlNa+AtZO378uIwcOdLM6wgWDcb5oncYbdy4UaKiokwgVVPgabouHfbbp08fU4ANget7zvd24Hyfvzjf5z3O5YHDedoOHNP24BwefPxuyd/f7HwP2PF/Vb4H8vcaDed6BBIBDMvdf//9cuLECXnhhRfMXczZFR8f75nXu/998X7Nex38rVy5clK2bFmJjY31PKcXYseNGydVqlTJsKtq1qwpo0aNMkPmzp07J0eOHDEpwJYsWWKCFy6XS4YPHy5jxoyhqwPY9xz3eUODEHpXxR9//GF+qOhdFhmpUKGCPP/88/L999+b415HdbmHS+sIMvX222/LwIED86ilhbPvOe6Di/N9cHDc5x3O5YHH8RpcHNP24W8iePjdEpzf7Bzzwf3/Et8DwblGw3GPgApYOXC43n77bZd2aU6nRYsWperFd9991zz/j3/8w5WUlJTqteeff96zXkZmz57tef2XX37xuXeWLl3qWW716tUFdi8Guu99OXjwoGv06NGukiVLusLCwlxDhw71u61nz551NWvWzLxvsWLFXMePH3cVZDb1/fDhwz3bTfs3423q1Kme5Q4cOOAqqPKr7/v16+dZ580338xRW51Op+vGG2802wgPD3f9/PPProLMpr7nfB/4vq9atapZVr9rc4Pzfd71fWE739twPgrFc3l+KWzn6YKEYzrwsnMe5xwenH4vbL9b8lNWv9n5Hghe32eF74Gcy+oaDed6BBIjMCx18OBBGTBggDgcDlMDIyIiwq/14+LiPPN6B7Qv3q95r4OMXXTRRTJo0CBZvHixGTb34osvymeffeZXd+ldASNGjDDzmr5Ih9khMH3PcR94jz/+uOcultdee82kgMqJ8PBwGT16tOcumU8//TSg7SzMfc9xby/O93mH4z44OJfnDMervTimg4O/CTvxuyXvfrNzzNv7f1W+B/LuGg3HPQLJv6viyFSPHj2kS5cuOe6lEiVKeOYHDx5s0g49+OCDUqdOnXR5+hMTEz3z7tc037xO7iFy3nU0GjZsmOF76mtu3usU5r7PjubNm0vr1q3lm2++kalTp/r93i1btvTM79q1Swoym/o+7XFfvHjxTI97fV0LTRdUed33Tz75pCfNmQYfNKiaG1rUq0yZMibnLsd94Pqe833ennNyi/N93vR9YTvf2/Q9HErn8vxS2M7TBQ3HdP7jHG6vUPrdkh+y+5ud74Hg9X128D2QO76u0XCuRyARwAggLVaTWUFnf2jRWzV58mQzZcYd1Xz00UdN3jlVt25dE0nWO523bt0qnTt3znBdfc2dx65UqVJSUAWy77PLXQh6586dUpjZ1Pf169dPdWzr30Fmx329evWkIMvLvn/iiSc8Iya0noveWQE7+57zPUL5fO9LYTvfF5T9gowVtvM0kBXO4QgF/vxm53sgeH2P4F2j4VyPQCKFVIjS4tytWrUy8zqcKyNaSFqLSquOHTvma/tCgfuOlJyk3lqzZo1nvnr16gFtV2Hu+1q1ankKR/k67rWY+ooVK8w8x73vobjePwj1B2Ig/Prrr+aOXcVxH7i+53xvN873eYPzffBwLvcf52m7cUznP87h9uJ3S978Zud7wO7/q/I9kDfXaDjXI6ACWlED+SarIt5q+vTp5nUtprNmzZp0r7///vuebSxbtiyPW1xwJCcnu1JSUjJdRvtL+1X77sknn0z1Wlbrnjt3znX55ZebdWNjY13Hjh0LSLtDQW77Xj377LPmtaJFi7p2796d7vVXXnnFvO5wOFw7duwIaPtDwaBBgzznBS3IlV1Z7Td9/eabb/YUfv3pp58C0NrQktO+V5zvg1MIk/N9cIuQcr4PPM7leYfzdHBwTNt7Huccnv/9zu+W4P5m53sgOH3P90Bwr9FwrkegEMAI4QBGUlKSq0GDBmaZihUreoIUTqfT9cEHH7iKFy9uXuvcuXM+ttx+etH7sssuc/373/92/frrr6lO1nv37nWNHDnSBB6070qVKuX6448/Uq3/1Vdfudq3b+965513XPv27fM8n5iYaPZBs2bNPPtOL6YjcH2vjh8/7ipXrpxZpl69eq7169eb5xMSElyTJk1yRUVFmdcefPBBuj6NJ554wnNsjh071u+/Gz220+47Pd98++23rmuuucazbfo+sH2vON/nztGjR11//fWXZ6pcubLZF7pfvJ+Pj49PtR7n++D1veJ8H3icy/MO5+ng4JjOezk9j3MOz/9+53dLcH+z8z0QnL7neyC412g41yNQCGCEcADDfbKpVq2aZ1m9K71IkSKefzdq1Mj8+EHqPnP3j056wbtMmTKek7J7ql69umvjxo3puu7LL79MtVxMTIxZPzIy0vOc3oE+ZMgQuj3Afe+mQYvSpUt7lo+Li0vV/x07djQjYfC33377LdXxWbZs2UynV199NdN9Fx0dbfadPno/f88995gf7whc33O+D9xdi1lNvXv3TrUe5/vg9b0b5/vA4lyet/hdnv84pu0+j3MOz99+53dL8H+z8z2Q/33P90Dwr9FwrkcgUMQ7xFWrVk1++OEHkyNw/vz5pjh4ZGSkXHrppdKjRw/p37+/REVFBbuZVqlQoYLMnTtXvvrqK1m7dq0cOHDA5O13OBymvsJll10mN954o/Ts2VNiYmLSrd+gQQPT399++61s2bLFrHv8+HGT91KLiLZp00b69u1rlkNg+96tSZMmsm3bNnnllVfks88+k3379klsbKwpItW7d2/p06ePKaaJv2lhUe/5gwcPZto9p06dSvXvsmXLyhtvvGGO+82bN8tff/0lx44dkyJFiph6F1dccYXpd3dtHgSu79043+c/zvfBx/k+sDiX5y3O0/mPY9punMPzF79bgv+bne+B/O97vgeCf42Gcz0CIUyjGAHZEgAAAAAAAAAAQIBwCzIAAAAAAAAAALAOAQwAAAAAAAAA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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display(fig)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "51b015e1-d4d4-4bf6-ab3e-e1df9e55e344", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.13.1" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/driver/check/.ipynb_checkpoints/MIROC_check-checkpoint.ipynb b/driver/check/.ipynb_checkpoints/MIROC_check-checkpoint.ipynb deleted file mode 100644 index 21622a2717..0000000000 --- a/driver/check/.ipynb_checkpoints/MIROC_check-checkpoint.ipynb +++ /dev/null @@ -1,260 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "2ad48f61-e598-4a15-89f8-a0483fe2c9fe", - "metadata": {}, - "outputs": [], - "source": [ - "import xarray\n", - "import pygmt\n", - "import pandas\n", - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "dc10108f-956d-47bf-a02c-f42282da2ef1", - "metadata": {}, - "outputs": [], - "source": [ - "ds = xarray.open_dataset(\"../data/MIROC_inputs/ctrl_MIROCinput.nc\", decode_timedelta=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "eaf47183-d94f-49f7-a397-ce248957a526", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "xarray.Dataset {\n", - "dimensions:\n", - "\tlat = 128 ;\n", - "\tlon = 256 ;\n", - "\tlevel = 40 ;\n", - "\thydro = 9 ;\n", - "\n", - "variables:\n", - "\tfloat64 landmask(lat, lon) ;\n", - "\tfloat64 skt(lat, lon) ;\n", - "\tfloat64 orography(lat, lon) ;\n", - "\tfloat64 sunlit(lat, lon) ;\n", - "\tfloat64 pfull(level, lat, lon) ;\n", - "\tfloat64 height(level, lat, lon) ;\n", - "\tfloat64 height_half(level, lat, lon) ;\n", - "\tfloat64 T_abs(level, lat, lon) ;\n", - "\tfloat64 qv(level, lat, lon) ;\n", - "\tfloat64 rh(level, lat, lon) ;\n", - "\tfloat64 tca(level, lat, lon) ;\n", - "\tfloat64 cca(level, lat, lon) ;\n", - "\tfloat64 mr_lsliq(level, lat, lon) ;\n", - "\tfloat64 mr_lsice(level, lat, lon) ;\n", - "\tfloat64 mr_ccliq(level, lat, lon) ;\n", - "\tfloat64 mr_ccice(level, lat, lon) ;\n", - "\tfloat64 fl_lsrain(level, lat, lon) ;\n", - "\tfloat64 fl_lssnow(level, lat, lon) ;\n", - "\tfloat64 fl_ccrain(level, lat, lon) ;\n", - "\tfloat64 fl_ccsnow(level, lat, lon) ;\n", - "\tfloat64 dtau_s(level, lat, lon) ;\n", - "\tfloat64 dtau_c(level, lat, lon) ;\n", - "\tfloat64 dem_s(level, lat, lon) ;\n", - "\tfloat64 dem_c(level, lat, lon) ;\n", - "\tfloat64 mr_ozone(level, lat, lon) ;\n", - "\tfloat64 phalf(level, lat, lon) ;\n", - "\tfloat64 Reff(hydro, level, lat, lon) ;\n", - "\tfloat64 lon(lon) ;\n", - "\tfloat64 lat(lat) ;\n", - "\n", - "// global attributes:\n", - "}" - ] - } - ], - "source": [ - "ds.info()" - ] - }, - { - "cell_type": "markdown", - "id": "47c43a93-1549-4475-bb14-62e92a04287b", - "metadata": {}, - "source": [ - "---" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "4afebca7-6d9a-42e4-87f8-22381a3240cb", - "metadata": {}, - "outputs": [], - "source": [ - "%%capture\n", - "data=ds[\"tca\"]\n", - "data.load()\n", - "\n", - "zid=10\n", - "hid=1" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "f18b7b21-31f7-4d84-b9b7-8a2f0c188704", - "metadata": {}, - "outputs": [], - "source": [ - "var = data.isel(level=zid)\n", - "#var = data.isel(level=zid,hydro=hid)\n", - "\n", - "#lat = ds[\"lat\"].values\n", - "#lon = ds[\"lon\"].values" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "faf8c56f-18c9-4d70-97b8-37c086594c59", - "metadata": {}, - "outputs": [], - "source": [ - "region = [ -180, 180, -75, 75 ]" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "663f115e-1c8f-42d8-b233-3b7331f2c602", - "metadata": {}, - "outputs": [], - "source": [ - "lon, lat = np.meshgrid(var.lon, var.lat)\n", - "ll = np.column_stack([lon.ravel(), lat.ravel(), var.values.ravel()])\n", - "\n", - "grid = pygmt.xyz2grd(\n", - " data=ll,\n", - " region=region,\n", - " spacing=\"1.5d\",\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "e06f7d7f-9135-4007-85f5-9e91f679b585", - "metadata": {}, - "outputs": [], - "source": [ - "fig = pygmt.Figure()" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "67a53630-fc07-4cbf-b5fc-eabc5b57a137", - "metadata": {}, - "outputs": [], - "source": [ - "fig.coast(\n", - " region=region,\n", - " projection=\"W15c\", # Robinson 投影(15 cm 幅)\n", - " land=\"lightgray\",\n", - " water=\"white\",\n", - " frame=\"af\"\n", - ")" - ] - }, - { - "cell_type": "raw", - "id": "9fce5808-e758-4045-a8bc-8ba746f09c6f", - "metadata": {}, - "source": [ - "pygmt.makecpt(cmap=\"turbo\", series=[float(var.min()), float(var.max())])" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "34d714ca-db20-4b4b-8081-9f540e4ccd3d", - "metadata": {}, - "outputs": [], - "source": [ - "fig.grdimage(\n", - " grid=grid,\n", - " cmap=\"turbo\",\n", - " shading=True,\n", - ")\n", - "\n", - "fig.colorbar(frame=\"af\", position=\"JBC+w10c/0.5c+h\")" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "431e1d02-99ff-4ca5-a28d-f4db72f1d58f", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABywAAAPzCAIAAABqXWyyAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAACB0RVh0U29mdHdhcmUAR1BMIEdob3N0c2NyaXB0IDEwLjA2LjCzUUzDAAAgAElEQVR4nOzdd3xV9fkH8OfckeRmkh1CSMJK2IQNDoaICG7MjQXcratVa62zjtbW0dpqrVqt1p9aFUduXIh7ICBDQED2HmEkhOw97r3n98dt4zXPJ2EImZ/36/f6veKn3zz35N5zvufkyZdzDNM0hYiIqB1zuVzZ2dltvRVEREREP5XL5WrrTSAiorZhsAlLRETtUGPjNScnp623hYiIiOhEyszMFDZkiYi6GDZhiYioHUlLS9u3b19tbW1bbwgRERFRa2BDloioi2ATloiI2pjT6ZQWV7yOTp7V+LVZcwiOsdlDdThg2CQ4eOKtv9Lhc/F5OhyUVAYrVITO0+H7z+zXYYztKlgh9dMqHY4+bzwcvHhLvg7r8wp0eNh9AFZoKC3V4YzL8LZ5U+p0+OnKr3WYVNQfVqioOKzDOYnBOpy3oRpWiKyt0eGBxS/Bwckh4M0sqSrUYVhgGKxwy8236bD7aUN0eHEB+JRF5PdnJOpw3j7wTorITcEJOgxI3qbDodvvgxXKHOAdfvuLdXDw926PDudM6qHDp54E2yAiy2pe1qF32V4d9ipeASuIt0JnhhhwrMVi1WHvpEE6HDDzalihYdIAHT67GBy2IiIZYM+8d0KyDpdV4Q/0gtA4Hd7w6BQdXnHXPbDC63+7WYc1CSAUkVPH/kKHA9Ac+PaG7bBC3Sc7dBgXn6HD6RnNHOPp5Tp8Z/1NcHDVGvBx/Pq8O3S4dcAaWGF0cKAOrYF48LclX+pwXQH4QSb0AYetiGz87nkd5m8Fx/6vr5oMK3z8woc63NTMhOCpfV2HvcrABp/TC1dI7R2tw3krGnRYv+EzWCEsyKLDiCB8hA4ZmKrD3Gq7Dnfngv1ERHbWR+owJKwbHHygEpydLYfADD+sf29YobIeTCnl6HAuKwVTq4h49q7VYWDtLjhYasDcaHXEN369MvcN/I0iwoYsEVGnZmvrDSAioq7omBqvRERERJ2D/xWObsj6Lo0MwxA2ZImIOh02YYmIqJWw8UpERETUiA1ZIqIuhU1YIiI6idh4JSIiIjqio2zI+rqxWVlZvkssIiLqQNiEJSKiE4yNVyIiIqLj1kJD1nd95fv/bMgSEXUsfDAXERGdAEdsvM4cc6eI9B1/Jvxfu50H8gYbOEOVj8CPHspAzw9ZZn0GDs7ZOlOHfQLBc4r2LqyEFdKKh+vQOAwePeTdvgVWKDsAnoCUmgye1yQiSVPP0OHXkeBpVJdlOGCFV8K+0WH+W7Vw8GnWc3VYCp76I/Xf5cIKMaHg+Ve7vv5Yh4EFK2GFvr1SdBg57iI4eGM5eOjKzBngAx1z1rOwwicmeHrMNdXgAy2s+wpW+O1OEN4wBv+9Ic4NHig0cg949NChfPycq+fywDOCPht+DRzcMxEcSjtKeuow98PdsELwG311mLBzvQ6DGsATaUTE9IAnrQXYguDgxFRwfA2aBg7boO7gUxaRurgYHb73+WY4eM5N4Kfr0/8BHUZ78ITQtwI8kuiy58DDnbbPeQ1WCLYF6HBMKHhWkogk2et1uEvAwXjIDQ4NEVm3CqzDuCR0tg7fXbIEVng863QdPmOshoMTD/fT4Xcx4PFZo6pPgxX6x4OnMI124I8jqf4VHdYHJOnwwS1gG0RkUv9MHb78HZis9heAnUdE7AmTdGgEgydliYh7NZiKx44DT6LbYsPzj9EwTIfj7PE6HN4dP6vtgffBVJOw8Ww4eGzCYB2WVoJ5pmcUfrRXfhF4WmDe2g1wcFEhmO5CKsCkba0Dj6AUkbAo8Oi88CjwNDPTHgIrlFaAZ0jWVeCXk3ow2OIGp2yztgQWCLR6dWh4KkVk0feP4BdlQ5aIqCPgSlgiIjpOR9l4JSIiIqKfbsKwuxu/btKQ1StkeQNZIqL2hk1YIiI6BkdsvE4fepPvC0dQcCttExEREVEX42vIBkUkishni27y/5/4RC8iovaJTVgiIjqCo2+8EhEREVErO2vCU41fsyFLRNRusQlLRESAy+XKzs6WFnuvI+Ont+IWEREREdERnDXhqcTw/3798nw2ZImI2hE2YYmI6AdHXPTKxisRERFRh3DluT+skG2uIcsnehERtRo2YYmIurojLnrNyPjvFbw176PW2ywiIiIiOkEuu2GV74tXnx3ln/OJXkRErYZNWCKiLqrlRa+NjVciIiIi6jQau7HSTEOWy2OJiE4SwzTNtt4GIiJqJUdc9Dp55P2+L2788+36f50+aSP8rgPXn6fD9U+m6PCcXeNhBbt9sA6f+vwuHd763aWwQvT6dB2ef/YMONjWP1WHnyXt02FR/nJYIeY5Q4c93CU6HNwnBlYY/ug0Hb7h+BAOzq8vB+F78Tq0RoXBCrZ/H9Lh1HNmwsFr9uzSoWXdTh2mpfeFFb595yUdRtUs0eEVd/0DVki+MVWHvy8BZUVk/yzwR+Un/36zDscOxX9d6L23Xof3P3GvDl/NXKVDEZk34h4d9qrA78/bb7ysw6A4uw5LewfAChcPBgfCe4ffhoPvW5SqQ3suOMYzKobACsMde3VYmFegwx1L3ocVHI4QHUYk9IaDT3eer8P/2xeow90L3sMvt2aZDuNC6+DgS/7xsg5LK8EVcq1zHazw7qd36PCXMxN0+Me/VcAKWbOf1eHkgAvg4Htqwcv9peaPOvyoN54D0zd8oMPsIrDBt0++DFZIlSIdlnlXwMFxVWU6/P2HW0CF4ZNhhTv7g7OMe/+DcPAAR7IO9y0HL5fWEAorvLYczIFbe4N5pmegBVb48pBHhwU2fDjnWa/SYcTUKToMj8rDFT4A85L3c/CBJkROhBUufaSXDutDwSwqIpsXgAPhmwpwtyJzJ3655ODTdBhWBI5xEdn17ms6DKmp0qGnGuyWIhJiAzN8gAkOxt6DT4EVkoaO1OHOWnx+z/9+pQ5DbWCXEHclrOD1eHUYGGCFgx1hkTosKHfrMK0PuGwQEU9kT98Xr/4lFQ7g8lgiohOFK2GJiDq/lhe9NjZeiYiIiKhruuzOPb4vmnRjuTyWiOhEYROWiKhzOuKi19QBj4lIr2CwQImIiIiIuqbL7txTGRDu+/rdP0U15rx7LBHRT8QmLBFRp9Lyoldf45WIiIiI6Iguuq/Y94V/N1a4PJaI6LiwCUtE1OEdcdHrqJnfiEjh5m9bdbOIiIiIqFO46L7imkP/vevuJ8/3a8y5PJaI6OixCUtE1FG1vOjV13glIiIiIjqBzr52u+8L/26sqOWx7MYSETXBJiwRUUdyxEWvo5NniYg56letullERERE1MX4urFFn9wvIitz32jMG7uxIpKZmcmbFRAR+bAJS0TUAfh6r801XuV/vVciIiIiotbnfy3apCHLmxUQEfkYpmm29TYQERHW8g0H0tMfDa1aA/+n6/7woA4zfr5Ehw/tfAVWeNe4VofegzVwcN6bb+rw2aWf6fCRYdNghR4bL9JhmGnRYX1lCaxgy1+pQ3tYlA5FpDawpw7v+uuNOnzqrU2wwj/uHa3DTZG1Onw1dB6skG6+o8P5r2yBg2uiQZPdeMGqw8vPvgpWWF9t16G1AV8DlBfl69Cdf0iHZUveghX6OECFW1+bq8Pup++AFeZ9PUOHj6ycCQf/5YK/6dCZDo6Opb87D1b42aGJOsyw/1GHh/I3wwqTbgSV7znlVjj4wtuf06H3/nd1+HH0Xlihxw6wZ5buWgoHL5oWCgbLXTocZa2DFba5e+nwlicKdPhg3/GwwguPva/D3t0dcPDWA9U6rNn+hQ4N+P0iMSHgB5l9851wcNqFw3X4RSjY4Z/dsABWSHdM1uG9Y8H+U177HaxwaOk+UGEWmBhF5IrLf65D4z4wYb74f+BNExFLWKAOB58JjoJ+9tthhc/f26XDyrDL4OA/Z32uw9t+D0Zae18AK4y7HMxg3zy+DQ420XRnLPbq8OaXHoAV/vX2bB027BwFXmtXGawQvKxUh6FBeId3J/bXoacCnOzSxp8PK2zZt1yHDXvB7BESGAkrJKSDny7EBs4yIlI7PF2HtilBOowYAaY1EVn0LPjpJp96DRy8avtqHbpzdurQvrMcVoipPqzDlOREHRYU4QrxoQ06jO4JPjgRKWkI1mHPjAywDUl4lwiMidDhqsW5cLC1AUyYdRUVOiwoAiNFpPgQmH9sFeDlAh0hsEJlA1raZXpFZN0GPIdweSwRdU1cCUtE1O4csffauptDRERERHTMhg7+q++LJt1YLo8loq6JTVgiovaihd7r6ORZ5Q6wVouIiIiIqJ1roRsrfJYXEXUZbMISEbWxlnuvrb45REREREQnRePFrf99Y4XdWCLqGtiEJSJqG+y9EhEREVHXxG4sEXVBbMISEbUel8uVnZ3d3M1e2XslIiIioi7F/wLYvyHLbiwRdT5swhIRnXTsvRIRERERtQwuj2U3log6DTZhiYhOFvZeiYiIiIiOFbuxRNQpGaZptvU2EBF1Ki33XkfETmv82rA79IDpV9wBv3HQpeN0WNZvNRx8pr1ch3uGOHXoriyBFT5Is+jwuT5j4ODI5ZfoMKn6sA5tFi+sYFbs0GGo3arDqbOugRVq4vrrMOf95XDwzX+4SIe7Yyt1+Nzzb8IKjm/B2TMsLkWHRdfXwQpx7ybosCZ3Hxw8dNhEHRYfPKhDW2QUrFC4Y4MOQ4oPwMFVlRU6DDz4vg4nT7sUVpjw4oU63LFplA7/uGQQrGCLvEGHH8yJg4PHb1mpw1sfuEWH/wy6CVa4fsIjOvw45zMd/urCIbDCw2O36bB253Y4+PxBF+twYgrYAyebL8MK7s/e0eG8Pfvh4Asvn6bDJO8UHTp2FcMKj2c/rMP102N1+No/zoIVJttn6/DAphVwcH19rQ671azTYWK3cFhh9IWX6bD3uafDwY+Ulupw14IXdRg2dASsUHYA/SDFbhB2x1Ou7WCqDoPPHwYHx8dG63BWD7C04qF/4hOKvQgcoVEeMIseLsKfUUB1qA5t1XY4OLr3UB3uL1msw8QKsA0iUh0FptyGWjBTiciYoefocFcfcHwd3LQAVrj7UlDhrmd/ocOA97rDCslF4GAMDQI7toiEdQOng2oP+EBNAadFEQkKBQdjZWWVDhvqq2GFYCsYbARGwsHuGnCNMfDUc3XYZ+JpsMJ3U8t0uGwlmEVFpKZhjQ6DNvfVYcB+vAdWfbJIh709u3VoEfwZxQyYocMyNHWISMa40TqssILPyFMCzuMiMvIUcCAMuDgVDl7jOKTD3QKuwfat7wUrjNoBdraIdHCNal+5FVb4fjV4M7esAm+7iLhr0JHbAHYJw/Oj3XV1PjjxsRtLRB0LV8ISEZ0YR997JSIiIiKiozciYabvC/9uLNfGElHHwiYsEdFP4nQ65X+XgNrwmMmtuzlERERERJ3WiKgzfV+sLv6iMWQ3log6BDZhiYiOB3uvRERERERthd1YIupw2IQlIjoGR3zWlrs6v5U3iYiIiIioyxoRdaY1NFb4FC8iavfYhCUiOrIj9l5beXuIiIiIiMhf4zU5u7FE1D6xCUtE1BKn08neKxERERFRR9FyN1ZEMjMzs7KyfLcXIyJqNWzCEhEBLdzylb1XIiIiIqL2D3ZjRSQnJycnJ4drY4molRmmabb1NhARtRct9F4np13dJOl59q/1sHpbGKycfH00eLk+z+tw5DceWOHl+/+gw83n4b+lrR6fpsMVu8/Q4XTro7BC2KEaHSYE1cPBUf276fCb3jt1GPFWPKzgiQ3R4crsT3VorvsMVkgaBn66GgsoKyL2iyfpsP5AqQ5r8wthhTH9e+rwu6/X6rBvzzhYYeu23TqMCsH7T51h1eHhg7t02C8GV7BYDFThIH65ba/pMCSihw6v/M8rsEL4+PN0+Ep5KqgQtg1W2G8FO9XzX4PPSESCRpyvw34VH+tw0eu3wwp9DvbV4dWXgh959YCvYYW388D9oBNCwacsIlU7wU9dcDBChxMTvtChiKyvAhv8wLR0OHjGRrBnnv/aIh2uDh4PK3j2na5D+2d1OkzzHoIVDAvYhw1PORycMXaaDntd+DMd7ttTBitsOwAmq22fzYWDAyv3g1DAHBjQgCcEyGK36NAIATuViIy/8i4drqgCb5qIxNpCdZgbV6XDAwvxhGnbj366InB82d1gpIj07t1Lh46eg+Dg3H1gqhnWM0iHtTH9YYVzLkwBZdG0JiIvmbk6PPMAqLBo71ZY4dArb+sw0XDosNbjhRWspeDYD/PuwINtATq0BYBP2bAFwwqBEck6dFvAYE8zG2wPAqfLqLgEOLikGrzzJbtX6zApBbztIhKcCCYrMzQWDj6UAI6aGlutDu2FDbBCbRr47A69Da4xQgrwlBJ86BsdWj0FcLAIeJMj48C+HdnvNPxyPcBVXI9e+HIifkiiDsvHgysEhx3MEiISEvSWDmukWocNXnyWCTcqdLikHhyJIrJ8J/hAPSvOBWE1OMuISOiTn+vQUQw+Iy86y6xFI9mNJaLWwZWwREQt3fI1I+pUEYmMwRedRERERETUUWREnSZiisja4iWNof99Y3mbAiI6ediEJaKu64i9VyIiIiIi6nwar/abdGN9vxpkZmZyYSwRnXBswhJRl9Nc73VEzBleL/53T0RERERE1Pn4urH+rVgRycnJ8S2MFd6mgIhOHDZhiagLae6WryNiwO1EiYiIiIioK2j8dWB14VeNIW9TQEQnFpuwRNT5sfdKRERERERH1Fw3tvE2BezGEtFxYxOWiDqt5m47MDp5loh4qvEjvImIiIiIqIvzdWOtwfErc99oDHnTWCL6KdiEJaLOpoXHbfnar0REREREREej8TeIJt1Y3jSWiI6VYZpmW28DEdGJ4XQ6Ye/1mXs/1eHBCo8Oi/Lx8tg+z03T4R7bTh0OcvweVpj/n3U6rNlRqcOth96BFW68caoOezTzt7SDvQ7ocERYiQ73V/WAFfqH5urQKoFw8Aa5U4c33DBYh44lIbBC74JVOjRM8P6Y7lpYQYxgEIb1gmPjTr0ahDcO0uFny5bCCiHLQdizd4YOK9avhRWKNoLKUe4dcLAjEnxMmXfcrsNVQZGwwu4vwe7q/uSPcHCUHVwbBCQN1+GuuDGwQv+/x+pw/gt3gbJpQ2AFq6VMhx9kjYOD38i+WYcv7pqiw5iy62CF3/xmhA5zI8F88uon22AF99OJOgyz4eOrZt9uHYZ376PDIdMugBVCneAY98S/Cge/+wj49INXgR/Zsr8GVojK3azDpAjwJMPuvcF+IiKBceBgjO2Fj9Dc0HQdLvz34zoMS+wLK5h54FCKMvfCwZ5y8GZ60fxjGLCAGGJBg0GYMfkKWME2GMzwm/aCbRCR8iirDg/Of1uHcd56WGFA/946LC0Hs+uks0bDCmHd43SYNiYBDm6oBVOKxevVoWfoYVjhsBfsmQX2L+Hgh5/5XIfeyKE6NHLssELs4i06DLODN9MuYKYSEW8D2FcMKYeDDQv4QO0B4KTm9oBLFxERDzpyLeAKwUT7qogYFnB+twSDaU1ExGwAmb2bDt1efJVidZeCtDYfDw6KQC8HTnYVyfg2UwN6xOsweNYoHX7+9jxYITUSnOxqF4I9TUQsO14EIfqU8YchkpwILkgS+g2Dgx0903S4qhwcjMFWPIWNfzhKh/Nq9ujw7LhiWOH20m91aC3BU+75C9/X4b7z3tThhBB8SVNk36pD7yfgWnRB/qmwQuoT4E0LDAyAg+NqwYTw0Y65TRLepoCIjkZzMz8RUYfhcrmcTqdhGLoDOzxqAuzAEhERERERHYeMqFMzon7U4c3JycnKyjIMw+l0cmEsETWHtyMgoo6qhdsODI+a0PrbQ0REREREXURjH3Zt8ZLG0HfTWN6mgIggNmGJqOPx/UsfuO61LTaHiIiIiIi6KF83tkkrVkR401giaoJNWCLqMFpY+joydoqIeD3gJmVEREREREQn1ai4/97de1XBD/cL9u/G8qaxRMQmLBF1AM0tffX1XomIiIiIiNqD5rqxvE0BEbEJS9Q2Gv8Kekx/ET2+7+q4jrj0lYiIiIiIqB3ydWObWxjLVixRF8QmLHVmuoV39H97hO2/E3iybKyck5OTnZ19lB3Vxu/q9Odsp9MJe6+jk2f5vvDWFLTuFhERERERER2bxt9fVua+0Rjm5OTwHgVEXZBhmmZbbwPRSdFcF0+OopfawveKSMs90yb/U3MvZBjG0W+P/q7OeuQ2d9uB96sqmiQLjG/1t7+7OkWHSWuS4Gvt3PS5Ds+8bRQc/ECvFTo847Gf67B2xHWwQt3HA3T42ANn6LDUtgNWuNheo8OU/RFwcMHC73VYkYc614d2wgov7XlTh48EXwYHxyyIB9tm2a1DT81hWMH01oLQ9OrQZg2AFcQerrPkUT+DY60jp+twy/Smu5mIFN27GFYYO2C8DteuXqbDyA0vwAqmxa3DlLTJcHDaRb/QYXkfsG9/V1YFK3TfDV4usnQPHGytBh/T6tXbdBiWlAYrRA/O0GG37mE6nDE5EFaoS9+ow+r9eO69+Z0LdBi/c6oOJ/UcASvsySzSYWXh9Trc8AXY20Wkxxtg9qgTsA+LyHlngw96S003HV56RS9YQUau1tlLJe/Bsd8/nwDSv2/QWV8L/vuW4T2kw+mX36/DNRU9YYW8xWBK8dRXw8GW2jwd2q11Ohwy7hxYoc+wISBtALOoiCx85XEdFlaAH9n/3O2vmXMySK0WvADCNMGB4DFC4WDDAsKQnuN0OGESPqmNuxzsgS+uAxsctuQ7WOGa+0bqsFv3fXDw0KJ8kNZZdVbx8BxYYVCvQh0WeDLhYKMQXAwEbHSAkfn1sEJkLjgRR3lBaFo8sIII+JBME8zDIgJ3KwNVcATHwgr1BtivAtHgmrKDsIK3Dp2dm9nhIcMAH6glMBKPtoBTuenB7494wJFresGEINLMBqNDNCgkSofn3fYoLPDx92BXue0XeH5+MX2JDldM2aTD+Gowz4hIP0eJDnuk9IGDh2deqMP9ju46nP8mOHGIiJG3WYdJieCUFH0BONuKyIfl4LLz4kvxB5reAM6twfP36/CFUnyEXnvTLTqcthv8FAP/8xGsUNX3YbANG/D5KzIWXOp0C0rUYcrGXFghOeBHM9hj/wAzMBfGEnURXAlLnVNzvyb55OTkOJ3O5s5zLXdgRSQrKwv2YeHiWafTecQ/b7a8PV1Ec2+7br8SERERERF1RL/99QIRiS/accdr1zSGXBhL1EWgv6QTdXD+563MzEzTj+92BPK/vqf+XpfL1dgKzMzMzM7O1t8rItnZ2fp7s7KyfN+b+T++F8rKyjriNufk5HTNJqzL5XI6nYZhNOnAzv3dh77/a6sNIyIiIiIiOkkevfTfj176b//E95ujYRjswxJ1VlwJS52N/4JKvV7V1/LzDYDrLv27q026oi6Xy+Vy+Tqqeu2q74X0PyTxvdzRLHQ9+jvDdg7wzgPsuhIRERERURfR2IflwliiroArYamz8V/H2txa18avdYvWv4Grv9fpdPqvh9Wvqxe9NjZtm9vgxhfqIoth/Ze++r8to5NnsQNLRERERERdUHMLY51OJ/uwRJ0Gm7DUqfg3MVtoaDbXSPVvvDZ3qmtss8K+qv6uI54y/Ru7R3Pjgo7L135tvGlDo9HJsxqfGUpERERERNQ1+X4z8v/lyLdyxXePgq6wZIeoc+PtCKhTaeyiNtdm9Tni2auFb/dvqp6oE6F/X7JTnlzhQ7fYeCUiIiIiItJ8vyutzH2jMfF1Y32/qHa+XxiJugiuhKVOpYV/9X8Cv72FFq0+HR7NCdJ/MWxnuilBcw/d4tJXIiIiIiKilnFhLFEnw5WwRCdGZmam7649/s/XanyQV8src+XHTwzLysoyTfNkb/BJ5XK5srOzm/Re49Z97ftir0jD14X6u34/vr8OK1dshi/hfWifDlP2vKvDG959ClaouPE/OvzXmzfDwf3vu1iHlwzP1eEVk7bDCnLGSp0tNR/R4X1bz4MFnpt+jQ4dtgNwcNrAU3X44qpvdPjSGdfDClOLHtfhzwKS4eAt7n/r0OOu0qHV8MIKtoAwHQYER+vQHgJCEakL6qlDM7wHHLyjDOyB5bPBhezgsy+DFda9dr8Ou5k7dBgQGAwr9O13mg7dgy6Cg/cXgvetINmjQ8NuxRV61Olw0bxP4ODBVlD5of+7S4e13d2wQnhMgQ4HyZc6tDQUwQrb617R4R2fHoaDQw+P1OFFEybr8J2/vQArWN4DV0Qxpz6nw+6Fu2CFkMr3dJgWEwIHmzVlOvzFOX10mDx2EaxQX3u7Dle/mAYHu3dU63CAJ0+HwQFgpIicOu0GHe4pB/t2xZ4NsEJsXJQOR485HQ4urQGhp+yQDi+9C9/GxzGoRIcbLWDKFZGYgBd1mPLxn3W4ZtsyWEEEHYxorYPHC0aKiAiYMG0GOGxFxGYE6DDZASokjgGHhohsiazQ4ZqBT+jQu3MirHBGFDgLX1GxHw7+bDT4oL8sB9NaMZ5RZOJscIS+FYJPuIHrwaFkLN+iw5HjpsAKdRHgZFe0PUiHIXXrYAXTQCtdvHh+FgFvhcUCfuSG+kr4/W5PPRhcCa4QrPZQWMEW0h1slhsdiiLe+nIQesE2mLXgXCAihmEHoTUQDhajufdNv14zO5Bh6Ky+pliHX/z9d7CA8/rf6HAR+uBEpG7lGB1eML+fDrsVnAErPPXAtTq8fNB0ODgoNVGHbjT/3PD3DFjhwc2pOjy9MEaHO9fjs/BAs5cO3xiDT7jpKeAKyjMJvBWrtz4PK3x7Z4MOvWXgwE8K+hRWqA8CD/+oHgZ2CRE552Jwwf/+fz7X4ea94MJDRH552gU67PmrCXDwpangF6I8t0yRX/q+/nPwf2fUxoWxfHgXUQfCJix1To1/FdQnpOb+YHiU95P1599kbOyiZmVl+S9rFZHMzMyjKdg5bkoA7zzQ2B/e7VYAACAASURBVH4lIiIiIiKi43NX9WJRrVg56l85iahtsQlLnUeTfmvjKtQmDMOApyj/p3Idn8Y+rH8X8uhPh76bEvi+13dTgnb1J81bb70VvkV5eXkiYpqmXr07OnnW3vnXtcbGERERERERdQ13VS/+sv8zTe4Y6/s9lwtjidozNmGpc2quA+uTk5Nzkpaaulwu37/E9/3nsZ4CXS6X8b9/MOV/W4P2IDs7+8AB/C/fNd7ylYiIiIiI6ORp/J2rsRvLh3cRtXN8MBd1To0d2MzMzMzMTNM0s7Oz/W/M6uvDnoyX9rV3fY7jJRobuCdvC08qPnSLiIiIiIio1bTw8K423Coi0tiEpU4rMzMzOzvb1wyV//VGTdP0v2FrO/zzoO+mBL6v29UW7t+/33fPgSbtbB/94E4iIiIiIiJqHfrXscZWbPv5pZKoi2MTljqt5m4F4H8G+un3gT0Z2u0W+tb2+j9ATLj0lYiIiIiIqH2ArVjfr8ZsxRK1OTZhqXPKzMxs4R9f+C81ba0tOjbt7aYETqfTMAy2X4mIiIiIiNo5/e8U2Yolag8M/UBzog7K6XQ2tggzMzNbOLv4P7bL/xBofChWy8eF/wsd9xF0xNeCr3KUW3gC+W+GT/QT8+DI9FHjdRjk8MDB28yXdFj2fLgOLyqLhRUmXXW+Dm8L+1SHtRsXwAoZe3+nw8tut8PBl9jA7rRi6Z91eE3yW7DCd30Ldbj83Cd0uP27VbBCbnWRDktrDTg46Frw3MX505fr8LSC4bDChhzwZgYsfwQODg0HH5OjW5IOg614g+vtYTosKtwPygZ3gxVCkkbocL8lDg7uHwU2Y12RW4cB276CFQIrv9dhJPqRY4ZOhxXKK+t02GfSFDh4a1mwDjev+lKH1bu3wgpJBZ/p8KIb7oWDT30I/CBhlk06dFe/CCusWLpahzfJhTp8/p25sML9Gf10OG32Q3DwKaGv6/C2G8Eu0WdLKqwQF+LQYeDg0WBoegSsULL5sA5D1y6Cg89yTtDhkIvAvt0nDL/DQx/8jw5tn18MB9u3HtRh/wCwq1xw4wOwwo7wQTo8uH6vDrvHg3dSRCZPTAAbNmkjHPztWvByE1LBYZsevRNWSP5irQ4Do7xwcP3mzToM/ga8P6PfKYEVPOikbLEGgteqL4cV7NYAHcZEpcLBvUaCiWLzknd1WGWLwi+XfKYOd+SBD7RbXAqs8MupiTrM/90ncPBffgHOa4YHHOMBm/HxFZ4wUIdlp+KXC/4/UDkheagOY6rxE0fTZs7R4bzHwBmwR91SWME08M4G2dCuYhrWo6/QzGUhCE0TX5hZ0MuZza3XMdCpHFVu7uWaGXwMbxo8vppbYGSgDbZawSWf1YKvA6Oik3U4Yso5cHDtgNN0+NF8cA3mSEmFFWp6gau4/Us/hoNjjTQdTuwRrcN9s8HJXUQGVKMrq/Hg0re6LhVW2FMHrqBy74OfkRgfgX/nF2ot06GjG55/iivAFVRdWT4o68mDFXpP+oUOCwLw+2M4wDXYhF/30uHTBS/DClWPr9fhozc+CQfLRHD1+9T7NTqsCSiGBepW5eqw5NGmS2da/n2ZiE4SroSlzsP/LNLyGcV/bSkceZSLT/WtUU+gxjaxHPX2nEC+Ow8YhuHfgY3fsDx+A7iCJCIiIiIiovZpxJ8OjvjTj/4iyyd3EbUJNmGJjlnr3MSgrZ7QBW/8yvYrERERERFRx9VCK5arYolaB5uw1Dm1/Dc9/3OM/8hjXdnqv1j1ZHC5XI2bdLJfS9h+JSIiIiIi6tR8rVj/bixvF0vUatiEpU7lKLuojY+9ak4La139m7at8M83WuemBM09d4vtVyIiIiIios6HT+4ian1swlKn0tiybPnf7/s/v8s/b26FLHRSbwjrvxn+NyU4GfWb3PhV1PmYiIiIiIiIOh/YiuXtYolOEjZhqVPxb1lmZWUd8aFbekDLt2F1uVyN/cpWuD9A44uejLK6/eo7AbP9SkRERERE1HXoXwP55C6ik4FNWOps/Hujvn9P0fifTdqO8KYE/h3PJm1c3/1SfV9nZma25gnpiPdPOHq+G7/C9uuJegkiIiIiIiLqWPSiHLZiiU4swzTNtt4GohPM5XIdcZlqZmZmcytMj/jtLXzv0TMMw/fFUR6DTqfTv216HEeuy+XKzs5ucueBIV8V+r4odxfpb5lU3k+H5bHVsP7atbt0GNYzGQ4+Kz5Eh90KwZ+Fnt2/AlawfnpYh7ddPkWHyeeDkSIS6rkavNxDS+HgZcPP1eHqi27TYfTygzoUkasmzNRhzACrDgeND4UVCnbVgsFv9IeD384F4aJb79JhuAcWkMiCBTpMTOoNB4f3HaXDvqeN1OGGT76GFRrq63VYsm+rDr1evMXp516pw4Xr9sPBkgsqDzx9sg53zXsMFjhn5sU63FsIfgp7XC9YoTo0TocbDhbAwZVLvtRhsFmnw9/eie+U0uf0njrc0vN+ODih7isdnndTlA7ju/8aVvCcu0WHt9X9RYfFi4phhSfdYKeyRoTDwXW7MnTYbSeYwWJM8LaLiG3NmzqMTh2mw8pTwbEsIpVr1+pwznXT4eD0GWAinWEs1GH+/Htwhecm6LDHynI4uEdIoQ5PPe8aHUZMOx9WWLoUfEynTorVYWoUPj0t6L9Jh7GOKjj4soYnweAg8M473j8AK6ydv0yHqz8HO7aIfFsDjrvoveCtsO4C+4mINDz8mg53rQMnlLzC3bBCYo8hOhx8yhlwcPLUs3T40F1P6zChCEwdIjJmxEQdlqZfqMPheAKTsZcN0OEpm8+BgyMfBLtrQgnYf0qfj4EV6n+7XYeB20rg4FB3pQ6juwXp0O3B61EC7F4dVhSDKyWHG1z8iIgpDTo0xICDm6lwTE7KL3QWiw2/GH41kJomPmUbBnjnm3s5r9cNaxz9y0FWi12HtsBucHBYRHcdjjjzIjjYHgdOuLlh4Fha/MnHsEL/gEAdDpt+Khz8yktgrUZqaLQOT58xHlYYNAyc33fawPvzyYj/gxVsbvD+vB2cBwdHrHpVh+GPj9Bhn2U1sEKvQWN0WNsALqrrCjfCCgk903U4+QJwHSgin3rAZ7f0r+AKauqpp8EK8cPAVcq/A16Egy1vgqu7v70Hfukoi3sOVnj6/BQdju8HLsvzpsbDCoeX7vR9se2hof75CfktmKiL40pY6oScTmfLS0ezs7NbOH/4vr25W7621bnnp7yo0+n0LeP178AO+aqwsQNLRERERERE1CjtnnVp96xr/E+uiiX66fDfG4k6OqfTaZqm7wzR5DFcR9PN9HUt/ZeO+r63yf0NforjWMp6HN/SZP2sD3uvREREREREdES+PmzjqlhfK5arYomOD5uw1Jn9xBODrxV7ojamlcH26+jkWbUvP9Um20NEREREREQdke9GsStz3/D9J1uxRMeHTViizka3X/nQLSIiIiIiIvop2Iol+ol4T1iizsPpdBqG4d+BbfJ0SyIiIiIiIqLj1uR3TN4rlujosQlL1Bmw/UpERERERESto7lWLFfFErWATViijo3tVyIiIiIiImp9uhXre5Y1W7FEkHEcz1snovZA3/v17Gy3/38OSfXo79oYtw9Wqy4O1mGc3a7D8pAKWGFT+Vs6jCn/ORxckvS2Dvt/db0O0xNgAbGf9boO+1nAT/HLm/4GK6Tf+k8dXtHrOzj40rs/0uEXc9/RYcXscFhhTVSDDreO7qXDqIIiWCE9AdzF+8kNv4SDo9cO0+HEBvCHN7OmFFYoyd2kwz/MfQAO/kbqdPjq79fpsE8C/kR3LvpYh46qzToMG30VrLBt1Vc6jDZL4OCf//luHVrd4DNa6wiDFbp9v1OHY6b31eGjj4P3QUQadq7V4alj0+DgYael63DBOPDTOYJqYIV9QYt1+PNg/P68sRJcNx+qWqDDQdvAQScin8WB96fsafAZeR2wgCQeBPNPad4uODg6EHx28eN+psP93y+CFULyPkAx+lu1CaZWEUmMT9HhnGXPwsGRkeDjGHv333UYfaAQVnAsnKTDgfUb4ODU2FQdXvD4EzpcVxoAK4QNrtfhrogCHXYLqYIV5uaC2dVY3RMOTvgyVIdXvAhe7sY6vMHF14G58ZH3tsHBk84EL5cQn6XDZe/PhxU2jQTz9taix3RYsWcJrJCWMUGH9vBYOLhq2iU6XPTEozpM3f8JrNC3T4YOu8/8jQ4TUyNhhTN/VqvDoctuhIPnzH9Ph++9e40O0w/sgRUCDLBfeQLxCdci6ELFCNKZ6S6HFcQAx75hBbOV11OJK8CqYsDcFPDrmCMgBIw0vbCC1wvy9J6DdLjzID4KAmzgUKqoLYODrRZwQeL1grnRa+AHkBimW4ceLwhFxDDA+2ZHH4e7mQpW9Ma7PeDEAT8LEQkOjNBhTEwqHDzxpt/pcG8R2Kkq6q2wwrLFy3QYsBOcOESk59RrdXj4UL4Op0wZCCskDonWYffh4HLimhWfwwqpe8EMdsl4sA+LSM9+uTqMsv5eh+dfnwQrRH8Hzh2DoqLA0NrDsEJpITihGDVgw0Rk0JizdVg/BSx5+fBff4EVepfs1qGlvhgONtHhXFTfTYcxXlBWRGbOB5dbbw8Ap4NhOVNhheHpYM98aeiHcLA8+MM16tonfnQdm5mZ6WvI4m8k6pK4Epao49GrX8/OdjfpwBIRERERERG1joxbtmXc8sNfergqlkhjE5aoI4E3H2D7lYiIiIiIiNpcxi3beIMCouawCUvUMfDer0RERERERNT+8V6xRBCbsETtHduvRERERERE1LGwFUvUBJuwRO2Xbr+KCNuvRERERERE1CH4WrGNv8ayFUtdGZuwRO1Rc+1XdmCJiIiIiIiow4GrYttwe4haH5uwRO0L269ERERERETU+egbFBiGwVYsdR2GaZptvQ1EJCLicrmysrKahBe+4/b/z52DN+lv3L9gJyzoTWjQ4dT00+HgTbWVOrTE5Osw8pNTYYXa8bt1eEFcOBx8dfRGHda5t+hwW+EzsMKLeTYdjqxbpUNHBn5/zg/crEPrFVfCwd/Wgjfz3R61OvzwhUthBcs/m364IhI2ar0OU42vYYWDwVN1OPTrW+DgwWaFDj9wLdPhn+7CH2heRLAOf/WvR+Dg4IqeOjwl/BQdFmxcAStYSrbp0Ft7GITh/WGFwSlggxMuvQoOLpy0Tof7G+p1eH63AFjhDPNtHZ5dMlaHs5bNgBXm5R3QYcZ+Aw6OOqO7Du2DwftTG3QIVrgvBBx0pdXz4OCicPCD9Kgp1eFdtefACl/m7tXhqJxpOuwTVgMrrAkM0WHpc0/CwT0s+3RYHztah+X71sAK1kowu9osYJ4ZknEmrPCzR8DBWNS3Dg6e+Q34QR749wM6fHTJFbDCwDowYdqD8ZQ7Z851Ogy7EuyZO4PAuUBE/rX7Wx0mDQzSYX7RLlghsBBUyF8SAwev/c0fdNgjCHx2lT+/Hlb43cLvdPja5KFw8KAKcKJ5vQxMue/1wUdowhLwQa+8PFCH//nLZbDC0DBwlnGExcHB1Q12HVYUg1N2WAA4F4iI3V2mw96pGTqc/ac7YIXBZ4CTvu2BZ+Hgv6x/SYfP9LhNh/2/Hwkr2Dc/p0OvuxoOtljRvI1+4/F63SAVMSxonQr6pck0PbCCCNhVbFbwwTVXObk3mIfNkFhYoEeQV4eZf/utDuvzwEwuIk/nR+ow6iV80rfWVoFtiAXbVlsLrpREZP12cP0TGpMMB+/bA67uQh3ddBgdmworFBfm6jAicYAOd21ZACtYDPCBOgLD4ODo+H5gcGyKDg/fDCZnETl0uFyHdRsO4pdbtlaHoSFgfh549lmwQnAc+EH2VoMzYOJM8E6KyEE7mBCuDMPXGHMbkkBaPUFnN1ZcCyt8thtc/+RWgKNg0zJwvSciFVXFOrR8+CIcLB5wZkyNAVcpU+/9AyzwfFKBDhsuehwOtlaBN9nwggqGacUVrGB3veZP/9Lh8LPSYYWs0A902D17ChxsMcCuEhMOzoDRaq98MetHm5qZmckbFFCnx5WwRG3P5XI5nc4mHdgL33E36cASERERERERdQJXZ5tXZ//wVyiuiqWuAPzVgohajcvlys7ObnLzgfEv4JVTRERERERERJ3GuJdqRWT5Vf9dKOtrxWZnZ7MbS50Sm7BEbcbpdLL9SkRERERERF1Zk1ZsVlZWZmYmn9xFnQ9vR0DUBvTTt8a/UMcOLBEREREREXVN416q9XVjRSQnJ8fXhOWNYqkzYROWqFWx/UpEREREREQEjXupdnTyLN/XbMVSJ8MmLFEr0e3X0cmzGs8uRERERERERCQ//mWZrVjqNNiEJTrpXC5Xk9u/sv1KRERERERE1AL/35obW7FtuD1EP5FhmmZbbwNRp+VyubKzs/3br+lz9zUZE5oSAL+3phI8N8+xAty4YOSA7rDCiqQ8HYbb8J9e+g75UIdDA3brsKeMhBUq5Fkd/ubr8+DgP0xeqMMv8sCPvCwfV3h0SB8dnle/WofR774HK6z8cKUObxvhgYNXVf1Rh/2eXqLD1FtehhWWXfSZDkPKQYX0vrWwwvI1w3SYsetqOLgn+px319XrsPDwLlhB1h7QWWx0EhwbFBQCKu/erEPbnq9hhfAgQ4cxAyfpMH8b+JRFpL6mUofWlNPh4KE3nqXDiDNf12GWuQpW2PcC+Dt81M/H6PCqVdGwQkXCJTq81gAVRMQav1eHJcF/16HTGwkrJJbm6zD1c3wvlMOfLdLhCodXhw9k9YIVdhbdp8Pw6IFg6JeHYQXroqazpYjE1xbBwRaw+0jFoe06tFV8DytEJ4/VYb9hIDznlvNhhRFDwOEc9KtfwsGfm/t1eGXp3Trs//UKWKFX36E67DPxXDjY0S1ChxtHg3PHikVrYIXYkH46zE8Ds0Tct1GwQvUouw5zLiiAg3uvvEOH5tw9Orxn4U5Y4Z9jM0AFGQ8Hx74PZrCk8u90aO17Bqyw4a5QUNb7Lx0Wrr4JVkj6sEyHKcHFcHBtQLwOq6vAHBhirYEVAoOCdTjq1FN0eMEN+EcengLen5Xn/AIOnrtvvQ5nvNFXhw8nz4EVAl+4C6QLP4eDS779qw5NE5/fm/FTfz8yBMxKFosVDg4JidNhSho4HcQNnwArBISF6/DcX4HDdkzQt7BC6b+u1OHoXilw8D+mva3D06xf6HCBHRz4IvLB0qlgsDcXDp61DVx7FG3YpkNbM1e5I4eCeelAVZAOF2/Cp8W6xS/qMCnaAQd3656sw1ULsnXobaiCFULiwQxfnX4hHFxdBM7vdo9bh5aaclihZ3IPHSZmgMvOymiwr4rIdgNMNXXx4LJBRCyngCur/A0f6TA8CezYIrJnPpgwxQI+fcfwQbBCfBy4Qtg9Dx/4CR8PBttmD9NhuqMUVphxNbhyeCMGjpX1j8zXobEGzKLdPRthBdNTosP4iEQdTs28ElYY+PMZOnzJBk76IvLZF9/oMPQAOE8lhAyAFaxngt3Vsa7pBi+8+kcfcWZmJlfFUkfElbBEJ4Vv9WtWVlZjB3bI7OW6A0tERERERERELZj4ojfmo68a/zMnJ8cwDK6KpQ4HrDsjop+oyc0HRGTI7OVttTFEREREREREHZ2vD1s447//SsPXiuWqWOpAuBKW6ETST98aMns5O7BEREREREREP13MR181WRXLZ3ZRR8EmLNGJ4XK52H4lIiIiIiIiOtma9GH5zC7qENiEJfqpGm//6h+y/UpERERERER0kuglsbxRLLVzvCcs0U+ib/86OnmWiODH2xMRERERERHRCeL7BXxl7hu+//TdnYALY6l94kpYouOkb/86OnmW7wRARERERERERK3D/5fxxrsT8Eax1N4Ypmm29TYQdTAulys7O9u//XrVi94mYxr61elv3F3ZdJiI2HuUwFdx9NyiwyhLgA4/+gZX6JM8RIc3DVoKB48reU+HT732qQ4DNtbDCs9sv0OHNzxyLxyc1L9Yh49uy9bhnRngpxCR6//9hg4/e/pFHa5Ns8MKjx24T4fpW76Eg9129FNbonUWc86DsMLypG90mNRwqg6LxhTCClH5PXV43rlRcHDOrxbrMDAgVIdTR6bBCp+8/RFI3WDHFhGLGDoMPfy5Dq2hPWCFi2+6TYerJVmHjkWvwgq9eyfpsLLvKXDw8pFVOtxve1aHlt3ofRCpSH5MhxFJoGxqxHewwmCjvw4jTfz+HCr5nQ7fyr1EhwuH58EKtbUrdPiP/wP7iYjs7t5NhxeuKtPhHQ1nwArhSyfo0PR4dBhYWAkr9PBu1aElEb9c3Z4FOrR69uvQMPCfn62O7jq88pc363DIHWC3FJHTc8E7f/tF4+Hg/NmBOvy6ar4OL4odDSu4y8D7FtsLTwirvgeDC8xyHXrq8Qw/si/4qYO7B+lw8gywn4hIWkCIDlNfGwkHhy8erEOzAIw0gkBZERn8+SEd2j0VcLDX1qDD4KAwHVbVgTdNRAwT7Fcpt32iw017NsAKCcPBW1Gd/S4c3LAdzEu9B4wAQ1PAWUZEDq0FJ7trbsrU4dgr8L/tGbA3X4cLLz0bDnb1Bdc/T824UId1G/bCCvZzwYEQkx8LB4ffB/KofeCywWKAk5eImAJ+P4K/M+HvP0aBAcE6TB8+Q4c9z5wJK6xctFGHl/32LB1uGbYDVhhx6zgdXj16Ihz8xXV3gcoxYLobfxOeMN+UIh0+HAF+ZBFxjLtGh4EBiToMNsB1soicd7CvDr+JBZP2/sfw/cTOPR3s2/EpYA4UkbAUcLJbsxTMEpse/AWsYPeCS0HTdMPB3tpqHRpopxIrnjDdNnBBm5iSrsPSSnwdaB0LZo8DlXvgYMdhUCQkEGxweU9w4Soixee/r8O6hb10GPRZDaww7CKwU6WOxL8yuP7znA77W8EOb/WCuU5EBoaW6vDsG/AlzSO7wKx7eP4iHYZ/AX59ExGHgPNlavIAHfYMBlcjIjLs+ut02BAXAwfPS1+jw0/fBNvm+D4FVoj3DNRhelwfHXqG4Gl/93c/Ordu+sdQ///MzMxkK5baD66EJTo2vn/a0HIHloiIiIiIiIha2cBfrxv463WN/+m7USz7sNROsAlLdLTg/QfYgSUiIiIiIiJqP5rcKpB3J6B2gk1YoiNzuVxNHsDF278SERERERERtVvwRrFtu0nUxbEJS3QETe4/wPYrERERERERUYfg//s7705AbYtNWKJmwfsPtOH2EBEREREREdEx4d0JqJ1gE5YI4P0HiIiIiIiIiDoN3p2A2pytrTeAqN3R7dc23BgiIiIiIiIiOiF8v+CvzH1D/nd3gszMTK6KpdZhmKbZ1ttA1F40ab9e8rt8//81akic/pavyvfAUmXFO3XYa8BpOtyzeTmsUBmeq8OA+kgd9gwaDyvsS1mjw5+X4J7y4yvG6jBx5t91GBUUAitcGNlNh88cfAIOvnrAL3R4fdx28HLPfwgrPPkxqDy3F5jQcnc/CCukf/0BSAOC4WCzvkqHtm59dHjYnQArRIbYdWg5/RIdTr1gEKyweMy9OlxzP9glROSsbpfp8GAM+MNb6aO3wwoOu1uHhnjh4MjQAB3aDDDy4rsfgBU2Twef3SubvtPh+NwLYAX7vhodFnTHf2vccHiuDlN2jtDhmFt7wgr9+l+rw2fm3qPDGy8IhxWWV9+vw70FDji4occYHb7dLRZsw3NXwgr/2t1Lh57QU+DggJfCwDaMAm9mt/URsEK36iIdOqRSh1Y3GCki0gAGez1lcKzFAHsbvMJp7qLn0ruf0eHYmUN0ODx1HazwVX+w/zzhBAe+iFRNSdfh3rArdeh4B8/wg3uDSTtvzTY4WKxWnYUUFOqwv30PLHDlyzN0OCobzB7W6qWwwldp4Ag969f4pxuwG3z6Qd5SHZoG/ki9tgYdWgzwPogI2n3E4/XAwVBKTG8dHo6ZoMPE2FBYodv1WTr85F/z4ODoJa/pMCKxrw4bEk6HFep3fKTDq353lw4vuhqcmkVke8PTOtwwBZ+yfz0aTJhXPgIOmfuffAhWeG1rng6vduDZ9YIUsLM1PDRMhxmnzIQV1iwHv4rbreBM1+CphxVE0F7VLLAb9+6ZocNhV/wWfv9nm8Epe1BAAdisGHxSe/uUHToMDPwEDv7u9Ck6jHsH7BKZX+IKH9nBmxkbiQen3gAm0o1P7NVhwiFwJIpI0A09QFoBTrgNi0tghVNTUnR41gA4VnalgVNVtQ3MYP9ccAhWCLwTTKSxtRvx63nBdOetBr9HmGZz0xraXdHkag0CV/siYhro+tkDjkQR8YQOBJWjwEW1uxLswyJSU1kO0gjwKVeE4suq4AO7dRgfGQgHn3LTHTp8rdf3OrQH4kkp4huwGakfZcPBM26/RYfPJObr8NAji2CF5I3gcB4z40IdxiaBK0kR8aB/MF0QGg8Hx4eCfeWdQeAdLnhzPawQXBetQ+sicPYZMnQ0rJCQBma2NVsPwsGx9T/smR/P/eECOzMzkwtjqRXwdgREIuj+A006sERERERERETUOUyfs2L6nBW+r3l3AmodvB0BdXUulys7O5vtVyIiIiIiIqIuZfqcFYWL/867E1Dr4EpY6tKcTmdWVlZjB5ZP3yIiIiIiIiLqUvz7ADk5OU6nk31YOhnYhKUuyuVyGYbBB3ARERERERERdXH+S7Ia707AViydWGzCUpfju/1rVtYPT8DgAlgiIiIiIiKiLg62Ytt2k6gzYROWuhbef4CIiIiIiIiImtPk7gSGYXBJLJ0QbMJSV8H7DxARERERERHRETVZsMUlsXRCGKZptvU2EJ10TqfTv/0659X/7vZVNrD/hxgGLLJna4kO67pb4eCiNet0aKkGL5fUfySsYO0WrENvQaUO88dWwwrJ++J0eMCRDwdX96vRYU1NoQ4T58fAChIepLMHfx0Fx07f8X86fPfu23W4vUoesAAAIABJREFUYnstrPB8Jng5WfU3nfXY/C2sYKvP1WFkGN7gyuC+OvSUbNChYQ+HFexBIP/lv/+pw2s3gZ9CROxfhuhw6sir4eBlLz2lw+iCZTq0WYpgBZvNpsPYvmfiwQGBOuw/foIO549KhRWq7n1Nh5GZF+vQkhwBK9RVl+sw6gDYMBEJPwt8HIHxVTq8q98tsMLe5Ut0+MrIC3WYt68CVth/KF6HVZXgsBWRKWeBItH/+osOX3/rN7CCLSZSh2F5YJ4RkcDdq3QYEVSHxuIJ0yIeMNQE73BIENixRaSyDByhzbHZwA9S3wAmzIzeo2GF2S89rsOEwd/psO9dV8EK92/YpsOnJ82BgwfOAVPKjnPBCWXgqItghYOVu3ToKPbCwWdk9NLhmVf31+G0nh/CCtG/f0iHwWlJOixd2AArWHJjdTh0/VY4WNDFqd1ux4ORBk/90Q+GL3dMDAMsa7Dbwb495dqHYYV98YN1+MXmz+HguDf+rcOEvsPBhgWBA19ECjZ/pMPL7gZnn5dnguNIRMoDwBXClNeydCgir24G5/eQIrD/WPAVjZQMWKzD6/96Bhz8+IavdfhtDDic//DVWlgh/UNwlZJXWKrDvd+/DyuYxjHsVQaaSEMd4LOLHzwDVjhkSdVh2sBkHa4/HcwGIrL/3ud1GBkNPiMRufCGC3T4p9736fDF3z8JK2wZACarp1bgE+78r27ToeXAJB1OexhfpZyfcL8O95wNZolc90ZYwRsAPv3rep8GBw+OWa3DfGORDlMOzYcVrnaBz8729Hg4OLkGnA6sXnBRZNaD32VExOtFE6YJPiO4r4qIiadRPBjOuRYruLA3AsCJQ0S86Fxn1B8GqSUAb0IDmGvM4O5wbKANXNKknQbO75sO418MT7kCHLnuoeCiSES+fwl8dpfdBiaE5+zfwAq71+fpcNALQ3V4oXMQrPB+NfhBqtbhC7N+EeB3Q68BKhQdAseRiBQXHtChOwJcw4cH4pNadyt4uSEpeMVhQQq4At9XAHbXCMd/v5g750f/a3Z2NruxdNy4EpY6uSYLYOe8ajZ2YImIiIiIiIiImjNnrjln7g89BC6JpZ+CTVjqzJo8gIvtVyIiIiIiIiI6Jv59WN4llo4bm7DUOTVZADs6eRY7sERERERERER0HOCSWLZi6ZiwCUudUJMFsHwAFxERERERERH9RP4P7MrJyeHdCeiYsAlLnYrT6WyyAJYdWCIiIiIiIiI6Ufz7DDk5OVwSS0eJTVjqJFwul9PpbGy/ChfAEhEREREREdFJwCWxdBzYhKXOwHf/AS6AJSIiIiIiIqLWwSWxdEwM0+TTiqgDc7lc2dnZje3XcXfnjZkQD0cuTdmpw0PWEh0mvtsHVvCW1YBw90E42FNarMNxZ43X4eHYcFhh3+lrdbhz/yEdxhQNgxW86w7rcFTEADi4uLdHh0GhIDx/sBdWmBn6qQ7XvH4bHFy6o1qHH1WW6vAlz6WwQmq2VYfhHvhxlMEKAY5oHTbUVcDBNqtdh27T0GG3iARYwTPwch2uHbBPhz1394UVoqaA/efQfdfCwSGeXB3aAwJAaA+GFRJSwH7ljU6Hg8sr6nS4ax/4OIIqwJEoIkGWSh1GTL1Hh3vd+bCCd9FCHdpqC+BgI30iSE/pp7O8fmtgBWsPcPaMsK3UYf6yGFghfPsgULYQH1/lCeADte2x6TCxLApWsNaCd1jqwEEnIoG1u3Ro1ME3swFWiI0Fu3F4n1N0uHvbRljBU7BMh7bAUDzY69ah6a7V4W+uuQNWiPgD2LbzKsG2ZV96Nqzw0SgwYZbccAEc/MWb4LgL+XM3HfZLToQV7BVbdJia9Uc4OLFXpA5fHpetw+KPN8AKyQ+CwznCA05JpgXvw2Kg3A5mURERdHXqNUGFZr6/1RlgQyLDe+hw7Bx8Wpy/sUqH1W4QikisG6yiCCjfo8PQ7viEUrR6rg5PnzZThzVwthSJvKJQh0kNF8PBt0w/S4eO8hAdRpfshhUibOCSZuh5v4WDY/7aXYd/yfsSDN0H9mER+eqUj3R421/f0WGPuXfBCkNPAT/y1pXgPCUiBaV5OqysA5O2YQHTvogYAeDawxIcB0b2nQ4r5G4EU25SA7gWFZFeE67T4chp43SYf/krsMKrHx7QYcVq/NM9eDGY2U7pO0OHk36Lr1J6LE7TYWwUeH+qg/FlufsgOC06zsFvZo9rwYSw7fBTOjz0GrjwEJGAYZ/rsGLTQDh40KJUHQ5JAWeZfavegxXKa8p1aDXB+R2ebUXEFDBpn8w+w9HP/XgbbOhQiuiWDAdb7A4dBkX21GFU6mBYYVsd2NmmZuCd7d2fgcsJ92JwdTdwKrjOEZG1NnCxXbXlGx3GZf8MVojuAw4ZRxm42heRkB7g2mxvMfhdGJ7cRaRqG5j5HSXgDBjaIxVWGJwGrnOqu0fAwbZAsBkVB8E1RlAU+H1TRJYk79dh4LvV6//2wxSUmZnJVixBXAlLHViTBbDj7gaXsEREREREREREJ8+Q27Y2fp2Tk2MYBvuwpLEJSx1SkzvAjrs7jx1YIiIiIiIiImoTQ27b6t+K5V1iSWMTljoeLoAlIiIiIiIiovbGvxXLJbHUBJuw1JE0WQAr7MASERERERERUXvCJbEEsQlLHUaTBbCjk2exA0tERERERERE7U2Tu8Q6nU4uiSU2Yan9uvXWW5OSkpKSkqKjox0Oh/8C2NHJs9pww4iIiIiIiIiIWjA6eVZj7yInJ4dLYolNWGq/srOzDxw4cODAgeLi4traWl/oP4sREREREREREbVb/h0MLont4gzTNNt6G4iw6Ojo4uJi/+SPSzz+//lSw179Xb3zk2G11Y5PdJi8fpgO7WEhsIJlJXi5/n17wMG5BdU6TBqapMMNoRWwwqHUPToMfAMMHjNjPKzQowz8lSV3NL6HQ4G7Xod/TntNhwP37IQVNm9cqsN56w/CwY9una3D/h+U6TBISmAFrwHeYbs1AIy0OmAFMb1gsBuU9Y3WkcUWCsa5G+D318RN12HvMZN0uKcnKCsi9XNf12FY9Vo42PSU67Bn4iAdxk+8FFZY/f0eHXqqQVkRsZZv16EjIl6HdcW7YQVBn11NaLoOGw5thgVCKteDbYjvCwfXBqTqsKgA7K6BUXhKqbocHHeeBWCWMD0eHYqIkXdYhyHNnJOT+4LPzhsAJqvS0mIdioh7y3wdRgSBA19EesQl6rCkIFeHFfU1sEK3mN46zC8C+49Riycl0wOOfUszh7PXAzbDefNjOhyXNQZWiB8A9quY+2fo8BdB4IMTkZqzhoDwQBEc/P1TV+lw1siLdbhiD/5AbYuf0GHwAFBBRLzoY9q8GcwevWQdrGB6wcwWYA8EI9FsKSINnjowuNmrUOOoovbNYrHqMKnPaXDwVg84ZELLN+LKqZNBeHiTDpNPORdWsDnAoeStBWfAEd3xafGiO9focOQz8+Bg8/UJOuy7/QMdTh4+DVaIjo7WocWCV5MM/eXlOswY+54Ou3/0CqzwzQcrdVgxEOzwL1z/MKzgXTtTh5Vv4Uu+lMJlOgy0gnOHuQuf9BvQVVxEWIQOIyOjYIW3v3hTh6PSxsHBGRMmgspnTNJh32n5sMIz3n/q8M3HwacsImeG36vDg2eASXvD66CsiEQvBafs0CIwMTr2fw0rxCWDC5LK4DT8crExYPAl4CjYsvMrWMHyVaEO+0y7CA4+PB6caBwFkTrM37UcVuj23GodhpQs1KE9FFzaiUhDObj+sVnBHCgiXg/YXd1eNxwMWQxw7HvRhb3RzKkDnqqiQmLh4IjeYP+pMoN12OAG2yAiZgPY2coqwWlRRP7w1C06fHTEAh2W/gb/Hlp7AdgDE7eDn85yzdewwsa94IItYlkGHBwRDDYjsSpMh0Xr8G+R0XabDsuranUYaYBQRDz14M08+5LhcPAf48EMb32rUofpg86CFWoHH9Jh2QJQQURsCT+aitdfEdf4dXZ2NlfFdkFcCUvtlMvl8u/A/nGJp0kHloiIiIiIiIioQxjyn4LGr3lrgq6JTVhqj3zP4Gr8T7ZfiYiIiIiIiKhDG/Kfgtl//e+/MsnJyTEMg7cm6FLYhKX2xeVyGYbh/wyu217B/7ibiIiIiIiIiKhjaezDCpfEdjFswlI70mQB7G2vNLADS0RERERERESdiX8flk/r6jrYhKX2wul0cgEsEREREREREXV6s/9a7X9rgqysLPZhOz02YantNbkFARfAEhEREREREVGnx1sTdClswlIb07cgaMONISIiIiIiIiJqNbP/Wj06eZbvaz6tq3MzTNNs622grqvJLQhuWVn7pu17PSwoxwu/vT64DqTfl8DBYeGJOrRWgp5vcGgkrGCGBOrQs3MPHBzeb4AO7ckJOly/4T1YIaw4VIe9Lpyqw6LB+2CFPU8t0OHNd+I/rHXrvU6H59e/rcPdC9+BFWYvzNdhyIuz4eDIhu06NALASK+JP30DhSaKDcMGK3i9aP/BhZsD5k/DxBUC4kbosMKRrkO32w0rhObN06HNZoWDQyJTdFgf2k+HlVX1sIKlchcIrfhPd/bQeB021NeCoRWgrIiY9ZUgtIB9wnSXwQqhQeCQqbXHwcGeylwdGugPk+7AJFihzhKlw/rAGB3G2othBVsIeNMieg6CgwtN8NOVblqswzHDwU4lIlHh4M3sPiwDDv5iwR4dlix9SoeGWQEriBVssFkH3grDwMe41/TgysjQXiN1+LPnHtdhQMYeWCEt71c67PdkkQ5DJk7HFeKX6XD1/DFwcK/iTB0Wr/xWh9FlVbBCN89uHcYmD4GDzYRhOiz4dq4OA6vwEVrjBhOmxwNmD7OZSRvOrsc04bZn8GIa/nTBDnyNURuUqkOLBb9DDQ3gTbabpTp0pJwJK0SnpukwYuhQHbq/+xxWmHdZoQ6912yGgzNnX6fDrHvAeSo0BO/wez1g5n95UzAc3GMTmF13x4PJ6o/DJsIKT/99kw53jO+lw/+MBnOdiPx1yX4dLtyEf6POmjFah4tCwHlqzLLesELt2HIdDjPAtr1VjM+h1tdAhXOGh8DBw38OPqY4a7UO+7jxZbnj63vAy23bAAd/tedKHY6Pf0iH/8/efQbGUV5rAD6zfSWtepcsufduCzdMMaaaHqQAAUIINZCEkARucm8aKRCSm4QkpNBDC0iiY0xxMBgb27j3JtmWbFlW79qVtsz94WSv4vMusbBltff55bwcn52dnfnmm8+T3W3THoMd2j8A7y723Xgdxh3GY2CCpUyHqeMvgcX17WBuFhUHpg2Hq6thh9aUOB0muVJgceK8OTrc2QjuAnzPrYQdnLFg25KaK3U43FkFO3TYwMmYN2seLI5qAwfhqi0bdGh24gHBHwBXH18A3Na1+/ABb6DB1R/EDwPFwnE7bgR4OQuYB4qI6UMDpt8Li7PiwS3nzb8BB/w/zvwF7PD8nRN1mOMHM4Tzpg2BHRwzYnX4XPqnsLjxY3APOD14uQ5dufgtD3eBm7VkL5i4ltfABnL4U3AqhXz45VJSweFa6QYnXf2O7bDDKAe4WZt5EZ5UN1nBu9vqBtOqpCgRkadPd4eTq666ikuxAw+fhKXeccxXENy91nf3WrReQ0REREREREQ00N244v/Xjo/+Wlcvbgz1BC7CUi845isIuPxKRERERERERIPcjSu84aXYo+uwfB52IOEiLJ1SRUVFXb+CgA/AEhERERERERGFdV2HLSgo4DrsgIG/KpGoJ+hvgO3FjSEiIiIiIiIi6oOOrsMe/ZbYgoICfkXswMAnYekU6boCm5dzTfi3/4iIiIiIiIiI6BjhlRN+NcHAwEVY6nHH/AYXl1+JiIiIiIiIiP6jruuw/GqC/o6LsNSzjvkNLq7AEhEREREREREdp67/Z+KCgoL8/Pze3R763AzTNHt7G2jAOuZLYBP+9HLX/2qpBX/FvsGvQ/+6rbB/tN2lw3j/Abw1iVN0ZnNH6zAUlQAb2H1NOvSATRARMTKn6nDfzrWgQ6Addhh10dU6/LQW7Ip7v7wQdkgY2qnD3KxtsHhC5bM6/M3rT+nwd09/B3bI2rFJh27HEVhsMcC/AIW6Nxwdf7Fx/KkZoa0By1FmhvBGWAwHKHamgNIOvNNMCerQ6ojFxX7w6eONs1lhhxnj5uqwdN9mWNzkB/st5G9GmwDOcRGJcqKTEW1wR8ALO8A3Z7XidwePQJvVqUNfRyvsAD9+0wD7wRE7HP79QGu1DkMJ02Cxy7dHhwsK7tTh6IWzYYdyD3h3T/7wFVhs2bVah/G+DTqEb1lEzFBAh9FRSTr0R/hAAyiPNErc/KVv6nDcr8HY6PaeBzuc/RPwcrHV/63D1F9mwQ773vuHDp3PgbcsIpYKcHaMMqt0mD7xXNihcttSHZ72hdtgcUPmaB2Wv/eRDttWPgg7WGzggA8GwXe7mxEGQTyKDj6GBQ9KhtUNQkciLA61V+rQRDvYYsdTmtTs8TrMu+M+He5qBRsmIjsWv6vDEQdegsX/vfUxHUbZl+mwse0B2OGlT/aBsGYmLE4MPKzDmERwMtqS8Qg/aerHOly85EUd+qLxoH1+2a90+ErtIlic2nCzDqM2glFi7A2Xwg5VdS0gPQw6VHSAq4mIdLz4jg5HTMB7+PoHwc3/lTPe1GHcC5/ADutXPK7DWz344yhdc7cOPQfBRS0hEY/PjbYOsG1lYEpsN8DFS0TcocMgNSLM+ezozDXQKeqtgw38VnC4mhGmfLGJaTp0Jo3QocesgR3aD4CLflpytg4zZ+GbjmHzwaRx2Gi8wfGTwL3PjUvAp3/pGjDWiUhsjF2H7725Qoft9YdgB6e3RIcJsfiSneIEc/i42HgdxqSkww6btq7XYUdHGyzOiAXHz6K7vw4qr8XXiK+VP6LD8kcydThz+Fdhh4WzwHTrYCy4FxaRnangNF/3V3DK5I24CXYYNgEMVq4k8HJVjoOww6oacKjYXsmBxcP3pepwzkxwHgUSwe2JiGSPBwOF2xLhltMKduZOAZ9+uQWPgXvMfxsoto785zrDVVddxdXY/ohPwlJP6boCm/Cnl49ZgSUiIiIiIiIiouM0qeSfTz7xqwn6KS7C0sl3zJfAcvmViIiIiIiIiOgETSrZxK8m6L+4CEsnWVFREb8EloiIiIiIiIioJ3T9ta78/Hw+EttfcBGWTqauP8PV9aujiYiIiIiIiIjopOi6DsuvJugvuAhLJ0dRUVHXL4Hl8isRERERERERUQ/p+ugbv5qgX+AiLJ0ER7+CgCuwRERERERERESnzDFfTdC7G0OfjYuwdKK6fgWBcAWWiIiIiIiIiOhU6boOaxgGv5qgz7L19gZQP3bMb3BF/fYR96GUfaosZXUa/Otxaxfr8NpLT9fh1sNe2MFq9eswGDcOF8cn6tCVlKHDvEWzYYeKskYdbmmJh8U733hdhwlVH+hwwjU/gx2yRsfq8JYvL9Th+LFrYYfMXR/pcM2v/wCL7/LV6HDJU/fqcHjjetjB4gAdDMOAxaZpwhx0iJCb6L9EKj5+Rrd6wDdh4LcWkk6Qdhzqxsshwc4mmNssdh2evgD8G8nkW78COzx6fyFInZWwONS+E20DuMREJYyEHXwmKJ47ax7YhMZq2CEmJgYUx+EzdP3OPTpsrinTYTA6HXbwtdXpsN3bqsNAez3sEO0A/w56zrWX45e7fowOOyrAW16b1AY7LNleATrswKNHescaHY4bOlWHNQ1HYAe7zaFDT3KODsuOlMMOnU0gnzvxDFg89ebLdDg89IQO5/9lL+xgX/5tHc6aMU2H1e8MgR2Mqo06tO0Dx4mIzPeAwzjvz4/o8PGbfwM7zBgCdmbIhz99hwR12BoDrjKmLQ52MINghD8Zg+5ABi8GZigAi91W8Bn52sFpKxGurQnRyTps62iBHaLQHUCiF5zO5WeBq4mIOD8A48+Nzz4Fi5Msz+pwc8Wvdbi0BIyiIlKbCN6d1cQnY3weOBmrlo3V4UUt+JJkt4CZp2Gx6tD/tAd2ePvTr+vQlQHmoiLiTQBXnykTFuiwLqkddqgq361DSxuYJ5uFr8AOQzq36bBjOwhFZMV3tusw9j4winquGQ07zF38Vx3OsYCzQERKMsDlMm77fvByjR/CDh5nFEg70M50oEqRUBCcSg50pRORYAc4c90OcMq0mnjQtgZA7jJcsHi4FRyZV/zgPh3uD+IOKZ1gV0TPAm07O/AjXJ4jYEyxT8azXKulVoffHAPmqD/K+TPs8PuJ4I38cRaYpUT/Kgt2mOMHF7t0J76ojfjC1TqMGwnuIsUDdpqIeGMbdJgMbtREROw+cLC5h4Mb6gOd4OZURC6IX6HD3++YpMO9q8HgLCJjHNfq0HUxupcRaTkMRtfoC8Dst6wMnLYiMr12uA7rksBx0uhzww6ueHAE1k/UKxMiIjviwYUmqmWoDufhAUxs0eBSnpx5EBbH2rboMDf4pg7fFDC1E5H1ZeAwrngWTImjds1tv+2fV5+CgoLCwkI+FdsH8UlY+pz0CmwvbgwRERERERER0aAV9dc/RP31nw9d8Sti+yYuwtLnwRVYIiIiIiIiIqI+JbwOy6+I7YO4CEvddsyXwHIFloiIiIiIiIioL+A6bJ/FRVjqnvz8/OLi4qN/jvrtI1yBJSIiIiIiIiLqO7quw/KnuvoOLsJSNxyzAtu7G0NERERERERERFp4HVZECgoKuA7bF3ARlo5LUVGRYRjhFdi8HPD7lURERERERERE1BdE/fUP4dUb/lRXX8BFWPrPjvkSWK7AEhERERERERH1feE1HH5FbK+z9fYGUF/X9SsIRGT2xUuP/uGbUxfo4nF3btdhXONo2DkqZoYOl7e06jD3nItgh3ZXUIcHJ6+GxenekToMWjp0+LvDNbCDZU+sDlveXgKLx9e+p8MLH/6zDusqm2CH1EvBu2uInq3DnX+sgB0+jPHr8JsesNtFpPOP43Q4pvkTHZoWL+wgYoDMjFB7vH//5BRDcNNOvK1hRPrHLfCCpgleMOI2oP8Q4wSHpYhcds8vdfjxtBE6XPoiOG1FJHPYFB02HvkUFg/JnKTDWBvYFeNGj4cd4tPTdDjtW1fq0JkMTg0R+ST6Czp89A/4i1OidoCzw52eo8PWyh2wg9nWDNIgODvOvuJm2OGcgjN1uHJaIyx+bB3Y87clgg6ZI/bBDrNSHDoMzJ6Gi8eAET4qM0OH1YfwgOlOTtbhuhLw2XlLfwo7RLtidDjz2mthsUxo0Nm+X/xch2UbroMNZo1ZpMMh4zJ1WPrxNtghs32iDucUDIPFLhsYEJ5+cb0OJ154NezgaSvVYVwmOI9EpMEK5nstrXU6jHGBD05EpKUahJZuDJk9NOT2ERGudSCOdnpgacLQOTqsK1sLi92edB3GpAzXYZLdCjukjpigwzYf2OAhh8BZICKtX8rWoTUF1sodgUodjj4ABsxDM/Gd4Q3OFTqsb42CxTnRW3S4zQSD+XPPJ8IOiVXzddhufKRD0x6CHRIaj4C2tcthsTjAGwm0+nQYCpwHG9jawITWjHfq0Dp+Lu7QCA6qYZNmwuKho8BR4UwE76LTnwQ7uB66RYfzH3oUFv/jjMd16I19UodxS/4GO6Q6wWDTFp2gQ9PEZ3NSIpgnu9PAtEpErEHw2bU21YPSmnLYwRFs1+GQmZfC4mHTwKU8Jh5c9FtT8RyjNr5Mh3sC4A7lukRw4RCRhcYhHVqr42Gx/SCYQbnjo3WY1fIA7LA6BCYDr5z2rA4/WAzGOhHxPQ5mCPPywMRDRMxoMKFdHwCf8r5YMNaJSFTSGh0+eh7oICLRreADDVW6Qds1dtihVG4CadsqnTn3fAw7rP3Rmzr8ku1PsPiMy0D4WjW4NUiaiibPIpscG0FxVJUO4wP4GjpcwPEjp8FaaUoGCw7btoELx9B6PE/2ucGeD6UGYHGrFcxRxQAnXcfGdbDDQht4uSW1YIbpXQ/mEiJSmjVHRBKz5tSv+ob8ax2WT8X2Fj4JS5+l6wrs7IuXhldgiYiIiIiIiIioX0ic8/ujfyguLuZXxPYWLsISdsyXwHL5lYiIiIiIiIionwqvwwp/qquXcBGWgKKioq5fAssVWCIiIiIiIiKifi1xzu/DS7H8UoJTj4uwdCyuwBIRERERERERDUj8qa7ewkVY+jfHrMCGz0wiIiIiIiIiIhoAuA7bK7gIS//v6G/kHf1zXs41XIElIiIiIiIiIhp4uq7DGobBr4g9BbgIS/+Un58f/hkuLr8SEREREREREQ1gXRd/+FNdp4CttzeA+oSuK7BLS82u/2lLbiH8Kw7rbTpMCRzWYXZbJexw/RZTh6Vtt+ow9q1c2CH7ijNAWpMEi+uzXtLhJ0uadJhadiXskNOSrMNbb0PbIGKfe4kON3e26/D54D7Yoe2Kp3Vo3HqjDt+6YxvsMPLht3Toe+s0WDy+frkObVGGDjsC4IMTEUNAcV/WU5tr4v0D025tg8UA/2w2euRMWFy4A/T2L1upw3nnz4UdjpTW6nDC2efA4rEe8P7yfrlAhyMsYJQQEU9TM0iX3ayzzZlrYIfvvJ6qw6h/4GlEcoNPhy7/ER3aW3bDDmaoTYd5Y+fo8OK7L4Ud9mWDPfxaXRUsviobfNDfGLtRh7GNu2CHklSXDgOv4AFhs3ygw19UB3WYveUs2KF1f0iHVUsf1mFisAZ2uO2un+gw+opRsPjhjpd1WNcJ9rBnRxrsMDI/RYdbrHYdWnbhQ2L2HPAZVQ0dBou3PHS/DtPsnTrMuBZcbUUkfeI0HVb4HLC4rLJBh9GCiuNGwg7SskNncAQz+9u14BTzuGJh7sycosMkF57SyBFw7k8692Id1lbWwQamJ0GHlZ0eHWY24ZuFhDwwBq5MLoXFpXVgfG4Y/VUdnhVVBjtsQkPj1QkrYPFqX6YOA6XodP50NOzg/OBJHeadpI+8AAAgAElEQVROLtDhwbPA1UREXO1TdWivAVcZEfHvfF6H1VuLQemGv8MOHisY4X2pZ4HXCsAGErA06rC5CXzKInKwEuTxXqsO64L4ou/PAYNSrQdcOERkfmOLDt+a9RfwcnN/BjuM2wKGO/fWd3TYUYOP4fSJYLLUmYAHzEAbmNLEpYHLwZGPlsEOHRUf6jDKjUf4Fie4ftXU+nXYnAXuRESksArkxsFXdLjNdi/sMGku+OxySvGEpPMQOBmzfluuw3uGgFBEXksFx/HPcy7T4W2Cj8DzvgRufEybGxbvcYABKM0EO+2KMnAmikjecvB/9I6asRgWl3+wToeWneDa6t6ODwlnMxqX9oDiBN922CGEhpQlD94Hi7+aDmZ37jPrwSZ0gMNSRMZGtepwq2zS4WH/WNhhogscgakRLiglw8F0qzYBFL8WxIPSdE+0DkfVgbUCEUlNzdBhhx2ctos3o7shkUbLBTrMmAJuvozJe2EHoyRPh84Zt4f/fPqM20VkxatnikhBQUFhYSG/naDn8ElY+qwVWCIiIiIiIiIiGsBOv+Kjo3/g87A9iouwg1pRUZFhGFyBJSIiIiIiIiIatLquw/Jh2B7CRdjBq6ioKPwzXMLvgSUiIiIiIiIiGqy6/lQX12F7AhdhBymuwBIRERERERERURjXYXsUF2EHI67AEhERERERERHRMbgO23O4CDvo5Ofnh1dg83Ku4QosEREREREREREdxXXYHsJF2MElPz8//DNcXH4lIiIiIiIiIqJjHLMOW1RU1LvbMzDYensD6NTpugI74+CqkCp4Kf1+/beeuq86Qj+njkJNmTp0b5gJ/77D79bhuFClDr1Rdthh2HTQYWWlFxaXJozXYVxStg6nuUfADplT63S4x+aHxc+VPKXDhtvAzpy0bxPskDFpng5/d91sHTZf+33YIS/jHB3GHIK1Yo0CYWegQ4eGGLgFfSabFYy3Ths4hgWGIgHT1OHGbath8Th9hossevgnOtxTAdqKyIJrU3R4dtJYWJxyqEmHHZ+u1OHi7z0AO3ywYoUOd6F/Kvrok5tgh6TQEB0m+HbCYmegVodGqEqH43OnwQ6pSak6zH/4ezrMGr0YdsgO7tXh2NzJsDhFwBtJWbVPh03P/QF2yOmo12F7JjpQRO4Ogl1xMA0cP1WjwDaISPaaOTrMmzRMh6ef9RfYIXAxONh+Vl0Oi6v2gZ1ZE/ymDsfVb4YdoqLBhSbUCUb40fPB0Coi7X4wYG5/7M+w2OOr0eGYdI8Op4yLgR02pbt0uONN0FZEomMTdRiTO0aHh/dvgR3gZdgUePzgIWVgXzvge4M7otXXAjvENB/Q4ZybbobFNUuTdDjzogk63NOCn7fY9fZuHboCQR2OScYfaHMqONjWmwdhscto1WFU6Cwdbm0shh3Wb12gw7Pn4505q/QtHforTtNhYit4yyKSMnKGDlu3vKjDzM14juqYAS5g9Q58fXfYMnTo7CjRoSUKDwimaQUdqt/VoSuEh/2gBeQ1nfguoGYvmCFU7wYTWuuProcdHj90hQ6bJQ4Wh+rbdGhpA2dBaM4e2OGDe8CeT9v5VR0OewRfsqubAjoMWvHZ4a0CtwwBPxiHm52xsEN09HAdNjT5YHFcG3i5pmZwqAStuIN3eaMOO5eDa0SgCU87388DG3xdBr4pMxPBcRXdeoMOc197HHb44coKHX448h0d2ozbYQdXC5g0HnniMVjs2bFRh0NvvEiHuw6+BDt82fltHbr34gmJxLwCwmow1MS14ePHI2BAaLJ06jDgxied1Qouaw1NR2Dx0l89rMOz7PeC0nnrYIdUx6c6tNeB61TtQTxoV4yYosPh1mhYHKw/oMP2RrAC4EzcADvssaDiKDB5FpHOAPg4jgTBRc2ahlfngnvAwkuw4modjr4YXG1FpGwSOIb9b4DTVkQWXPbkv/1PefKXN7pFpLi4uLi4uLCwkE/FniA+CTtYHLMC27sbQ0REREREREREfdl9T///P6gUFBTwedgTxEXYQYHfQkBERERERERERN3SdRGJ67AniIuwA1xRURFXYImIiIiIiIiI6HPo+qPuXIc9EVyEHciKiooKCgq4AktERERERERERJ8b12FPHBdhB6yjK7Dh/8kVWCIiIiIiIiIi+ny4DnuCuAg7MHEFloiIiIiIiIiITqKu67D5+fm9uzH9DhdhByCuwBIRERERERER0UkXXmUqLi7mOmy32Hp7A+gkO2YFNnruT3eoGse4J+Dfbbc26nCsEYLFfqtbhzEdlTqMiq2AHabd+JAOvbljdLhzdCvsUPpauQ5TJwyHxW01CTrMcKfpcEXHJtjB/3EDCLdWw2LLc2CbJzSs0+FZ886DHa5cfKcOU++ZoMP5QzthB9ebE3U4vP4DWNxpBnVoiAGL6TNEOWNwnjFVh45Qhw6tVvzPY8E2cASePv98WDz5Tzfq8HBHmw5vnH4Ydqi887c6fHPZMlhcXQnO/X3NzTq04RNU/vLFC3XoWAcGhMl1G2AH09gDQgs4sEUkOzFXhwvu+IsOR+aNhB3a0GlXMqxGh1PrqmAH6wYwio5wbYTF/u0gX/XiKzp8OQ6/5VCzqcMnAr+GxSO32HX4s/tv0+GWUbWwg/Mepw6zymfo0EgCGyYiD7iX6zBhKeggIq0xYDPcLyfq0BrEH0fz7m06nH7+Ah36cj2ww/ZXwZGZcAQM+yIyLSNKh4v++7s6rB2Jh5QP14EzN9UTB4vjpoEP9MBbLToM1O+FHewGGJdMM4BqeeEIA7uitQMMjCIy2unXYcoFeA7mHl+gw5qxYBxOcS+FHZZ2gA6TdoJrRIMDf6ArOw/p8LC1HhaPAeei5FmP6HDx7lLYwffpJTr8KDcZFq/YXaJDoyZdh9GZI2CH1gww8reXgnM8qmUN7GB+9EMdOmPGwWK7gD0Pz69AB5ird4thtcLcaoA80FKGm7SCT7+2GVyFbbfvgh08MWCOatvvhcVDOkDnWnuWDuOex9Ny1xd/oMOSM8Bnt38BPuCHrB+mQ8+hg7DYaoIz1/tpIdiw5n2ww4i8C3Q4ZvZMWByfAU4EVwa4duSWgUuPiNjTHtahfy24S4quAddKEdn5/a/osPnXY2Fx8iMv6NA6N0WHvsps2CE6Hcwc7ixfBNrW61thEZFQPJg21L2D/4/Vaw6C4pz14PgJtOPjJwl9dK3ngts6EdnecjHoEPMlHU64Ad9FZrjA/lm5BAxr/iVgti8ihhccmRYbmEuISHULmE6sew3M4qL34lnc5ivBwebwf0OHTh8+Zdqt4DITEBcsHjrEocPqRjC6dljwoB1rgA+6Kgiu4yLS5gP7LTMaLMRFZ2XADkY5GFKcQTAdPa0DXxbnTwUj/LYZb8Hip94AZ+6ZP3oelP5E1pb/Xf61DsuvJjhOfBJ2QOEzsERERERERERE1KP4POznwEXYgaPrCmxezjVcgSUiIiIiIiIiop7Addju4iLsAHHMCmzvbgwREREREREREQ1sXIftFi7CDgRcgSUiIiIiIiIiolOM67DHj4uw/R5XYImIiIiIiIiIqFdwHfY4cRG2f+MKLBERERERERER9SKuwx4PLsL2Y1yBJSIiIiIiIiKiXsd12P/I1tsbQJ9T1xXY1AueKRNxNQZ12ejSt3ToSsSL746YDB16bemwOFC1RocjR83Soe9798MOOz+o1eH+7MM6HLE+C3Y4lLNPh+6PKmFx65VuHW751fs6zIgeBjs0jnfo0Hx+JyzOaf1Yh7NmL9Lh+X++D3Y4bet/6fChnFawYT+9AXYYG/gQpHZYK4YY+D+QiIiYYurQ7YgGYdpk2GH0nAt0mDt+qA4NE7yWiDTXNelw9g1TYPFpwcd0aG+t12HT/a/DDqueXw3SCIdJYwwIfehM2r79QthhepVXh9GxJTpssYKxTkTsNqcOs5NGwOKvP/2IDkN523W40r8Cdti/d4YOhx4BOyKYBo4TEQm8/786LNmBh5SNtZ06fHAs2BWlH98DO4ytX6fDt/7yDVi8c+gBHS4L/EOHhr0Mdmg1WnS43H6ODl1vpcIOHU6wM42DzbA4uv58HXq8y0EYlwk7JLgCOhydBY74X9VuhR1cHQ06nHzW1bB49ulDdBiaEaXDlyxrYQfvTrDBztAkWLzTbNRh9ep3dJgleA8LGgPhiDA4ryXHu3dELBYr7BAdDQaKTe1gYBSR7cOX6fBMa6wOr29YAjvsHvE7HT57+M86zO7E84bK98HLecckwuLs0eCOI835ig4Db4O3JiJSdp7Ogg/6YK1379k6jGrp0KHl8IewQ6jkVdDBij5SSwh2EANMtm3t23CxiTrj7ETPMNPEGwynHnDyIyKmCcYf6QDXKWk+ADskNoJrR8iKXy4UBY6f+CC4CzDaYAPxP3q9DnMfB7uiccY3YQevB4zwMQn4LikjCdx01KeBWZGrYRfscMaiuTqMzcuFxQe94I2YQ8Fg/p6/AnbwbjlDh7bJ7Tq078Dn+Ccv/FSHz3vAvYyILLobDHdPfqdQhw8sHAo7rPwfcEO0f/jTOqzbthl2GDEVjGDrPWCUEJGtk8C4XZ0AbgyzK/H5FURnxz/+dC0sjneO0eGY08bqcBHIRESypx/SYVFLnQ6NHeBIE5G0Q2AEs/oP4NfrBIdKXS24banadhC/XA2Y8tWd+6IOWzv2ww7ZnUd0WGaAUUJEkuzgsxuSCpYmjBSwJ0VkpDUebJvph8ViAVPiIyGwf7JG41WIdBdYstgeAse2Ix2s54hIgh0M2qfZwLsQkez5D+qw+N0PQNtbb4Ud0tZcXPXml+Rf67BFRUWwbNDik7D90jErsL27MURERERERERERGmXPH/0D3weVuMibP/DFVgiIiIiIiIiIuqDuq7D8mHYrrgI289wBZaIiIiIiIiIiPqs8DpsQUEB12HDuAjbn3AFloiIiIiIiIiI+jiuw2pchO03uAJLRERERERERET9Atdhj8FF2H6jsBD8ZCQREREREREREVEfxHXYrrgI2z/k5+cXFxcf/TMfgyUiIiIiIiIior4vL+eao3/gOqyttzeA/rOuK7CnTXlgQoIblg2bO0KHpZvBOvu+batgh+bDm3RoWkxYPCR1tA59Y6/QYe72atjhbQ/IG57YrMMNa0thh7i0oTpsa2+BxY7tTh0mxKWAbag5CDukPfKcDg1XCBaLDez50666XIcTsvCqeuUTf9fhD9Zfq8MpgR2wg9Vp1WEgFITFpsAP2jiuaLCCu2L+peAsEJG82/J0+JGzQocHNqfBDp63W3W4LvcHsDjlLy/q0HY5OOBHX5wOO9xi5ujwJysPweLfRF+jwxmbqkCpG7wLERE72J3N3gYdxjg9sMG8y2/XYf73L4XFFZmf6HBIcIkOL7PFwQ6l46J1eHH5eh1+9K0fww5/qwfvbmkyPsPqfd/SYe77Ph1+9xs3wQ6L7rtXh5PXXQmLS99eo8OXPz5Th56pX4Adci8H+8dR/T86PFJ+C+wwbNoFOhw62g6LO4PoyrgLHGyOdgfsMPW8WTp8IBN8oPbHm2GHMeNP02HiCLAfRCRuMrhGrIr7QIcHtn8MOwS9c3Ro8zbBYv96sCucjaDYYsX/PB8ywcXO4PWg+1wOPILtbvTqsP6XeEoTMwOMbG+cvlOHH8Tlwg4Xd27UYUviOh02P4Pngbmd4CYi+fyLYfEaE8wwP1y9WoeBfXfADu56sBmBlWCDRWS4d7sOvUngKhwVQtcpETHBKWMG4JQP7x8RdMpEmEMZFpCbZqTOp06kDYbgTDLYUXvimxFhqg23ATPsYPZrGGC4i1v/MO7gTgVhJhiHRcQz7modtjnBzgwF2mAH54ghOlydWgmLd/jAVWl6NBpSAgdgh0BNvQ7tLjBYOa4H9zIikrJ1vg5feuQ+WPzs2/k63LclSodrZi6AHV5bCu4NP5n3gA63R1jtWLwLjK77ZuAj6P1MsG2tw76rwwTjNdihtQxM+KUZ3KmJSNzubTqcc+lZOjyc1Qg7DLeW6LB82hM69PiSYAebFdwFpNnw/vH5/Trs3A/ehb0K7QeRnCxw7ZhRAXZ7/MhhsEOy4dLhcl8AFvuDYG4/NHu3Dsvr8SpETFKsDhOt5bB4Q0OyDlt9YDra6syAHcYNAfdZ4/1grt5q4FNmiGOPDnOs4FopIitCI3VotYPBqs2Hl00SreCWM5B42rTE0zZu+paIFBQUFBYW5ueDoWAw4JOwfd0xK7C9uzFERERERERERETdMm3qb4/+YTA/D8tF2D6NK7BERERERERERNTfcR2Wi7B9F1dgiYiIiIiIiIhoYOi6Dtu7W9IruAjbRxUVFXEFloiIiIiIiIiIBp5B+M2wXITti4qKisL/JsAVWCIiIiIiIiIiGgDCD8MWFxcPtnVYLsL2OVyBJSIiIiIiIiKiAWnQrsNyEbZv6boCm5dzTe9uDBERERERERER0ck1ONdhbb29AfRvCgsLw3++bdnfDnR26pq9Riv8u4dWJoNwZ0iHbfUvwA4Oh1OHUycvgMWzv36nDt/dYurwzV/eBTvESLMOY6UJ1YK2IiLNy7tRLEaE/FgpFrDTRMR0gg7BUBAWTx85C3SePEKHge/cCztc1HhIh9OW79VhfNZQ2KHF16ZDs60SFhvHvX8GjAgHSqTjB7jmkut1mPzdCbB4jftRHf72l5/q0PbbaNhhvG+nDjs8L8LiW+506dBZuE+He94u1KGILC316vDgefif7mY8Wq3DuDSPDmtbQFsRkRDY8y6bW4cLzvsibDDtVwt1GO94GBbvNsDL5XRm6zBxDTgTRWTXkxfq8Ka6Fh2+YNwIO8z8R4UOs+0BWHzmOZN1eOVTl4EOF7wGO7zw6Dd0OG/5bbDYWgEO43Ebt+uw/aWZsMPe+4p16AheqcPs08FoKSKZQ8GusLdZYfHwtngdHhk2XofJB/bADp0x4HANro/SoW12DOzQ+PFuHc4eA7ZBRJYk1+nww8rDOmwqxwNCTCo4GS0dqbDY3QYuVabhB2FnO+wg6JQ5/gsrhQWCYLeLSF1FiQ4nzcdzjKo0MFEpfQ3M6gMX3gI7RE8Cl4OvB/6owz/f8BDsMKT6Yh3WbquFxVnrwGFsP3C2DtvXfAQ7uGxgg1PQZVFETAsYiqPql6FKPOWzGOhihycIEc6CbswmxDS7U91XnYSZZLcanPAeNk10fuGLjIQ6wPy5s+wNWNy6IRGEEy/RYcURMOyLyPLFpTrsMIbA4u0HwdWncyGYQZ2TthZ22OUBL+cqsutwTMJc2MH9zRwdHmjD9ziuZb/R4TgHuDHs3P032OGBO2/QYcvWr+vwzB89Bzs0DgfhjgYfLG5Pv1+HsyeBBaPzh18LOzxV9qQOy9bho83TBj7Q+vKDOmwrHgk7vG6frsN77rhAhxOvBjtNRGz3z9ahJQGvHQ2dAh4dq2nsAB3sYLVBRKIC4NM/AjJxLsWDdtwt4Mbn8oRVsPj5cjCRa4mbqEO/BdzgiMj6NnCOJ7vwJdvlBxN+05miw+muLNhhjOuIDiudYOI6yorP8cMmuCy+uR+sFYjIpa71OsxAN7jLksFBJSJT8sD1/RzP+bA4Oueum0baRaS4uLioqGgwLMXySdjedM8992R34Xa7wz/G9XgpWH4lIiIiIiIiIiIaAJ4s+ee/TxcUFBQVFfXuxpwCXITtTYWFhRVd+Hz//Mc3rsASEREREREREdHANqjWYbkI2+dwBZaIiIiIiIiIiAaDruuwvbslPY2LsL3p0KFDpml2/R5YrsASEREREREREdHgEV6HHdjfDMtF2F5WVFQUXunnCiwREREREREREQ1OxcXFA3gdlouwvYkrsERERERERERENMiFH4YdwOuwXITtTeEvIsjLuaZ3t4SIiIiIiIiIiKi3DPh1WFtvb8DglZ+fX1xcHP6f3/joh7rGCHXoMNiBP7XoTybqMHlvQIcTU7Jgh+sf+4sOXxm5Dxbf8fSfdej5XaUOs41y2EEsIRAahs5M/PfFAmo/A2hjmjBEGyZimt14vXPPP1eHHsdkHT4Qtx92aHnsCtAhvk2HlvihsIO/7BMd2q0OWBwI+XUI948h3dvvPSTCURHpYAEi7ArcYd6ks3SYcPt1Ovzdltmww9rnxukw629eHSa59sIOI8eBznuWfwyLF3wtT4frhlTr0PE/o2EH6+1bdPjmmJtg8dxxiTp0Nh/QocXA//gXMoM69LjjdJg6Yybs0BG1VIfZ+5thcaYB/s8HKx97XIcXHMRDrqfwAh2ONhp0OCX6MOww68JFOpx5KWgrIt4pI3V4y45v6dDvBtsgIqfdsROEs8GFQ0Q6752hw4DLp8O4L94BO9gSQIfo9BQdfvmGNNhhyKwjOmy3HoLFL7W0guKPM3U44sKrYYdONLINqRqhw6povA2TrwZHps8LrsIikrIzW4deT6wOXW/bYYehw6fpMHNcFCzeWwKGGr+vBZR2VMEOFqtVhyF0uewTV4hTDr5rE11QOgPgsxARQTuzta4R1u5cVaPDwJYSHaY1zoIdftx2qw4TOp7RYYzlHdjho32rdThkzwJYnHUH2IyWlRt0aCtNhx1SK9/VYciGz68IFxp4fccHLJz/UI/rC3s9wjbA2S+cuohI2afP69D3KTiV4nz4kl1WmatDa+DHsNi+t1aH9W+k6vCJ71wIO8z0ggnJait4SGhK1EHYweXN0eGS8/H+idkBBoq4ipd16LC4YIf1y1/R4fCv3avDP33jm7DDj8b9Sodf2R8Ni2uGgnHJb1mrQ2sAzxCixoNd8cuvgXmOiOzdA2ZQRtGDoHQZGBhFxGoDc9eyuB/rcO6Cn8MOj5ZO12FBM5h4iMisC+fosNGdpMOSJe/DDnFDh+gwGA8mHkXLdsEOM58Hc7CSCFO+yn3/0GHMMHCXfVE2vkZ4A24dugSctiKy1gXyi9wJOpzvwLctI9rA5fKVsjd0uDcX3G+KyPSaPTp8/gV8h/LjmB/p8PRrT9PhshloJikS8oMOfzDxGtQMK5hs5+Vcs7b87yJSXFxcVFQ0wJZi+SRs7+i6AsvHYImIiIiIiIiIiMKrZAUFBUVFRb27MScXF2F7QVFREVdgiYiIiIiIiIiIjjFQ12G5CHuqdf0xLq7AEhERERERERERdRVeMQv/nNIAwEXYU4orsERERERERERERMdjIP1IFxdhTymuwBIREREREREREX228NLZgFmH5SLsqTMwjhgiIiIiIiIiIqKe1nUddgB8OSwXYU+R/Px8/hgXERERERERERHRcRpIP9Jl6+0NGBSKiorCK7DjnJe0VrXqmvF3rdNhyGKAMGUsfJXo8emg7XTwEfuG42dyv3z7r3VoPbAPFk8wSnRo2oMgtJiwA2Sa3SgOdaf4xBng05C0+BxYvLopChRPnafDZ+77MuwwKupNHQ4767s6rNq9BnbwJI3WYXs9+OBExAx26tAQ9J5PLVPwp2y1WEExOiTGDZ0BOyQkpemwrjMEi3eNLNBh4ZnX67AjfiHskI7+0SvZ+SEohYeayO4S8EHPXDgRFv842QNSu0Nn6/YcgR3Ou3uUDt+8EB9sX7O+rMMLFr+uw+b1zbCDz9+uQ9MEH0d1PThWRaTBO0yHpVu/B4t/9fRuHT5bAU7GqdsPwQ7BGJBPOe8OHU5aeBbs4M5K0eG3E5+FxaEzH9RhbOpwHcaddjrs0P7XG3QYcODjZ86c+TqsaqjVYbM9CXaI9YEP9CtXjNThsNPxoDSvZpsOA/sfh8XLAnt0uO1MMIpmjAM7TUReTwZX4cbH/Tq84epZsEPFnP06fFXAkSYilRvAYNX5CdjDSTZwYIuI1QDX9/RkPGDWvb1Wh1m+ch2aVjwGSh+4HPQ78BpqMfADEH5/hw53b1gPi1vbt+sw3gZezrl9NewwtB6cCLuTwegRKMHXCPcKcI67LGDYF5GD5eBgM0q36jDHvxl2sMRE6zDU0QiL4bWD6OSLcCPSGfDp0DArdBgCk1kRkdZ6cO0wn7kOFidawXTCMMFN2ZB362GHEvsXdZiQOESHjZ1gJikiUeAdy7VT58Ji308W6HDXr8FpO9yGN3h/+Q4dNq94Wofn5H4HdijJ+IUO83KWw2LPaw063Pi3J3WYPWEn7DA9BozPt7nwCHZ/JpiwSRXoYG0Go6iIBIIBHa763x/qcP/BKbBDak4uaPsanv/8LQAWNxYmgA1ePycDdvDvTABpCBwSjqgY2KHq4Vt1eM+CJ2DxrQImbK3PgoM4+oZLYYc7cp/R4Q5jBSwedRAcrm0jLtThxM4xsEN7M5ijvv93cGHdMSYVdihKBSdjtcMOi2f5btPhXW0uHWYlrYIdEj4Cn126735YfOSie3Q45cZXdbj2Xw0KCwv79f/LnE/Cngrhn3LjM7BERERERERERETHacB8OSwXYXtc+IsIuAJLRERERERERETULQPjy2G5CNuzun4VLBEREREREREREXXXAPhyWC7C9iD+GBcREREREREREdGJ67oO27tb8vlwEbandP0xLq7AEhERERERERERnRT98cthuQjbU/hjXERERERERERERCdLv/6RLi7C9gj+GBcREREREREREdHJ1X9/pIuLsCdf1y8iICIiIiIiIiIiopOln/5Il623N2AACn898PTkBcH2qmP+6+xF18K/VdsGFsSbmxp16G33wQ6TMwI6fO9Qpw4Tnr8Sdhhh9+vQcMJaCYWCIDVxcf9iiAHzWFe8Di+647uw2HNnsg5fKnpHh+NWjoEd8r54L2g7dLQOLQ437FBbulGHrQ37YDEG90SPfcomap0QlQSLb/ny7TpMmzVRhyW2NNjhz79arEPrht/D4tCm98DL2cAGG23HnvVHmZYOUIz+ISwUaQ8b4D9cet40WJteul6HLe9+qMPDCW2wwz53qw7jj4ADW0R+d+szOvzFEHAMt31lKewQ507Q4bRxM3SYPRt8yiLyrcwaK5YAACAASURBVAce1eHPfpcHixOCU3Q4MRbsiujkWNjhkmvv0WFgyAQdPtaOh5TqOx7UoRMeEyKJ8eB6bW/fpMMJqcNgh5H3gZebcAnYwyLirQUXmtXPvKrD6SOGwg7DTxuvQ2OGS4dNlkLYoRmdjJ+YtfjlHOBi9+G0Bh1Wpu2AHer8n4K2d31Fhy/aqmGHg39YqUNHPR6fHUGHDp2HonUY01oHO5xzBtiZDzffD4vNJWA6YbeDaYMZgg0wfGQPaBGHZxRaLOB0tkQ4x72d4KTrrNgCiz1uMBTHjjlXh5W1+JTxfvKQDkd0gGPb78BjoCV5nA7tDSWw2Llnmw4T0EXNdOL9E+hsgTlRX9SNqTIuDYXAWGwa6OZLxBo6fJyNTRe49IhIshwAaV2pzqrex1fA+KyxOsy5DtxaisiNuT/W4YQJ03U4aimY7YuItQxM2PY9e6sO0z/F084pBXfqcE0CuLCKyPnJlTp85W3Q2bkVNpCqC606fCMG32bb8lbosG0juAdMSgehiISqwfzQtICZpGfKF2EH+7o/6LD6iiOw+Kt3XadD//ngDu5QLZhJikhFLJj/nJnpAdvgxCshwS/8RocNtXiekjUaXEMb/1Kjw4WN4PZfREpzp+rw4/XgTkREFpdl69CIWaDDOen1sEPiAXDefdycqMOUrT+FHUbenqXD4Cg8x1iUCY7jHCc4hmNb8awxOATMHCZ8vRkWf/z6/+jwKdtZOhx9BNycjnNcsrPzTREpLCzsL99LwCdhT7LwB88vIiAiIiIiIiIiIuo5/ejLYbkIezKFvwqWiIiIiIiIiIiIeki/+3JYLsKeNF2/CpaPwRIREREREREREfWc8PpbYSH+lrM+hYuwJ0348+YKLBERERERERERUU87ugrXL76UgIuwJ0f4iwi4AktERERERERERHQq9f0vJeAi7EnQ9YsIiIiIiIiIiIiI6NQIPxBZUFDQu1vy2bgIe6KKiorCnzEfgyUiIiIiIiIiIjqVwityfflLCWy9vQH9XvirYL9w9kPH/Cf7kBm6ftveMtjHbCjR4bTpk3VYYR8NO7z75pM6jOvcpsOA0w87GIYBNiwEa08pszvF4D18VmfQ2251wOLr82/U4aJvx8DiN84apcM1qy7T4VUzcmGHC792sQ4DseD9NW5Mgh327M7R4bu/fQsWGxYwGpgCP/6TcEwYJngj1158ow7P+vVXYYeRKVt06PZt1uHll+2CHUatf1+HQRs+OyIA78LtjoKllpjhOmyt3o664kN+VMY4HR6IHQaLqypv1uFvNoL988j0ONjB4piuw9sm4fHnur+A/9PHWm+FDhNzL4cdoqVJh50zL9LhQ++BdyEi9rcbdTjath8Wix0cxlkecMqc/f3fwwZvNiXosOSRP+owOhiAHZJThoC0fDksdoYO6PD0y76uw7hFeA+ndYD9M27qs7DYFmoDafatOgu4g7DDRqNFh/tb6nQ4KR4fw9nngQFzStV6WGxLbtbhVMdaHT5cAk58Edn/aboO98U/rEPjiTTYIeEg3LB4WGxpBvsnbcQkHZqdYHogIm88/Z4OrXvwwZZhBS8nfnBIWCz4n+dNs1uX4gEr0hzDgq6hhg1cDkIhfJXp6ACfUciPP9BAW5UOa+rQoWLFR2CMtQGkNjAOO0MgFBGjBmyDGeH6FbLCN4KKuzPFMLo36SPqTREO1m4cw5EOeHzWoZMxFOyI2Fuzgg7byjbBv2/7OXrurOT7sPj6b9+kw//ac6YOf+B/Dnawl1yqw5iMc3UYbKiEHQ45fDp8Y9cYWPynzGNv80Uk+X6XDm3b8KD9kjdLhzOewC9XNfdGHdad1QlKP10NO0R1ggvKkfJ1OgwewJNq0wrCiyfhm9ZhN4CZw/wNYIZ513t4lptSBu5xYn7dqkPnKDSfETFeBhPX/ePwPc5UK5jyVf0GFPtS0LVSZGLnP3T4Rju+vlunXaHDu1PBrHG3CS6sIrKyEby7IR5wda7Lwhsc54nW4dluOyxubgE3RJP9YIMb/gbmoiLyPz/6mQ6j5uE1lr/6wS1n3tNgWuVNjoUdMtL/fYPLRf71pQR9cymWT8KekPBXwRIREREREREREVGvuPS07x39Q5/9UgIuwn5+Xb8KVj8GS0RERERERERERKdGeB2WT8IONOGVda7AEhERERERERER9QVHv5Sgt7fiWFyE/ZzCa+r8MS4iIiIiIiIiIqJeF16mKygo6GvrsFyE/Ty6fhEBERERERERERER9QXhddjCwsLe3ZJjcBH28wh/EQEfgyUiIiIiIiIiIupriouL+9SXw3IRttv4RQRERERERERERER9U3jJrk99OaxhmmZvb0N/UlRUFH4Mdtb0/z36B5szChY3Ve7TYarHD4vHLfqqDj8t69Ch752fww42ow6kRgiEET5zGBu4tqeYaCsshjVCcbfeHfgPLjv47M6YtgB2WPT37+gwYdVUWDzluVEgXFKrw4c3fAw7zEp7R4edZc/p8NzD22CH/f99hw5zS1+CxVAgGAAbNu50WHy45qAOD9WVweL//t4DOpxwz2gdDlu/FXZY/42v6PCFYIUO12w5B3bwR7Xp0GLgf5oKmeBgc9ujdWhLngA7tNfv12GwowYWQx5XnA4bjUxYvDcWFFuiwAHvaMRvOW7YRB3G/Go6LJ68ZoYOX33xTh0O27QHdoiKcegwEAC73RphyB0670s6rNu3GRZ37n9bh7nD83S4V8C5LCLNHeDssNbu1qG7Hb9lsYDxNTbKDWvHjJykw/SzLtXhq/vBholI4v6dOryg6FxYfNfvwM58xb5Bhw9edSvscE7m1Tpc4GnR4Rxphh3S1ryrw62b34LF6eeD/bOraocOz1/8Zdjh0uz/0mHMJHAVrl+JTxnH9tU6dHsrYbERm6bDQ0mTdVjx0WLYIVC5C7yc7wAstkmrDkN+MG0wjAiXfc4WPwe0Mw2LHdeiPNIk3QyCI1PQdSryJwc/aNghwjZ055gw4MuhLPKNCdqZx78FRBRZhNMZnGGWCNeI2OgUHY44HcwERGT3UHCrtXnJX0FpKAg7RDvAy8UeBnOwsdHoBllk2pfv1eErmamweN+aF3Vo2eLVoW8YuNcTEXkX5JMCYK1AROKThujwcDO4HXba8cdh+Ep1aHPG6zDQ0QA7QHHuRJhfdPN9OvzwG+Czi3viItjhg8oXdHj3eZfosHMh+CxEZG+oWofepjNh8fymsTpszlkBKu34kp34yV06/P6qA7B4/4LrdXjrNHCw7Vj+LOzw8jpwl9S2ukCHMfFjYIfkS87W4S1n44WpGZ51OhxvZoDSL+LHS8+NOaLD7W/jRxgtXjCvnmgH98ijc0bCDp6FX9Phzk9Whf+8cuVNInLVVVf1kXVYPgnbPeGvkwivwBIREREREREREVEf1He+lICLsN2Qn59/9Pe4uAJLRERERERERETUZ82b9+TRP/SRLyXgIuzxKioqOroCS0RERERERERERH1ceB02/H9t70VchD1e/CICIiIiIiIiIiKifqcvPAzLRdjjwsdgiYiIiIiIiIiI+pfww7AFBeA3zU4lLsIel/DnxMdgiYiIiIiIiIiI+ou8nGuO/qF3f6GLi7D/WfgTCn9mRERERERERERE1I/07pcS2HrrhfuLY76IwN/WqGs6KlbBv+syQXFs9pmw+P01u3XoWf9HHVptAdjBRKEB0wiMbtTil+tWrWGAF4xxJeqw0++DHToD3uPfiMlDZ+gwfuZ5Ohx1JqgUka+uAMX7CufA4hmv79fhmed8QYfvVARhhxe33qTDZdvBW67KeAZ2uOycaTpcE3TC4sRDL+nwS997WIfV9nTYof6xH+rwD6+9DovHnF6hw5hvgz3/7LZa2OHdYR06fOu923Q41r0NdoBHYMjsxqFttYB/x+roxGdoyIfeCDrrLAb+5zGHzaFDe/MeWDyh2arDgM2jQ5sbNpAR0SN0uNFrh8Uvb/2mDrO2HNShS47ADqE2sOcNNIQNm/RF2KHRM1SH7cG9sDh1yrU6rKkt0aFZ9R7sEB0EZ64l2KTDGAf4LEQkPi5Th8mzLofF9qyROly2vVWHwW0rYYfoRHC0PXXOy7D4R1eC0cOdO0SHtw7fBTtcYjygw7h2dH4t2Qk7PLXzkA4t86Jg8XV7G3RY8kGNDu97YB3skBR6VYcpVnB9f3zklbBDTutoHb79Hh7hPc9X6jDUBmYC9hp8jsd44X7Dl0VTQihGA1B3ru4UZsIdhy4oZrATdjBC6NoR4ZIU4QM9UUZ3ZoLwGhrp+In0Nk5wG4j6ETxKnAwnftYcf4dI8+SWdjDL3bn8BVz8CZioZHtbdOgOgmuliFgmflWH1lQwKXJOww9RrVoD5qgdBz+Bxc4qsBlpHeU6NEvwfZaE/KDYgkfypLELdNheA26HO0vxfZZYXToL+ttQKf7onTbwRoImvsepKQGT7fFF4EnDxxr/ADtYp4PwyCgwtdtYlwM7HKnZocOvjF8Bi2ckPqfDV1tBh2+3ng87TEgCt1RLO8HNhYjEtl+lw782VOmwphHfBfjWp+gwrgncR9gr8RxjqhfcDmeehdcxRpjJOkzZ267Dj0LgtBWRrb4rdDi+DRc7beCDdtrBMTz88tthh9VvvaLDDje4kzVE8nKuWVv+dxEpLCzsredh+STsfxD+IgI+BktERERERERERNQfHV3Z68WHYbkI+1n4RQREREREREREREQDRm/9QhcXYSM65osIiIiIiIiIiIiIqJ/q3V/o4iJsRIWFhUf/wMdgiYiIiIiIiIiIBoZe+VICLsJi+fn5fAyWiIiIiIiIiIhowAg/ahl++PKU4SIsFl6B5WOwREREREREREREA8mpfxiWi7AAf4+LiIiIiIiIiIho4Akv953iX+iyncoX6y/Cj8EGfS3H/rf21bre4YyGfSyWOB0e2F8Ci2M6PtFh0ObXoSEG7HDizG7Fx81iWGEe60nXYdAzTIf+Q2DniIjT7tThiLPugMWB1NE6XLFqpQ7fWroJdqhrnarDsUYjLE5KTdRh3PxFOlz6fDnsYMvYq8O533lPh4ern4Edin++Rocj6z6CxXf/1wM63P/1gzpc9yDYkyJy77qf6rC8+gxYfOd74F+AMtordfhu29WwQ2bZFB2OsywHpREPYbANpgRhqWGA867d3wlKG3fDDqYBtsPjAqNE3OgLYAdfAzhU0myHYPGo3DE6TE8DJ50n1gM7ZJ9/pg4/DYFBSUQS12XqMCEEztyQJQQ7WAzwcThtLh1WlW2DHZoqvDr02NpgsSPtPB222sG7CDW2ww5G43odpufm6TAmawLsUFG2B7xcTSssbu0Em+GtPKDDrDHTYAdfABzb9sN4QEj6M/g4okcu1OGzTRmww9sXfqBDR8krOoy1qEutiIjMXJSkw3X2LFhs1oNr6+ZzY0BbwUdgveWwDpNlqA4LUiKMoq+/rkPbL/AAFOdv0mG0CUJroB52CJnwyOzGJbvnphOD0PHvTDPCZ2Sa+Opzgi/Xg7ozPewDm0t06kQ6zTWH1QHzhOhkHda31cLiQBDMzeAWnPiZGKlDKASure3tNbDYZoI3YkO9HQ5wryci1tpPdWgabh0eXIUfcPO7s3Vor94Ji4e27gIvZ0XTiVCk+2nw7uwO/OlXbgLTiaAHTOyzR8+FHdrqwd1BYyOY5wRD6F5GxGaL0qE9IRcWl5RV6DAmaosO88z5sIM3CG5GViaC/VOW1QA7+DdN0mGhHdwtikjtiHd0uPYQmElmjcT7p8w1UYee8/C7G5cDDuNAM+gQmloNO5SXgQWH4N/B/NnjxQsvY0eDIWVUNH53qehuL7D4f3V4ODbCkNAAPjt3CC+bBG1gm1NSR+mwrgbMk0UkMOFyHXqXPaFDe/DYz2Jq1o2bKp4Wkfz8/FP2PCyfhD1W+DHY6akX9+6WEBERERERERERUQ85lV9KwEXYf1NUVMTf4yIiIiIiIiIiIhrApmbdePQPp+wXurgI+2/C+53fBktERERERERERDSwnbKHYbkI+//4GCwREREREREREdFgcIp/oYuLsP+Pj8ESERERERERERENNuHfiOo5XIT9Jz4GS0RERERERERENHiEH8Q8BV9KwEXYfwo/eMzHYImIiIiIiIiIiAaVnv6FLluPdu8vwo8cT0s4PdBy8OifTcPUlXarU4chUCgiEuxs16Hhr8bVhgEyAWGEV4ukm+VKrDse5lbDqsPWjhYduhzRsIPPkaRDf+1uHcLPQkQSYpJ1eOhwHSyuXf03HTqb14K27kTYIc5fq0NbhHe3cD74PhHPLSk6tC72wA4hO3jXL394QIe+h0bCDqe1bdThDb/HY8oyf6oOn3sePB4+obUedrjinTd06H1xISx27I/TYZX1bh2emzECdmiJ8+nQt3mDDu0RxrmgHxyukc5n0wR5yOxAtTDEotDxY4tNg8Wj5p6vw3EjY2DxjOujdFgT7NRhXQhv8NttYASrf3UdLI5pRjsTHcNTcmbCDm3eVh02tzfpsK6pAnawB/bpMBSXBYsr92wB29DcqEObF7+cJypBh470STo83GqHHXxtzTqs3gdOWxEJuI7o0G6Cs6DF9MMOgo5hdxoePZJb39ehdV+lDhOengo7HM64TIeG6yodjr+gHHZIcz2iw4YW0FZE6ie/rcMpaFdkm0Ngh1m+AzrM+vhjHa6qLYUdAj++XIfjW8BhKSIhG9g2E1zzJRThOm4xwL+jow85IliLNoFOJji1I6L+yIwwPhvots5qgPloQjK+CtsywWQptGsp3gwvuDr3jTE+wsuhx8DgraWJQhGx+Gp06LeDOzhHNLhbFJHOFnBL7vCVweKQNahDuw3M7kJmCHaAI38gGMDbFgA3s7GyQ4fpC78POxyqRnOMlY+BUj+Yi4qIYaJtC+IZZnsL2OBAxX4dRnvAxFVE7J4JOmx+dpcO0zKHwQ7eEHgjE6fiW6roIJiuu10f6nBdCbh5F5Gx7k06DLbhT//ypL063JkIDrbF2/DLGW5wznS6wJ1aVCO+rRs3b5wOR1jxAW//GNwlVVSCcHUH2AYRMarBmdthBzenImIzwf3X4ZoDOgx+8DTs0Jp4NtgG+HIR1uKOrgFOSzh9Y8MK+dfDsD33vQR8ElZEhF9EQERERERERERENAhNSzj96B969GFYLsL+22OwvbslRERERERERERE1Ct69JthB/siLH+Pi4iIiIiIiIiIaDA7BQ/DDvZF2PCe5WOwREREREREREREg1nPPQw7qBdh+RgsERERERERERER9fTDsIN6EZaPwRIREREREREREVFYDz0MO6gXYfkYLBEREREREREREUkPPwxrO+kd+4v8/Pyjf5iaOM8UUxcYhqFDf7BDh1aLF7+GAXavYcH73Az5UQdYCrY2ErvVjrrixffEhCE6TJhyCSw+tOENHQY72nTYaYBtEBF/0yEdmoFmHVotVtihprUBdNiBzxOX0anDyQu/qsNA6iTYYc/7T+lwuAt9cCIZt39Fh0/bH9Xhhr1RsIPltSodJnWAz+7M+RfCDmnX/UCHL25uh8V7V/1dhzGdPh2W7/sF7DDskQM69GWdAYutbeDTv+LWfB0umTQUdmi668c6TItN06HDlgE7eOtKdRjw1cJiA52NMIx0fqIRRZq8jTr0l2+CHVwjZ+rQPj4TFie136BDdwC8ZVc0Pr/2HgaDVWj1FbA4Owns+XOv/b0OPelJsMP2VTt0WLHmbR2abdtgh5AJhmJ/O/5AQ6WLdWhD449pCeEO7gQdVuzfDrahEww+ImLxHtFhsB2cGiJijQVXn0BrhQ7Nanz8WGPAodIZwJ++3X8YbUOuDtPMctghp3aaDidcCgbtmVFPww6fbC/T4dzx+N2Z6OoT11qnwyFN+JBYe6hahze/CfbwylpwconItJZ9Ogza8acPr87BUFCHka75IfQf4Kwhkm4VE9EgBG+RIoMzpYEMzgNFxALvfVCttx3MA0UkWAcuSaYzHW+GF9wymAIuKN0S4dPHbxmmET991DhgglsqM4CPwBCa3ZmWFh06XDGwQ/rQMTo8Uh9hjoEuuCa60w+F8LKA3QZu9wJ+MHWRCKsQhgHuAVvKdsEO3uS5OvTHgLdsawdzLRGJ9oCJfdCBb1q96GPqOAym67FDnLBDsL5Gh1E2cB5ZSvEsLq4FdBhdOwcWN5pgbhYXBHPUGD/ew+vXp+owaeg8WLy5/aAOh8b8A5TWgmNYRIJlsTq07QezXEdgP+wwOtehQ48f3PiIiN/n1uFbr1Xq8Jn5+D7CkpgIQrMeFuMBoQOMjdX1eECwNLygQ0cQjIFRUWBPikggFI237V8Pw4YXD0+KwfskLB+DJSIiIiIiIiIiorC8nGuO/uGkPww7SBdhwyvZ4T1LREREREREREREJD3w+OYgXYTlY7BERERERERERER0jPAjm/w6ghPFx2CJiIiIiIiIiIjoM5zchzgH4yIsH4MlIiIiIiIiIiIiqCcehh10i7BFRUW9vQlERERERERERETU153ERzkH3SJs+KfN+F0EREREREREREREpJ30h2FtJ6VLf1FUVBRewA60HDr6B4sFr0SbpnmcbYP+VpgbBuhssTojtAEvZ5ohHdosBvz7Dmcs6GCx69CFG0jC5At16PUMg8VeWwaKj+go0OmFHcxguw6taKfZHB7cwQHesr+9GhanJ47WYa1k6rDyYBPsYJOADqdf+SVY/F+7N+iw6aEOHcas3Ak7TMyN1+Gkr92nw+2HYQP58I0PdOjaVwqLk1KG6NBfe0iH9ijwLkTEFpOoQ6dvCywePvcLOtxc6dbh4TefhR2ybM069CQM12HIEg07tLfWg9RXC4sNI8Jpo8DTVkTEBB18fnAWdB5YCRvUP71ch+X7H4DF3x47XYfWKUN1ODrjfdhh+9pxOkyxgFBEzv7CJB1mn5uswxeq22CH+hXgYwo1gdHDFWiBHeAYGAh2wmIzBPZ8tBsMNTEuPP60eMER6K9aBTbM5sDbgIZ9V4ThrjME9pstGowSnS0VsEOwEew3qx+8CxGxOKJ06G/YpUNfCIyiIpK7f6sOP7SAD/SZV9bCDr6WBB1aN+IhpfYgOPfFBEdg8FAJ7CBrFuls+g4wYE5z7IcNgnZwsEUaOvxBPyiW4x1nRLpTSkT0n8BLUqRBCd7jRJz/DAjwtjDyOIxu66xgltvcgifxRnNlN17Qcryf3XHf3Ubs0HPgy4VCQVgc9KE5PGJWgfmeiKTOukCHVfvG4G2rBROVEPqUrRY85bM6wYRN0F2ARFiFaPY26DCw8U3YIRALZi/WEGibmDMbdohKytJhU1MjfjkDrCkFm/aB0AAzSRExasDcNXHSOTrMnDoTdtizAtx673wB31KVW+bocOMhMA+UCPcRjpwpOrR78AkWEwIT2mVtZ+ow3r4Edmi0gg22OcE4HBeKcOOTAM4vWysYlESkfiPYmXYH6DDXhof9D7eha4TDBYsNCzjNTXS7Fwrgu8hoD7gZyZ4Clrb8eESRtnZwh3Jk87H/H/qT9TDs4HoSNvwY7LSE+b27JURERERERERERNRnTU9eePQPJ+Vh2EG0CNv1MVgiIiIiIiIiIiKi/+ikrCgOokVYPgZLRERERERERERE3VVUdOzXFHTXIFqE5WOwREREREREREREdJzC30gQfrjzcxssi7Dh727gY7BERERERERERER0/IqLi0/wYdjBsgjLx2CJiP6PvfsOzPOsz8X/fda7tV5tWZL3imeGswMkAUIbEtogOQ0tNL+WrkOhQBdtz6Glp6e0h9IeejqAUzY0RTIQSEKWE7Kc5SzvvWTJlqytV+9+xu8PF+Hmez1BSuxYMtfnnziXb3+ffd/3c/v1KyIiIiIiIiKakbP1YdifiUVYfgyWiIiIiIiIiIiIXrc3+BFP+2ztx6zS2tp65v/29fW9ZnMjJA9AU8OaZsswponPuYdqOBZYJY9FK2GFcrQWhIUJHdruOKyQSsZ1uOf4CdjYGNyG0oLOItEqWCGaatXh+Phx0NQrwgpBfhSkPm58cvCADo3H/xHsWNOlsMJb7/htHT5/ErYV+db9OmtZtl6HtW15WCB+0fU6vPcL/65DO9MPK9RX1+kwiMdg42LvSzqMlAZ0aBR7YYVU/VKwuRjYBxE5sm+vDrOTW3XYamRhhfS8ZSBFT4fn4ifUsKKgQAQ/X6YBOopSGeybEcygQ4BsB/cSlgl2uPDIJ2HjZVtAh1Dzf/9Dh9v2PI839+QSHaZXL4aN178HXOjPjILe48g/PwQrRPZndNhcPoX2DJ8feN6jDjhpIpKqADs876JrdJhsXgArHNv5gg5bTLAX0do2WGHwIKgQcSKwcTEAo4+XmAdCHxYQLwuGQjsCun0R8S3UURiToGXICLhry1M6PLAFbK5Q+kW8D9XgQvvZHGwcGwE9f+QEGFAWlNOwQmDu02EpAcqG3VS+B4bsIMDXwwidexARnUNhcxTYKYW9tsTRdCtfBO8Xnu9Of3OzGdzdIOR0xhwwhuY9bwbbQx+UCjtpAZp5wj0Lf+lFzQ2wE7bpwApl9LIWusNhezFtsDI8isoEfg+Fu+Ytvgm2NU+BtyTxSqBqyCNjO2D+k6xeABsXM2DCBk9lNOSK1jY16HBsEEzL5y1eAytULlipw+yLYOIqIqVDYMpnGGUdFkfAXEtExE7orLALvGdNNn8YFuj3QP8TbDsEG5dHwNys3luuw0RNI67wEfAecWkLuCVEpCL5uA7dU+ByDPbht4CgeViHzlVgySL7zCCskPDAvZLbeQw2vv+uJ3T4zAnUg9XhKXHwcbC5/KdSsHEKve6ZJuh/wgYUvzCmw3IR3D/eMvyMD/aCNZ18HbipVta9c8/ePxKRzs7O1/2lBBfmIixcdd3QfoebwYtHREREREREREREROfIz8TXERARERERERERERG9EW/kx3NdmIuwwY+9ZuYpWQAAIABJREFUwW/MJSIiIiIiIiIiop9xG9rvOP2L173YeGEuwk6ZOi9TZ4qIiIiIiIiIiIjodXjdP57rAl+EfYM/toyIiIiIiIiIiIho6iOenZ2dr+OPX8iLsFPf0cCPwRIREREREREREdH5ciEvwvILYYmIiIiIiIiIiOgsen0/nssIguBc7M1sYBjG6V9cnL52Os2mV9PSYSD4HJqwsYEXvm20G2aiSYflUhZWcPMDOmyuma/D5TfcDivsc9bq8NTXfx02jlREUQyOIt6wClbIlUHjwsmnwbZiVbCCBL7OKpNp2HYyO6LDimhCh2s7/wBWONJ8qQ53fe87sHG070UdJuvadGgIOAoRcUtFHToJcCpqmtphheHeQzosDO2Hja0gB0LD1WE0ji9H0fV06JcmYWPDiuswXtUMWoadHzOlw0S6FeyDFYMV/JGDOkzZJdh45NQxsA+TfTosljKwQoBuV8u0ddjWshpWENR7jGQnYNtsDuSTLng6hiKgnxGRKsfR4f/+xw/Bxlfc+GUdLrzzuA4X3H8KVkilwKmwzbwOA78MK0SjlTpsbl0BG7cuB/1S45Vv0eGOcg2sMP7cdh22NYCTlo9UwwrD+/boMBKAQxaR8gBonM+B5yso4lvCKo3rMJMBA4eIlFywG74PnvEwpg9uVwOFEoT8fTAcWg084AYoD0y0wyauYFvg2rk+6APDJk4zmEwQEZ0nYa8tBppjxCIVsHFFE5ioZEbATCmf6Q3ZEdBlzuZeFJ43eNJEZM2qG3S4c89TOvS9QsgG3+j5CXnDn8GLfzyS1GFtw3LYuLf3JR0ab/iSWhaYHIqI64HRGW4sYuO3ADsFXjrGiuDFUEQieTAHM9DEI+qAFxwRqUovBGUblsHGmbFBHdropaOtHVeYjIG5vde8Xof1lfgevuitYJ6cHcGrEM9suk+HJ3aAUELm8D6ao+LPC7ozuKnsxjUwdwvgQMwYmPBXNuMbvvpdv6TD7TeBPlBEMiPf0OH4fvBiGDm+BFaoyoL7ZyLao8N39YPFHxF5/xfBC9E7X3wWNv7U9b+ow+gasLRV+i3wPi4iscvrdPiZP/gIbLxw9ws6NItg7PB9sDwiIhZadhO02hAUcZcboOUCI6R/9q3/7H9eGdkiIh0dHTNdh71gPwk79e0Mr70CS0RERERERERERDR9r+PHUF2wi7BEREREREREREREZ9H69DWnf8FPwv6n17EgTURERERERERERPRTzfSHUV2Yi7D8LgIiIiIiIiIiIiI6R2b6AdALcxGWiIiIiIiIiIiI6Kyb+kaCqY+BTscFuAjb3d3N7yIgIiIiIiIiIiKiWeICXISd+kYGfhcBERERERERERERnV2nPwy7adOm6f94Lvtc7s/5MfUx2ECCV/2WZUZ0e8vCJ8EwLB36watrioihNnSa7SR1iJuKiF/WmePldLhw/gpYoKLxnTqM1bfq8BVrNaxw9MF/12GNDXZMRMouOBTbjutwYvQkrOAXBnUYr5qvQ8fNwgqVS27QYdYFF05EooPbddi4YLkOA9+DFXrvuVuHNfl+2Lhx5Vodjg4OgM2JASv4fl6HC2vATTXYug5WyGx7SoexMjjtImI6MRBajg5dHxYQCzWOx1OwcTRVq8MgUa/D0ZFRWME7+ZAO060fBmVjVbBC5bxrdDju4x1uce7T4chEgw6LR5+EFRwL9D+LFm7QYeSyjbDCgd2HdOhPboaNF9XU6XB4Alz9ZOYArLDhnf+fDp+Zh8/PBz71eR1W7P4tECbBUyAillnQYeCDfiYojcMKbSvABW288mbYeMRM6/DFrWNgx8bAaReRqy8GVz+aAFf55b2TsIKgOzOxYA1sa6y4TIepE4dBUxMPaiMnQVfs7X8Uby7bA9LiMGhphPRgJugpDBTOSNjmImj00dMAESm54E4TkbJXAptD/TPeAyKiuSwIQP9sh/R3vlOhQ7N2PQjzYGAVEd9FI2NID49ev85CVwxfymZUdnHjMpgnr79Th/5J8EplDD0BKxgm2JEAnogQ+EBCzzCovHI+eJdZ+PO3wwon/wVMSLwyvvqmAT8HBvZtQcsqWOFwL3it89E97PkurFBtgkNOLMZzsOHdR3UYsUCFeBK8y4hIRTO4VaKteHO52IQOm6sv1aG59npY4cjX/kaHVZmiDi+7+S2wQt0qMJmsXfQCbPyP+YU6bDq4WIeOZGAFK47OG7pPgsljsELjwqt0mLHAXF1EskfB7LdtBTiZg3nwgiwiPegMRx8Aj4yI+K036rBqTZMOM6vwI5N9BryMxJ4FSxbbex6EFU58DzxKfRvBy7uI/Nqt4M784gPgoXvri3jhpXIxyP/2hrtg48zx9+qwoRbcP4Xj+LU3MMDDCEeZSBRf0EiiWoclF/cebgGvTnR1dU3zSwkutE/CTi0/T307AxEREREREREREdFZN/3vRL3QFmGnvouAiIiIiIiIiIiI6Fy4pO4//332NL+R4EJbhOWP5CIiIiIiIiIiIqI3xzQ/EnpBLcLyuwiIiIiIiIiIiIjoTTPNj4ReUIuw/C4CIiIiIiIiIiIimm0uqEVYIiIiIiIiIiIiojfBhvY7Tv+is7Pzpza+oBZhT3/6d+r4iYiIiIiIiIiIiM47+3zvwFlz5pKzaeDF5Ui0QoeBncAVvZLOLNPRYdTGp9GP1eqwNhmHjdNtS3XoVKRB2cveBSu8vPl5HWafflmHpaF78T64h8DmzAA2NsTQYYDOj5/vhxVqKup1mLPANcoWx2GF5NgRsGPxNti4du0tOrzq3Zfo8J+X4kOe+N6PdHjZ6sWwcWrd23TYf+/XdZiuA+dBRCoXLtFhvnaZDo/d9wVYoSYBHgTfAjeViAQlcJIjcXA57Ai+h5Ppdh26dgo2zmWzOpwcGtGhPwFuSxFx0G5kB8EtkViMvyR6vAzOT/PSRth46JI/1mHP334CbE48WCFVAe7MnnFwHvL3/T9Yoaq6Roe3fPSPcOPWJh3e/x9P6XD0ob+GFXY8v1mHg7cPwMb18z6tw9YNa3RYehl3mN7gSzoMSn06TFeDO01EatvB02GXMrDx5LFjOpzXukKHq27eACs8s2GHDp9+ap8O0/eCjlFEFkRiOrQt0LWKSHrdRTocmliow/Hj+JHJD4/p0Mjj3tVAI6BpRnTo+6CliBgGOhDYueIjliAArWsSYGAVkXIcPLn5LOhSxMU7LOKDfcB7PCvAUXg2CD9lM7j8s/TYiOa+sK4Ddnf5Ug42LvW9CNIqMIZalWA2KyLByDYU4zc4A/XPcJSBA0eYkN4nbEwC2WQezzEGNj+kw7IPjg4Mqz/ej+nuRMi1g+fn0qVXwgrpajC2tt50sw6PXA3mWiKSuec2HSYPfg02tqNRsA8JMMtdvfG3YYWer/yzDsvDO8G2HPzakqhp0eFggF9bJFKNQnS7RqtggWQVOLqhAr7+k+NgbpaJJHU4uPM43lzLxTpsXg5WG8oLlsMKR4fB/WMP/yZsPDz2NlD54nfosP5H4OVCRGLeUbC5CjDht2P4TXY8V9RhoXAANo7Ug/PTuwO86VsNoKWIeGKBfduDvxuzfgBM12uWflKHz2/G3yia+MGzOoxeCxY3gl3gKESkeAi8oTwX4DeUpuvBHbi4CBbNTrTgTumKF8HrcOexrbDxd/ybdGhLnQ4TwQwmjXBJ0LRA5yMiTgIsyFTH8Trhyb7dMD9tOl8Le0F9EpaIiIiIiIiIiIjozTH1L/K7u7tfu+WFswjL7yIgIiIiIiIiIiKiN19XF/5M9JQLZBF2Ol9/S0RERERERERERPTmu0AWYYmIiIiIiIiIiIjeZKf/Xf5P/VrYC2QRdjpff0tERERERERERER0Lrz218JeCIuwU0fIL4QlIiIiIiIiIiKiN99rfy3shbAI+1O/+JaIiIiIiIiIiIjo3Hntf6lvv2n7ce5MHWF58vjpXzh2FLb0TQeEXgk2Np0kSN2CzlKNy3EFE6xxz7vhdtj4hZ39Oiw+AT7G7D+/F1Zw/KwOo8Mv6DAWSeEKFghvffv7YOOhkVEdnsiC81My8eUIAhBO9uzQ4ZKF62CFqrXv0OHxR74EG9csB5fpnsEGHY5+7guwQlvS02GkuhE2PtYLzo9VPR80TVbACjkjrsOe7dtAAQfsmIg4EVDBsGtgYzNZpcNICpwfz8b3z1AB3PClSXBji4ifB+fHKPSBfTCKsELUNHRYHDmsQzeKr1G0slaHI2P1sHHxwHYdphN5HZqVV8IKEyP7dRhkx3UY8XOwwlXv+2sdRm9rgo3/1tmsw+IXXB3WBeBMikhu4pgOG5rx5oLKy3U42t+jQw/1EiKSLIJbQgR0Exe1L4EVrv7obTr8nyeHYePCpx/SYeUQeL727z8KK4x/Hlz9y5vW6HDZFXioNSqrdXjkRdzD7x8DD8Lo7hd16E+OwQrO8EEdRjxwB4qI74GjE/F1ZBj4b3MD2MWjCwozEUlFK3VYqsRXPzcIzlvgTugwHknACo4FZgjN6Xk67B89ASu4Pni+csVJ2Li+slmHNRVpHR4bOAQrFMrgGgVhZ1PAY46f/JmAGzNC6poGeBD8AI9fIfcPhLf3xo+O6GcMeGi8AHRrIuIWwNhqll9GVSN4ayboEAK/DNta6A0uQDscBPi1Dg9VM+hncJ8yPHkKtvUO3K3DiIAXosAI2wcw4Ib18CY6umVta3U4/4N/CivsHAcj455dYNpwMI4n9mNouo5fGETg2Wypb9XhSMNS+OczK8GUL/7EHh06IWPSUA7cbNmBp2BjowRmVnVVYIcbFy6DFZzWi8Dm9uHphFkGs5fhEfAwBmM7YQU/EtPhqf1glntwGNxpIuIPgjl8T/GTsHEqAFOdaGZIhxE0+RERMzuiQyMPbrZyyLShVAAnTQzQdYiIO34EtEXvX76B1zEk06szswyOQkT8wQEdDt/1lzqsMPF7VpUJulzvmbt0GBX84rP3wft1+P3Rj8LGL779/+jwr679NR3uzsP3BXmqDO7tf7cXwMbVSTD79TPgDcVAY4GIeAF4uzRQP1Mo4hefK5vBCoD/1l+FjXv/6eNgH368FLk+fe0rI7gnmXIhfBKWiIiIiIiIiIiI6Pzq7OwM+605vwg7dWzr09ee3z0hIiIiIiIiIiIi0ub8IiwRERERERERERHRefcaXws75xdhX/srb4mIiIiIiIiIiIjOqal/o9/dDX7Ck1wAi7BEREREREREREREs0FXVxfM5/Yi7NTSMr8QloiIiIiIiIiIiGanub0IG7a0TERERERERERERPQmC/vqVPtN3o9zJBKpPPN/Pa+I23llEBoWbGugIunmFTo0q+bDCkN9h3R4cvNTsHF5cJ8OkxFXh41tNbBCy4L1OhzYm9ChUxiDFa778O/rsHcF3tzeb4/r0Di+G2wuFocVxkdAhWo30OHS99wBK7it4MwfL9bCxq88f7cOi7sGdNjo5mGFaEUd2NzhHti44B7VYcwAd2ChEu/w8FFQ2Tz1ig5rm+fBCkGkSoe5DDjtIhK4BR1mR0Z0aPlHYQUX3VdeCT+MZgA2V90Ini+7qh1WyJzaD/ZhApw0J5KGFRa3XqLDBW9vg437fHCSW+xbdFjT9xKsIAtbdHay74gO5zXhCxo5dVCH33nyMth48MlRHdY7zTq0GnAFd+g5HRaGQU8lIt4EuK9MH/SuUfcUrCCGp7MV81bp8JKb3wULPHwU9B7j//BD2Lji8FYdBlG0w4lqWOHWX/lNULYjpcO2DAhF5IleX4e5H4KBQ0RM39GhdXKPDp18P6wQjSV1mGpaCRsbmV4dZnPgpiqUMrAC1JoGnTa4bCIiMpQZAjs2Ch58EVnQ0KrD2lSlDs020M+ISDGI6LDcDAZW46l/hxUWNjXqcHkFuHAiEr30ah0eGQGN93/1z2AFETBU2SbenBeA6USAT33YBQEMwwD7YEVh40gUXI5sdnD6leGuBSE7PIPDEDEEbY7oZwl+BkIfJDB++e7k9AsLfMbDNhaAGQKsjLuOMLBtSM8IuR7oWkUkkAmUgu2ZJv5ElD+T3QhQ4/4hMCUe+hoev4654JUhfnSzDr2nVsMK6Sh43WtsB2OoiEyOHNNhpljS4anv4iWM+AhoHIvHQNkCfvExB3fp0Ajw5Yja4AzXrrtJh+WWNbDCsZPg6cjH8BtKwe3T4QILvGc1t4e8pw+Dy5HNZEHTw1tghcqL3qHD+uMHYOPiUfCGkqhboEMLvRqISLQaNI6hGXhmGLw6iUg5g1/JMfTI+Ki/M8fBTFtExAdvsgHqGEXEjoI1BG8CVK51wKu3iIgFuhqrCObqTrweFtgzAqbro//xh7Bx43fB6/AnV/29Dicbj8IKcPBwsmAeKCK1114H0i3oTW0MzzBDLgfYh/qKJlig6jrwUv/EMJ5UF6ILdZjw/ssTekntDS8NPyoinZ2d+pth5/YnYflTuYiIiIiIiIiIiGiWm9uLsKdd3vTz53sXiIiIiIiIiIiIiLA5vAirP9ZLREREREREREREdB7Bf7s/hxdh+VO5iIiIiIiIiIiIaJa4pPaGsN+aw4uwRERERERERERERLNNZ2fnq5I5vAjLn8pFREREREREREREs98cXoQ9jT+Vi4iIiIiIiIiIiGYz+3zvwOs09Zle1yvo37UMC/4p0zBAaMdg44pUtQ6d+hU6HO4/Diu4E0fAvpXGYONUdb0OF190pQ6veP+7YYVnCuDo+nPzdDgvvw9WePZUhQ6fO3UMNvaP9eow2denw1gkAitYfkmHVU3gDI/5SVjhiaq8DidPHIKNE0MHdBhPg30IAhCKSKHo6dDzwWkXEfFBY1cmdTheLMICxtAuHSYrEmAf4uAqi8joyYOgbHEQb84AfyVjFk/qcH3HH8MKL977VZCOb4ONo3FwswVWVIf5YhlWcCrAUddUVukwXQceLhGZf+l6HZpNeHM1i8BTk75mlQ7bJ66HFeI5R4f5g+M6rGithBW++ukHdNjzubtg44ZMRoctl14O9mHeNbCCOX5Yh14p5P4pgp4NDjBByBOzaj64HDf92Sd1eLixDla498kHdWgeA0chIvEy6MGMYlaHK+rXwQpX3tKkwyPNu3U4vugbsMID+fk6vPbmD8LG/XvQ4xy4OrRLeEhqSi/U4YLrN8LGp3oHdDj+9LfBPhTBnSYibXULdLjytg/rcPfLoK8TkWD7d3S44opfwJu7+kYdFgR0KfuPgYFDRDI7H9NhLAJuieXvfD+ssOzqJTqMgDFNROSpl8HzsfsouH8CA3RrIpJMggqeiweUAD2hIoGOTDQWiEiAGsPMccA4JSKSAI/M0hoQishkFuxwvgjG0LKLh2wvAKNwKez8BOhIZgF82kUMCelJid4UcNJooPcv38fTKkEPnYHe1MIEgf8GK+CyM/mdIORJxE8o6lxn1PmEPfiwxHh+FKS78M+1Thjgtdf0R3SYLOD3rIWXf0CHtdf8CWy8s+ufdWi0LdZhXXMbrLD4rct0WOVu0OH9n/sIrFB2cygO6XIt8Crau/MpHU72gqUJESlOgPlz2QxZhXDBHOy2T4CTufdSPAfrv+R/6bBmwaWgacjShHtkiw6dJJi4ikgkAgbiOJiCSbmMD9lAHYVvg7dFuwpcehHxCuB2DdBKkYgEaP5soIcx8EPe01F3B9eaRCTw0XQ9Xgtahuyw54L5j+OA29KOxGGF3OSwDs0yOGkiEs+Cl475T2/VYSGBL0e5ZrkOnYo0bFxTW6PD8eVrdOj2PQkrWN4ESA30OIcMEbt3gBfGXAGcNBGJmeDtIAhCBjv0L/jn/CdhiYiIiIiIiIiIiGaDDe13nP5Fd/d/+QswLsISERERERERERERnU1dXV1n/u9cXYTlT+UiIiIiIiIiIiKiOWGuLsISERERERERERERzU6v+gjpnFyEnfqpXFNfskBEREREREREREQ0O83JRVgiIiIiIiIiIiKiuYKLsERERERERERERERn2dS/5hcR+zzux1nhmOgQ7MT0K0QqmmBuRWM6NCsbdVhZzMIKZs21OoyGnPJYHOzzgkXNOnzSdmGFxx59RoeJ4ZwOvbIDKwz/2+d1WE5UwsZ2Ma9DUzI6dA281u+bhg4HQAEZzlqwwtDD4OjsA3tg44iM6TAoVYAdm+yFFQwjQCE4ChHBaSQJNjfwHK5Q6NGhnVyjw/ET+2CFYGQ72rEybmyBG35N20IdltdfAitYW54FjYfBPohI2S2BcOigDp2KNlihpnW1DpddcbkOe/smYIW+AbAPbZYPG1+dBI3f4oGjM80BWKGUOq7DrctadLhHnocVnnNvBZs7eQQ2bkmDx9wYPalDvzgJKxgWqJCoAnegiPiFYR0GPuisIn4RVrju/XfqsGdhjQ6/+e1tsIJ5CHQfqYo0bCygA5PAA+m6lRfBAicEHN3nBk7osPTcIKzQcDF46J5fvxM2Tm4HA00sXqfDdP2NsMKKS1foMDdvGWzcMwnOW9kFXXEihseIhevfokN3wSodDu7HnZKZBKNztGkJbHx0Mq7Dk+Uo2FwPHiPieXBB3WPgZhuuugZWOHgS9B7bL38ZNt5/AA1Jz4DOvL2yHlawLPB0uBN4/BIB45eJRmfTioQUAEfnmKCXsOHETKSuAXR37T/3Adh46333g13Ioh4s2w8reMVRUMHF/XOAHmcjZCQ/RwJ0jcL2ATaG3uSjmJEZHTK9DiF3yXRvHnmtyzGDIrhyyNtB6I5Mbx+C4I3u2AzPzxstHL4xdHQz2hpq7Vh4lz1/BDR2wHBQUwleTkWkub1Vh3sGPdjYrAZDeZAAU5p57SAUkfaNYAQ83gRenXJ3/zKsED34dR0aNj4/+RJ45cydeEmHZt8uWMG0wYQkYuEli6XrwTRj6Vowz1k7AVYbROSfnJ/XoX0CzH8q0g2wQqZ/tw7LLn7lrEiC+WFQBO9f8TiY+opIPgPOsDsBhmzDwdNOp2qRDsvjR2Fj8Qs6C3wwHQ2CkHvYQFMdNFMKy8s59Opkp0IqgPfQIECnPaRbisardZiqBhMzEbEFHLXhgNu1HOCevGyD1z0vGMf7dmyvDvtz4MUnboHnKAwcZTJ5vA/lHWDaGWl9J2wcX/kuUHnHEGy8of2OrT13vSqck5+EfdX32hIRERERERERERHNWnNyEZaIiIiIiIiIiIhorpjDi7Ab2u8437tAREREREREREREBJz5r/nn3iJsd3f3+d4FIiIiIiIiIiIioumae4uwXV1d53sXiIiIiIiIiIiIiKZr7i3CEhEREREREREREc1a+mtUuQhLREREREREREREdPZ1dnae/oV9fvfjdTjzG21FxDVjoFGA/2zE8HVox6pg48rKuA7j89p06DY0wwpeuazDVcvw5qrrK3TYN1DU4ZP/8hisUH4S5FZtgw7zBtgxEYlnj+owNp6DjZ1IFITJtA5dF99mpdyADs38CR1mT+2HFZonjujQt/HRBSb4Kwd/ooDaerACFE81wtwtgfPmodvVyB+EFWLRlA7L5bwO/YmtsELgTYLN2eDCiYhfAjdb2QUns9QLyorI6ve+T4cvfOYh2Nj1xnUYLQzq0LPQMy5i5EHjgVSrDl/efTessGESnOGq6ibYeKmxW4fOPnB0xkHQUkSOvHxKhy21jg7/7UQvrDC4t0aHC01QQURqW5frMOOVdBgpj8IKnunqsL4W3/BDIyAs5sZ0uGbxSlhh/i9cosNPvHSPDhv+6SuwQnrBdTq0BByFiAg66oZq0Jk7V74FFrh3CzjzmbtfBmWPrIYV5j95qQ63PAwqiIj0gyEp5YMOYf7ydbBAsGKDDp96AG8uMwZu13QFGFAa0gtghWIlGC53bAOPbS47ASvUN67R4eAp0HWISP+eH4HKLpgNREN6+GhlrQ4LY2BIOvTkD2CF8V2VOizbvw4bO7sf1mFyBGyubjF4lkVkYhg0FmsINracpA5TDhgOAgvcaSJiOCCPREHZPHrwRSTugMnAtgyeFA1MgsuU9MAOWyaYPolIYIIKhoA7UEKnjedEMJOtmWjqIiIiho4s09Jh2QXd/rkTfmzgdywD7LAfgLm6hJw3wwDn4fTvgAohld+wsH14Y01naPr3lRGyF4YBbrawsiY687CpFTJLgber64cM2fiCzmC6Pn3h5wfkYbfrG2eboMOE10hCzlsdGrKrasA8WURG0YkfO7VHh1ZIpzReBDs8tv1B2LiltUWH5QiYlo+OgdcTEWnqBcPB+xq/rsO/XwhmIyJy0V70fmrP6KYCt7xvwFdLaUyBd2Qz5ILe+ivv1uHSpsd1uOAj+KVD6jrA5g49p0MvCcZxETFdMN2KePgt27bAfdWUjoCW89bCCge2oJe1MtgHO8C3hJNCN9VED2wMeh+RAA1JsKcSEcsGk6KwXtiKVeuwNAlm2kEZLI+IiGmBG97zwFuA44es89TM06Fdswg2LmfBW1IkCWa5qQQIRaQUgPOWGcFz1HIOXGjr8C4dOiHnJzDAuYfPlxvgq5QbPazDmsrtsHF+3QdAenw9CDPgKGTufhJWf6aXiIiIiIiIiIiIaBaaq4uwRERERERERERERHMCF2GJiIiIiIiIiIiIzr6pL1adY4uwU99lS0RERERERERERDQnzLFFWCIiIiIiIiIiIqK5hYuwREREREREREREROcQF2GJiIiIiIiIiIiIzqYN7Xec/sXpr1e1z+vOzNjUd9lOCTxfNwvcUfjHk7WLdFjb2AIbp1sX6PDoGNicG62EFa5bBU5v86/CtrI5e0qHW79Q1mFp/0FYod4c0KEzvE+HRrIVVghyR0AY5GFjw5kP9m3gJVDBwxVEAh35Bgit3Dj881Y8gqo6sLHnldC+ZXVom7hCsnqBDv0KEIpI+dQe0HjsgA5N04AV4om0Dt26tTo0ytthBTNX1GEsUQ8bl3ODOszlJ3X4novAbSkiX2pzdej9lQcbx2KWDpPpxToc6d8FK+QiDF9RAAAgAElEQVTdER3u21Srw8o9X4EVaq/+rA6LJ+OwcY1/tw5v/+o9Ovzh6PWwgsRX6MwaP65Dr7QBFlhw7JgOE1XgtItIuu6tYHN2gw7Hm5bACo4Nno5l194AG5/83jd06OdBV3zVNVfBCo82bdFh9qvP6DBlZWAFS8DmyoUJ2FgMcGeuW75eh89WgIFDRF74u/+jw4VHntXhz99xJ6zw8GCTDp094CqLiImu87z6Ch2uXNcOK/zHDjBGTD7TBRvXJQs6XH79+0GF4SFY4cgJ0POPn3pIhxXJJKxQuxhcDommYGNr9JAOEx64VaxKcNpFZKIfjIBOsVeHzfPwLbFwyQId7reisPGpAHQ1dYsv1WFecC9aRrHh4AlJxAHjWnXLMh1OjJyEFex4DdhcCsygSr3bYIX9Rw+Dxi/9CmycDMCTG6AZgotCERETzMGCAI9fhuCBGDad/m8EAdg3w8Al4NyjumoebByLgPtnLAsmS6VMH6wADxmeymmfmtdiGuBjH7aT0GGxBCYeIhJzwCEXyqCnkvCTDNvC1LHA5XB9OOCG3IEh8TlrCw7EROchik67iJgWmFSXyngO79ixkN2YVlkRMVGFHHobkpDb1TLBTRX2LPvo2hnotnRs3GlH0B2YyYG5qIhYBpjl+gHotZ2Q8xNP1oEKsKmIgd5x1r79Dh3mI2CeLCKnnn9Oh1YCdCl2FN8/bhn0rnUNYNopInayGqQp8OKzfRKcSRGxvvLqNQERGbwO3D+WDabfYTwfD7gBeu7gzVZb0QgrvPcP/kKHuQk8oV26YYEOn7v193SYP/k+WOGSPY/psBzP6dDv/xGssPKq23W46/kfwMb1jVfo8Lbf+4AOv/8cHoWjdXt1aIzv12FdQzOskAvAZNJAiz8iYrngHccrgsuRSKB7VcS1QYfg58dg43IEFIn4aBXLAy/vIuKjkdFAvUdQxC8+pYl+HeYsvCzgFUGXUjbAvtlV+MXZsEBe8vEaXTELzlvSBpszbdwheOjBNQ0wD/RRKCIlF5zhgcOPw8bmQfDSWrMGPDIhjzg/CUtERERERERERER0LnERloiIiIiIiIiIiOgc4iIsERERERERERER0Tk0Jxdhp77XloiIiIiIiIiIiGiWm5OLsERERERERERERERzBRdhiYiIiIiIiIiIiM6h/7II293d3dnZafxXnZ2d52vniIiIiIiIiIiIiOauTZs2iYg99f+dnZ2nI93OMIyurq7XXo191e92d3efpf38KQJvQofxaAVs3LJwtQ5T698GG798NKvD7HPf1GH7FTfDCgtXX67Dy09dCRv/7hcKOoz+6Nd02GolYIWEAyq4JVeHwdguWCEQD4QBCEXEmzysw2h6lQ5LY4dgBQnQvvllHRqmgffBBxX8ADeGDAM09kIOeWLkoA7NQh42DkrDIDUDuBOwwsjYMdB29DjYlqCyIhXxSlAhvQI2XrcG3JlXXrFOhwfeNg4rbPmzf9Xh2qAEG7e1rNThQByE0r8bVhieHNRhxd4v6zBw8AV98Zt/osO9pz4LG3/+yr/S4YnBDTpc9e2nYIWYeQrFUR0FJrp5RCrSSR1evPoq2PhQcokODz/7iA5rFq2FFS79wO/q8IsNj8LGlV8CD2NaQC9asR5dZZGv/88DOly3+SXQtAJf0PIAOPNODb7hnVSjDp/bD/rGyd+6EVZoj4Dnbs0Nd4IdEwdW6H+wX4eRF3Ow8aoUKPL+v/l1Hf7AwE/osc+BJ3RlazNsfOmtt+vwxDHw0GUi82CF3CgYIypq0jq0I+ApEJGSldLhoAMqiEgm84oOYwVwhsvjvbBCzB/T4YK2+TqsWnUprNDTC85P3/cfh40jRTDYldKtOhza+zysEB8Hw4Htj8LGVY2LdVhufasOx4YehhWc0ZMgLUZ05rtFWMHP9unQdvAYYRmoMhqdg8DHm0ONDWMG/wLMEDA6hw24sLFpgs1FHTyLS1eCTumit+O5d6SmQYeb774X7NgkeApE0O6KCDy6IOSQ0ezFDDnDiQh4nMvRGh1GPHxLrF39Nh3u2Imfr4ILpsTwGkVs3P801INHZnQU9B6FMu60PR/ermH3z3RTI+RfMcIzHI+BF6KqxqWwwlgenDQnE3L/xMG1M9D9YztxWMF1wBzV8vD4HrEssG826CXgQyciXnFSh7EI2LdodQuskKhv12HvdtxhVlbU6TCbHdFhbW0brFCqAvl4Bj8dy5rB/DD2tlt0+MwOPEZkitt0mK4A/Uxi/nJYYbBcpcPCyB7YeDKPno4smoOlmmCFpuuX6fDf7s3oMHotmA+LSHAPCKNODDYuTrtLuf32O2GFeb9RrcNjo+CmEpFDFWB949Ed94OmN/wmrODuB49MKgau0c2//GFYYee863XobbkPNn535zt1WL5prw6f+MYQrFDVAtYQqtEYse4m/Nqy7xA4acNJ/DgbaMHBzKFpeUUtrOBPgs1VNeAndHgATNgq68Ao4+XwO6ATAbeKWwDdmh0yuheLYIeLPT/CraPgdk06YOywUvj8DLrgURobfgFvzQP9koVG58C0dSgijgUa+2hC4pXBSZOQx9my8OYiMTDgjh3erEPTAuOUTC3Chq3ATtm4cWPYOmx3d3dXV9er/nhnZ+fGjRvP7qdo+ZlcIiIiIiIiIiIimnNMEenu7p5aQu3o6Ojq6gp+rKOjY6ppV1cXLLFx48bTf7zjx0Rk06ZNGzduPOe7T0RERERERERERDS7mfJfV1dPfy3smf879bubNm3Sn0U9nXR0dARB0P1jU6u3/OwqERERERERERER/Ywzz/wYLPysa2dn55mfh32V039Wf+j1dPLaX3FAREREREREREREdMEzz1x4Dfvg6tQaa9iiatgnZImIiIiIiIiIiIh+xv3kR4a9xsddz1xR5eoqERERERERERER0fSZ0/zGgNdYohWR7u7un5oQERERERERERER/azp7u6232CJjo6OTZs2bdy4saura+pDst3d3ae/weC1l27PCjveoMNoJAIbD5tNOtx+/yOwsZsb0WF1uk6HA9sfhRX+4oNP6jB+HOyDiFQvfbsOG5dv0KEZi8EKkz21OnT2o0X2YBRWgIyw3LB0WBzZC7YWeCE1Ah1ZJrgnjZC9cJy4DvPFCdgYFrEM9AgYJghFXK+oQz9/EjauSDXqMGGByoloAlboGTqiQ893dRh2fgrlvA4vroJtpeZDH9bht/eBlls+8FlYYdlmcPWT6ShsfCq6UIe5veh2NX1YAR51YIGbzTIdWKFsgH27JfIybNz8O2M6fH8GXA4zAm5sESk74HIY6NJ97Lf+BFawlyzW4cAkbCtb/+ZDOoy4ZR2OnXgWVnjk/kM6XOKCB19EvGhBhx/94B/qsHEjaCkiuXsO69C3wQX1PHAUImKjC+34Wdg4Nf9aHWbBIy4JeQFWmH8lGOBqlq3S4ZOb7oIVKrakQbgCdPsi8vabl+jwL2rAvh38xrdghdoMGDtWveVq2NipA4PdSA6E5UM/wJurBM9XOZfR4eCJXlhh6OguUMHH3V0i3aLDiFWtw5oErrD4snfrMIsqPH1sGFYobH1Kh06xHzaOO2A4yEXn6TAx9gqsYARgsPMD0CmJyKkT4EHwT4Bn3PBwn+InwNUPBrfqsK59PaxQyiZBGOAupTQ5CDZXBvdP0sFT2VIJHHLJRQ+5SCICB2Jwq2RD5himBWaeNal6HSYbwLMsIi3L1ujwsl9+F2x8dw5c6Ip7QFdjppfDCkEWzF5MdP8UyjlYwTTBM56M40lGumGRDrMT4Crf8SE8AlbecJ0O2/4NPDIi8sDD4KdcFNGkqK19HawQW/ceHUYPPaPDI3vBbF9EJEDnLSjBtnBSbZkgTEUrYIV1V92sw6pm0DG66TZY4dlHwdHZiWbY2M+DbjCZbtXh5CQehQ0Bs7tUwwrYGM6WomimXTTwW5JRBD2blQIns7oZH3Kp/WIdmhncg/l183UY9ILOPNOAn9CRozvQTuA3OGPlNTp88DOf02E5jfufpnbwhDpGuw6PnDwOK5QyPwQV6lfCxoWel3Root4jOAIGVhG5+zB4B1zaDiZm133pj2GF734aDFW3vAWcSRH5wWbw8bKIDbr9yovwGb4i+zUdxtI7YePPlsCywP033abDeDee0hgR0NWsWwcGlEMLb4AVXvkmeClLWng4cGtBV9Ndvl+HY/txh5A8Ct4iL7/jTh1+9yb8jI98fJsOG8bBKCMiixejzsoBN3yxhCdFDUvAhD8bcsO7W8DTkUIzbUvwskmAVidqbXCVix7ulKxx0Gm7GXw5CgPgdThloDn8NrySVnTAklfMw/PnYPIYSD2wb5W1YAFBRLwieKXKj4JZrg/fvUMWFmKRStjYd8CE1rZBD+aXxqd+vaH9jq09d4lIV1fXT2au0/zs6qs+Odvd3d3Z2Xl6HXZqyfV0m46ODn4eloiIiIiIiIiIiH7GvdFPwsoZ67Bnrs9yBZaIiIiIiIiIiIhIzsoirIh0d3d3d3d3df3nv/3ZuHHjTH9+lxHywWAiIiIiIiIiIiKiOe3sLMKKSGdn50wXXomIiIiIiIiIiIgubBs3bjxri7Bv0Lx54Jv1x8fHc7mffP2z7+Ofz0NEREREREREREQ0O3V2ds6WRdjeXvzDkc90+ptn34SdISIiIiIiIiIiIjpbzPO9A0REREREREREREQXstnySdjXzfdcHY6NDcDG4y98XYdWrB42dpwYSN0lOouUT8IK1T76aWO1qKxIw6lndRgMbtWh707AChEDLKlbEXSJk+DLH0TEzfaBfYBNRQIfnPkZsUywb3akUocGOjQRkWQTCIu7YFvTtEAYSekwCEIO2ivq7KqLroVtg/ZVOqxsXaTDHcfwmfQe+YwO00lwFNlSToci4gm4A1/Y8ShsXP7lnSgG3wEy34MFJBIb1eFkIeRn7h16AIQOukZhV8Mv69BAh+x5oKWIiDems4MHD8K2D3z+UzpM/9JDOhz/HCgrIjX553T4wdt/R4f1n7oIVija9+rwH17BHUJ29wd0WHHfdh2mM8/ACp5dAqkd9kMUwXVqX9Kqw8uHcP+cN4+hqmBzNuo6whSzeHPFQ4/p0Ew06jCRbIAVIvlTOnzcvkyHbt/LsEKyElS2nn0SNr47/dc6nPjI53XYYjuwQucH79Bh9cqVsPGeEVAkGQV94M/9ASgrIgd3gQfhwG5wOVKHPw0rRA1wU+UDPBwUTuzVYWLZu3QYaVkAKzw/Xq3DE4+Af39TMfw8rFARRak7DhubcTAcmKPg6lem0rDCZB50mEkHDGoiUl3dosOe/j069AP81U9BFvyLpXSqTocV8y+FFUrDR3TYt+8J2NjPD+kwGUvq0Gq6BlZwB8DRGd5x2Hj+mnfocGQMXLvJAw/DCnUV4HF22i7X4aiL54FXLwAVHloAJmYiMl4AI/G+L/62DuPvxs9XY9sVOixmwWkPhuH0QFIJcGc2rcCTInsJyNe2RHSY/V1wU4nIxRX36HDHBtyDnWwBJ3NBBbigbgL38LE4uEzuez4Gwu1PwwqGgLmHGTKhTcTByUyim2rpJdfBCo13vE+HveAEy+Zn9+F9yIDpaDqNL0c0UaVDPw560dLwbry5eWt0mD2FZgIi7vhRHWYmwCgDuw4RMR3QexQrwAtRvognjaPHCzqMF9FMSeTkHjDlMwsndDg+cBhWML1JHV65aCFs3Lfy53SYe+LPdVjp41eGyGW/oMP+/TvAjp3CI6CgSVF5+CXY1grQu48Nxq9IyGuvOwZmCI21CR1+Z/MjsMKfHgHv74/smQ8b+4/ercPrLwcDx/f/EUzMRORLB/9Kh//we+C0i8i8r35Yh/Gv/6IOl1biVYhoqlmH24+BEXDxQ1+DFVb8+m/o8OjH/h9sPPgcuOGfGnpBh/N3Z2CFSAJc6Cd/8GUdZr+LO+2GNtClbLgOjMIictUNYOzw+sGA+8CWQVghNwZeeyM5cMgi0tpSo8PAB5PqiTx+z1qzBszi4s0gfPS+F2GF8iR4ZMqjuMtduAoM2dUX36jD/s0/hBWSybgOjchS2HiyB/QesSgYUOwUWvwRcdJgja5soHF8EHRrIhJzwIuPhxamRKQwDs6bYYGjsOL4dv3JVGCaP1aro6NjOs2IiIiIiIiIiIiISKb/dQT8MlYiIiIiIiIiIiKiadrac9fUr82ZfrJ148aNZ3t/iIiIiIiIiIiIiC5YP/kk7Gt81vXMbyqY5rcWEBEREREREREREZGImN3d3VP/81MXWPmFsEREREREREREREQzYsoZS6ubNm06c032tO7u7qkPyfK7CIiIiIiIiIiIiIhmxBSRMxdeN27c+KrPxk4tvHZ0dPC7CIiIiIiIiIiIiIhmxD79n66urqnFVvhx146ODv0h2dkgKGdAKD5u7Od0aBYHYGPbqtNhNBrVYaz952CFkzse1qEVqcab806CMNUKKjgNsEK+f6sOPd/WoWGYOgxjzOh3DNg8CKkA8rJbAFUDF/5500qhEFwjEYlalg4jdgTsgxWHFZa0rdTh2g//IWz87AtDOjwWbdLh3h1fhhVqbXB+KtbcpsOxl74DKwg6b0HI1bB9cAfCtpaJSxgGOMN+4OHtSV5HUSetQ9fHj7OUxnUWhN5sEGiczU3CplfHJnTYd/z/6vB48nJYIZ0DN5tbKuvwf39jPqzwrFfUYfAEPsOp72/WYU1sWIe+CfZBQjqKsA6hIgZ6tlJDrQ6LL+yEFcwD4HIEFrj60UQ9rFDMj+rQMh28OdQh2A64RiUD9DMisvfAQR1OPP85HVbbWVjBDsZA40p8dH2PfEOHjVEwfrXWgOdIRC699TIdZsCDKCLS74BLfclicNJS1+MxtKYadHdXtFfpsO1OcGgi4h3v1+GXv/gobnwATFFGdtylw+F9eAwtO406rMz16tCSQVjBL4HQNMEoLCJ+9pgO022X6tBN4A5Bjj+ps/qL3grbZitWgHT0izoziuC0i0gQgI4iEknoMB7Ho/DQyl/QYeHgEdg4EoD7Kl8C/XPu2BOwgqAOc349PpmR1Tfp8NQLu3RopY7CCuM26CjKR7frsCYNHg0ROWDfqsOev8P3z5GPfVeHo0+DHiydAKGI5AZe0aHhVOhw+bxlsEKqZbEO+ybBLE5EYsfAydx9GFzQ5fI2WKH2j8BwsPZP3w0bi3GLzhZd80s63Lnle7BA3dKLdXh0L3hsLRdPG3w0i3OsGGycqlukw3IEdOa7du+DFXZ85ls6zC4GR2H3HYcV2q96lw57n38ENm5pBuN7VQt4vvr3PQ0r+H17dOh5eEpjBKB7rUDDpVcBdkxExnue0WHgghfD0kQfrGAnWnRYTuOnwx97XodGGQwoRsgspaFtvQ5H5uEZ5t5//e86rKoAz76RA/ewiGQOgQ4hlQJTO/Oaj8EKo1u7QOPxHbCx74PJh+GCUQa+XIhIgEbc4WHwLvNLOTDXEpGbAnChUys/ARu7m0BHsa0XnOGe33kbrJD4/l/r8Odzfw4bD1i/rcP5FuhqTAN3ueU8OD+t7RfpsOot74UVnn0aLCwkDPye9fS2EyC9C3QI0VhIhyDg2fdy4IJWGiOwwrwoeEJvvH0DbLzoyq/p8O7n/lKHhzb9E6zwe7//Dh3uNfEagnUS3PAv7gWzlMXeUVih+r2rdfhvrxwCTXvxtCqF1sHsIn468lnw5jJ4DCy7FUv4lkig96ygYiFsbPSDcc3zwZu+7+JXKonW6MxEnbZpH4AFIkmw9Jcvo5m9iINee/FKCPzzUz+Yq7Ozs6urK+wrX2fJCiy/DIGIiIiIiIiIiIjmnJ980Kmzs7O7u/vMpdiOjo6Ojo6urq7ZsAIr0/i5YURERERERERERESzzav/lVNnZyfXOomIiIiIiIiIiIjOlhl8N+jssbUHfMsbERERERERERER0axy+lsH5uQiLBEREREREREREdFcwUVYIiIiIiIiIiIionNoji3CTv3QMCIiIiIiIiIiIqI54dU/mGvOCfySDg3DgI1tK6pD13Nh42L2lA4To3t1OOo0wgp+fhik3ghsbBhgQdwqDuow2nQjrODmBnRYyhzTYRDAAmIIOm/4XOLfMAxLh76Pz7AX+CANCjpzTHyjermTOkwmamDj6uaLdFgKwGn3MujCiTS2LdThQ1IFG+9+brMOA3TSYpmjsEJl6wYdDgznQFMrCSuIO4ZzxHHA0xGJp3XohWyuMH54+puzTHCruC64+sEb/rsifGOLBAKehAO94BkXkcEv/4sOexbfpsPIBK4QiYLd2Fd7sQ4P/90/wgqxgeM6jBvoORJpMg7o0Hc9HYZ1mLCn8NFJE5FMYVyH7XFw7f76F+6EFbxf+agOSwfrdGgZuEMI8A5jgQ9OhZcF/bNf7oUVzFitDqtL4BrFKppgBSuS0qFbsQg2jo6/osNE86U6vO0d4KYSkb6LwIByV/6LsPHhnrU6vPOS63X4PxywYyLylWs26XDP0Cd02FizH1a4e/RRHY7+ER5QmuuX6tAz4jp0+5+CFcx0BahQ6NGhkwC3pYT0YL6LOm0R8fI6Gx88CCrYeNoQFEd1ONCH++FMAJ5QszwByoY8NHCWks1P6nD0RXDhRGQs94QO40XwyIhIgLolDz224oNDO10D7ENmCDY9/iC4XUvjJ3TolMBzJCKlErhMAbr6mWI/rPDSd76F6mZg4+rcL+tw4NbHwOauBy1FZNXu+3W4uL1dh4tufS+scGIYXI7ys4/Dxg033KzDHbvB0Z3Y/CVY4fMfv1KHRyrBHSgig/86X4fmyXfr0NvyPVghVgvm9kN7DumwEj0aYRwrAnMXzaxKBXB0oSP2xFEd2ntBh7lu/SWwwuFCGezY6BHYuPYyMEbsr2zTYXESP6GWiaYTLugYRaSyHtyZTs0CHY6MgxdDEREP9M9JC9zDhSw+ZLcIeg9vAvdgjgU2Z8bBbemjNzURcSrBHXi4Hx9dIrtdh8nG63QYr14MK5waABXEA5srHW+GFcwCeHGWAO9wBL2SGzYYskslME5JyNx1IgeGxXkpPG3oy31Fh4lXwORZRNxr/1SHP/oX8CgtuuT3YYXcrm/qMNn1bdi4vvI3QONKMIYa4sAKbgm8A/b37NLh2P33wQrFJJjqJODYLHJi18M6XJzpA00d8AIoIgLHd4GvLfiCDh7dqsN/+IMvw8YDl63WYf8Vv6bD276Nb/j7jJd0ePD5NbDxjW8F+7w+A/rAjI+f0E0/BP3P5Asv6zCWDZkUFfbprDYKeioRKY6C2e+pgR/qMF4CMyURKcfQGkuAR8BIFejurBK4txPJalhhHA2XZgw0jteBFSER8W30KKEXwzCeB8ZQ/cBs3LhR5twnYYmIiIiIiIiIiIhmua09d53+RWdnp3ARloiIiIiIiIiIiOic4iIsERERERERERER0TnERVgiIiIiIiIiIiKic2iOLcJ2d3ef710gIiIiIiIiIiIi+uk6OjpO/2KOLcJOmfpqWyIiIiIiIiIiIqLZbK4uwhIRERERERERERHNCfb53oEZ6+jo2LRp09T/BhLoNraBj8swIyD1XdjYNkDo+r4OCz1PwQqmPwH2ISjDxgEoLCV3ErQc3A0rRBou1qFXBpvzCidgBcMAx+wH4AyLiIkaT79sWIV4tEqHgR2DFfxyQYexVD3ejeoFOnQMB2zOi8MKB4716vDoF+6Bjc2+HWBzDrgD7WAIVsiMgKvvBf06NKyQB9kHmzMMC7Z1PXCrBAVwDwc2viVC/lLHw7sG73ivGFIZgrsx3dtSRAzUOIMOWUQyu+7VYcP+VTpMeKdghVgM3FcvP/aEDlNju2CFWne/DgMDXw7DAUdnoWvko24tDDxpEtJRfPkfvqHDf/4fN8EK9/z+czr8wFO36nDeBHi4RER8cP8EJXwHGujZF7MEqrr4lmioqtFhoXKdDicGD8IKVimrw7IF+kARsQQcXUNjkw73NV0KKzz0SdCl7B+ohI3tQ2CfG+Q6HUbK4CqLSO6VzTrctfKoDn/wylWwQnLXt8DmfhWUFZGaZx/S4fxFi3SYyV4EK2x/9mEdBgaYIbhhPRXqXQPY14V0VeX8IGgZgFBExAQ1sqfw02EGYJjwPXxvQ3AkzxbGdBgU8T7Ey2hKY4Y9oWh7AQpDe33wG2O5Edw2+4jObAHXzjdm0GFChWIe5saxH4AQTYpExPvOVh02Dnxchy2XgMmhiKTef4UOex8H1yhTCfo6EXm+MqPDdznvhI0jETD61K8FPVhidDGs8NVdbTocfvYTsHHLVXfqsPW27+nwwPffDSv09IFTUdwGxikJuYexkNvV80BXY8XSIEQPvohEqsDJjMfAPNCrB2dSRAZ/CO7Aan8cNu7ZtV2HuRh4vhIJ9PIlYgbgkE0HDc0ixQJ4atyRkzoMCmAcF5H0vPU6rGgHw+XJw9tgBX/0AEhze2Fjp2q+Dl0PzTFC3rP6j4IzXDKOwcbJ2oU6jKfA/ePWLIcV3L7v6tAScNqtYTxHDdBLgBEyR7UTjTosueD8hI2hNno3LJRzOrz3m+DBF5E/q/1zHX5qyXtg4+jXv6JD90Xw0Ll118IKrXXg/XTFZWBaJSKjdZfocOe3HtehYeBP1DkWeJTKOfCGkt0G5loiYldeo8PACnmty/aAfYNvnD6uYJvolRwdnRcyBytMDoB92PVN2LhqJwiXDH9Wh6M/F/JiaD+jw9XLwZMoIje3g5P8q9eja/eHS2GFwvEjOrSHQR9YLSAUkZpqMOGvXH07bNy7/QEdVo2BGXhJcA9fMEEPH7Vw42gNGJUiBuglimYCVigOvgDKoj4wiIBQREpFONjh58t0wG545WEdGlYUV4ApEREREREREREREb0O+ptUuQhLREREREREREREdPZ1d3ef/gUXYYmIiIiIiIiIiIjOobm3CDu1fkxEREREREREREQ0+829RVgiIiIiIiIiIiKiWa6jo5T0eAoAACAASURBVGPq13N4EVZ/wS0RERERERERERHRbDMnF2HPXEUmIiIiIiIiIiIims3s870Db5RhgDAaScLGvhnRoRf4sLFtWToseaCxUTgBK5hmoEMn1QYbFyZAEdfLgc2N7IYVXA9sTuwYqGDg626Y4JCTNjhpImJbUR1OFjM6tFBZEYlGUqBsqlGHZQ8WEMMu6bDkurBxMNavw0jjatAyWoAVBocHdBg98U3YOFGRBo2rluiwFF0AK+SHwIUOSuAMG3YcVjDQNTIjFbCxVxzXYbk8CZqWwW15eu/APgh6RHFbCSTkSmOgcsjGzgLLBE9NsrRHh4GBjk1kPI/2bn+XziIG7pRMB+yDaeDnq+yDpyMIZnKNZgJ2xY+89CMdLtuahxVaP7JYh/HV4AmVx5+FFSKpVh1GUS8qIq2183SYyYPny/XwI7P6pvfp8LEHH9ZhUMrCCq6ArsYUfEENAT1bMgIu6Eu9Dt7c139Hh0sFHHKYwX8HJ7PeXQUbl7bX69B4ABzdooHLYQVnNTjDyU+AnkpEKl/+mA69LNjckcePwwpuDnzjvI2eLx92jCKGAc887hAC2IOh58iAqYiBOqXAL8PGvg/22TDA38QHIZOiIAC74QVwc/ga2TY4P66Pu33YWWGhDeF5C2ltgOcLzl58dB5CTfsgRCQwwZkPymOwMRxnUj/6Sx0uS4FHQ0Rya94DNueDui/eh6edyaVgQnvgliJsvHKsUofb7F4dtjwIOmcRKWwCA27z84dh4/c+Ah7zt1z/fR1+87OfhhWSn9ivw/qxx3RooH5YRMwAPF/oBIuIeAXw1PhGQoeBAyb2IhKUwD0cSVbrsGcHOJMiEsuN6NB0wExSRCZ7wUDchm6qmmtAKCK7ngSXI5rAb3BeGcwcYlUtOqwI+XxRIrVch4MT4KErFPF7hBmAzspAb4siUkbTdUHvoQEqKyKl8QMgDel/jLplOsyMD+twApYVMT0wRpgJ8C7jGWGdNshNC7+hlMpg/hP44MzbDnhblJARMGKBCsf3PgYrNPwheDH88J/8d9i4cBgUaTLW6HDBJZfBCu/58FU63FmN52DP7wSXw/rBeh3GC6CnEpGGFjA3g49z3+EXYYXUEJjQxmOgUxKRgovendF0wkFLEyJiOuDZL5fQSoiAFxwRiUdBhaoavPASj4I70+t9RIf2vX8EKxRvAZ1SpuFB2PiuJ/5Vh/3PXanDRWXwLItIavAVHUbyYAQ0HdwJxmveqcNcgJ/Qi275XdC4B4wdezd/Flaw8mjsmDwJG0crwauWkazVYab/FKxgoq7YRfePW8QvZVKc0JkTDbldLTClcQujuPKPnfmjrebkJ2GJiIiIiIiIiIiIZiH4HapzchF248aN53sXiIiIiIiIiIiIiKZlTi7CdnZ2nu9dICIiIiIiIiIiIsJe9UOt5uQi7BT44V4iIiIiIiIiIiKi2WOuLsK+ai2ZiIiIiIiIiIiIaHaaq4uwRERERERERERERLPK1D/c7+7uPjPnIiwRERERERERERHROWSf7x14o5xojQ6jFQ2wsYeO150cgI19A6xQu/lRHQZ+AVaIxtI6LBsx2NgwwL5ZVlSHkUgKVsiN7gL7Frg6rK1fASsU8uM6rEq3w8Zmqk6Hk4ee0aFtBLBCrLJFh54Z0WHZxWfYCNDfIngebjzeA/YthW4VJwErmDbI21bdCBsn69t0ODqW1WGQz8EKVrxWh7n+bTr0cv2wQuCDq2+gMywihumACl4ZFoYVQnJjJk1x4zdT2B546GRapqXDIKSGH4A707JABUGdj4h46HF2fdgW78Q5PMPoivroyf3jD/0ZLPAbsk+H2d8HdWt2rMO7UDiow2Vv+1XY+O3ve4cOn37gZR0mDz0HKyy++a06fPThLWDH/DysEE+CXrTkFWFjB90qeYmDzR3cCiu0X36rDlesXw0b9+w7oMNt/X06XPXRR2EFQT2/GwUj4G9+4S9hgeMv7tThKy9sgI0fXvaYDrM7duvQ3oafmVY0Oht2UodBEYyVIuIH4NqFPXSwDwxQGoR0uQ6q7Fu4hxe/hDYHKs+wlwCNTRP3YK4PBpRUtDKkMto31DfCflhEJtCUJuxkws35fkj3em7AM28Y+HJUp+p1eFXnf9Nh2amAFRYOjoDNXQUmHi998H/BCu2XX6XD0etBxygiJ9bep8OeBx7TYTB6A6xQvw10d6kmMNcSkdZ20Lvevv/jOvzXdf8DVvjQjb8N9mE7mLgmglOwQslFD52J37zKJTA/LGdBD+ZUgH0QEdMFc4xCdlKHfhF07yJSWVWtQ3eoFzZevvIyHc5719t0uOME7hD87Bd0GK9aBhtH4lU6dBqX6hCdBhGRgSM7dJg/+ZQOrfxRWME3QS9hW2DyLCIGmvKJATqreBy8yYqIFQFPbmbsCGycHTkEtjYO3g4MdKeJiNhg37wAzOIM9HIqIoEHXmfckDc4QTns4e0YPj+p6lYd1ret1GFmFD+hJ/c9psOlv7cfNp5YeLMOm65crMNkHX7G/6YZTCZP/gjcgSKSeKhRh42N4OjMgWFYoWYV6Eh7jw+CpsZ2WMGJgtde18A3vO+DrsZBt4qNlkdExEOV4XtozMKDWlUjWN9Iol5CRIxKcP/Ei2BRaGEM9ylfzYJ96/9voJ8RkdT2D+rw2r//qA6dNF6F6NsDxtDABLOUAK0piUj/nh/qcEUF3tz/z959x+dRnWnjv2fm6erFKrYly70XsEU1HUJLAslaJiYBUnZDspuym333DZtsypuekMqmLCEkBJIQZEMCoQcwYDA2NmAb997Vu/T0mfn9oXye1Y/7GiJhq1/fv8Tlw/3MM+WcM8fjUfjKS3To21ulw7JtYMNEpKcLnGwBB8+fiyaCce3I0WbQNIrOYRHDD2YI6R4wz5EU3oZwCJyuoVxwJYpI2gLLcYlu3NVAo/VJ2Lc80EtEREREREREREQ0EuhfZzVaF2EzXj35l+HeBCIiIiIiIiIiIiJPo3gRVq8oExEREREREREREY00o3gRloiIiIiIiIiIiGiEePXQPb0/6DepjuJFWL4WloiIiIiIiIiIiEa+UbwIm8HXwhIREREREREREdFIAN+hOroXYflaWCIiIiIiIiIiIhrhfMO9AaeHv3hh3/+0QkHYzJGwDo1EFDd20yjt0Zlrx2CFdLJbh7btwMauE9dhTrhAh1kls2AF6QEfl+93dWhOmIcrNO3XWW5pFf60svN0aNTX6dDvtMEKZtYE0DiQpcPOpnWwQii3VIeBnImwcTC7RId2AhxQO9oJK1jBXB0m3BBsHDXKddgZ3QfKJm1YIW0Wgm2LTANN0ZkmIm4KfBEn1YUbu2AzDDFgYw8DaNz/puAMPi1bMEBwVzguvpxPtcJAvvPgfeXTAG3cuhdehm3PXfx1HX7tve/R4Y3/dCusUPHN53S4+PzFsHH0ikM6fGSepcObH/4QrLCzEowdk677lA5P/GYTrJBy0Q4ywDaIiM9O6DAcBv1P8YWXwgptR5rANiyrhI2twBQddre/oEN3QgWskBcBA/HKj31UhzNW4FPirxdM0uH2FQ/AxoG9r4Gwcr4O3aM7cQW7QYdmFujJ3RQYOETEdZIw99Df69w08N+X+4M5OjTSYC4hImYIjF+2A7r9tJOCFZJp8O0MA5zDfn82rGChbZu68DLYOB4DO9kXACd8PIk3uGPH0zo0TXx92ehbD3AEPFXwhPDahlkzluhwwiUX6TB3Nv64ZTOe12Ht5k/oMNEN5nsi0toK+sDEqq/Bxk/e92Eduj3LdXjDzZfACk17j+rweP7FsLG/DEwFb/wdOKn+8LU5sEJw9nd02JZ/uQ4r8vEc7OSeZ3RomvjOy/WD2a8kwITN7j4OKwjqf1wrosOAiT5LJNEB9k/AxHPUrBLQP+8/DE6JQ+lWWKFqDjhdQxG8ba0nwR1K9OiboGkpuDREJBYH/Y8v3aJDF3cSEvCBu0iveaCdBDPw4iwwsY9MPBNWaGxGQ5J5EjZ24NFPd+jQMHGX4jjgtteIg2mDeAxJsLPKyQFjqHiMPj094CsHXNzDl846F5SdcYEOG9Y+Biu4Bjh2bgDfJeV379Bh2/PgDrfuUXzCJxLgDJwUDMDG/rnTQRgF+yc7Jx9WONYNTtfGI3t0GEqgoyxiFoHBI9UNtsGL6QNDdsrBkx/XAKeE6QMdQiiShyvkTtVhl4snJMkkqDxjIlhjuXfLBlih85/BTceiKNjDInLJ+efr8OD5T+jwsU3bYIWJUbB/wDqRx7Usgp+9tBpB1yoi2YfB6WresluHPTvAjY+ItPzl2zqcs6AaNu6cBNamuveBPWzE8RVqOOAuyUB9YCQbTJ5FZMJkcPQ7u/A6oW2Bfe/Pmdz3P1/e9o3eH+A7VEf3k7ArV64c7k0gIiIiIiIiIiIiejujexG2pqam94eXt31reLeEiIiIiIiIiIiIxjmvt6eO7kVY4WthiYiIiIiIiIiIaGTw+of7o34RloiIiIiIiIiIiGgYZV4Im/mH+28x6hdh+VpYIiIiIiIiIiIiGnZv80/2R/0iLF8LS0RERERERERERCPZqF+EFb4WloiIiIiIiIiIiIbb2/yTfd9QbsdgS7Yf6v0hNHEpbODYjg79eTNg43TPcR2GI0U6tOO5sIIbb9NhMIQb+wJBHRYUTgRlC6bCCkZ0hw4jVWBXRFN48T1Ueb4OW9rBfhCR+K4XdZhdOk+Hye5GWCFgpHRozbtGh+6xvbBCoqdFh74g3sNix0GYVaGzVMtuWCDVfUiH8YZN+OP2Pq8zs3A+2K5oPSzgdBwAqQHOYV8O+BYikmqu06EViOCPc9IgtBNgE8SAFQbJqX+YO7QfRxlwZ67f8QJsXPi59+mwteRBHc6++euwgv8lkB/buh02Pv70e0CFyV/R4dqP5cMK7U1RHTZ++AwdTt7/BVjB/uttOiyaCHoJEYnH2nXY/OZfdXggNgFWyHa7dTh7YQlsnDi3XIfB17J1aNtdsEJPDHQpu17aqMOXLr4FVvhI6Xmgwo2PwMZTV4NvVx+aosP4MbANIuK4oLuTKBi/XNeGFSDXowcyDHB9+MyADrNDYLeLSO7EhTqsmg1GYREpiPh12Hz8mA73H8QjYFPTPh0GTDCNDOZOhhVKA+Ar51/6QfxxDeD6SlngW+zdvQdWCMhLILVgWxEHTEhGsubWJh0+WguO3SdunQMrtE97Uoff+tVsHVZkFcMKoSDYm1VzcA92zbPg3F7+fy8CH2f8Gla4YEeBDm9Zswg2Drz/OR3+sQP0jakVeFIdvQA0ft8l5+hw1tmzYIVHPvO8DuGFLyI+C8zM84rB7C7tce9mBUFH0d4GZpjJnoOwgiTBpHrGhR+BbU8aVTo8+uAPdXjWyk/BCrlf+KwOX/3VBtg45nbq0N8IOiXpBC1FJJgAnbnPj3oEA5xpImKj/tlNoZsLkckTF+hw4sILdNjYhQcUuwHM4Q0fnsObNjiv/CY4qRwHf1zaSerQdcE47jWrzg3l6TBYtgQ2bqsHx84wwBmYtHHnfGL3KzrsagAbF/CDW2wRcQLgpt5NNePG7eAuOyggDAfx+WPml4EwC0/YYgfBVHnWUnCffvjNXbjC+rvAtjlgaULQwCoiCXQ77BoeUxo05U8kOnRopsGZJiIOuk+3fGEddpt4IO889CrYMH8O/jg/OPpb94K7bLcbf9xUC1yhEsGn6ytvggnJsTJw7Ba5DbCCEQHbZrtg2ywLn/AT8ifp0DcLdEoiMjEXdRRZ39PZLy4E9wsiUvU7MC3vcvCE9vhGMDO30jEdug6aq4tYbo8OC8rA+F4yZSas0B6q0mFHHbjPEpGgHxymZPvflm42Hb2/9wevF8LK2HgSlq+FJSIiIiIiIiIiomH09v9YfywswmbWmDOrzkREREREREREREQjxFhYhBW+FpaIiIiIiIiIiIiGz+rVq9/mT8fIIiwRERERERERERHREOv9p/l/9wnRMbIIm1lp5hsJiIiIiIiIiIiIaEQZI4uwwjcSEBERERERERER0XBYuXLl2zcYO4uwREREREREREREREMm84/ya2pq3r6lb/A3ZoisXLlyzZo1IrLp6P1XzroSN4p1gtC1YVsjUqxDyx/QYTB3IqzgxlpAWTcNG0eKF+gwewKo3BLzwwpOpFKH6VQKNPUVwAod3UkdhiOlsHG4KB9UqD+iQxvudpGYP1uHqV2v6NCfVwUrpFvadBjyW7CxPxsc0M72Zh0aTo9HhUId2nH8Nxmu64K0bYvOciadAyvEwuDjrJZNOgylGmCFTn9Ih+l0AjYWQRs8kHZGP/9/7yK4guER47KocH+/GQ0NfDzys8AJP+8IOF1Tgt90vvGnl+nwysPXwcZP/uO3dNiBelfbh3pRkZJPfkaHwUt+psODV8yFFc57DfTwZUvfBRsf2L1Ph60tu3RY0LQeVjj3/eBvZactCcPGG4u36bD8K5foMPXTXFjhyPO/AGW3bdZh6KNHYYWv3fO4Dh/56D2w8fL0uTrM+hJoXGDVwwqOAc5MJx1FbQfUC+LGIV9EhxUT5+hw6XkXwAoTFs0H6VJ8su2cACYk1npw0RU9+gSsULD3OR0WhsH50xAugxWObgMH9NDd34aNZywDl/OejeDcDjaDk0pEHF9chza+mmWAI9iggFvgeMxRDx9/U4dnzQAzqGNzy2GFT/2iVofBjTfrMLcUH9AJi8FFN+uiabDx5MvARGVJwxd0+KPf/wFWsIpn6dBeACZFInL3BvCtKw6hw5/qghVmhG8E4fe36/COnU/CClUuOKS5WWDyLCJ5c5fr0A6BKzTa1gQrpMPgK9txcEqYUdAbiMjkisU6nFAGJs8iYneBzZg2F1RI2fjiembdXh327APzZBEpantdh5ECMIbaLp7D500/W4ft9eDbJRq3wgpOHHzliQWTYOOqSz+gw7asKh0e2bobVjBNMEaYaGIvIqFAUIfBvMk67Go5ACv40cWRdkDquA6sYKO8vQmP7060Tocuukd2HXxb19MFTmO3/i4Qzv0IrOB17UOugb+1ZidbYe4kwE2rtOOjP3/Z+3SYXnSFDqMvPworBGywhx0bXx2QZYE9bzt4SOo/x471v7GN5mB21zHY2ECjqIlWG0TEDIKj7/rAlGZCEFdwu0/qMDsHD5dZ8Ar1d+vQMvNghUQK3BD5LLAwFcrFSze+XDBGxKL4cDx09zM63PPAP+iwaALuA8sWbtBhexL3YIaAbxcUsG1WGK+D5eVN1WFWJZgnn+jESzeppkM6zJ+yEDY20mDbek7+bULSn3+gP3aehP27681EREREREREREREQ2/sLMIKXwtLREREREREREREQyLzLoLVq/E/2exrTC3CZt6A+9QzHx7WDSEiIiIiIiIiIiL6mzG1CMs3EhAREREREREREdGQ6ec/zR9Ti7DCNxIQERERERERERHRIHv8ket7f8j80/y3N9YWYflGAiIiIiIiIiIiIhoa/fyn+WNtEZZvJCAiIiIiIiIiIqIh0P9/lO8b1O0YFitWrFizZo2IZE078y1/1H7imG4flBSs47Qd0mE4AFrmFEyAFdLhpTqMNRyEja1AEDS28nXYlrZhhXjrUR3aE6t02CgFuMKBB3XolM2Gja1YHHxcOqlDw8SnWSrRo8NQjqHDZHY53oZ4HQh9YE+KSMqxdJhOxHRoCNgGEXFNVDlYBBs7neD8MSywDd0nNsEKVhgcpgnVt+iwy8mFFWTnn3Xm79iBGwvYtqQN9o+4Lvz/cerBMMBOdlFlA22YiLgG+jskvG34Gsdl+9/UEz5/TrXp6eDx7by+NNi607HBuMbhpv0g/Nx1Ouwu/BiscN1roMOce7ASN/4K6Ird7Vt0uGXbcVihGf3uy9IXztNh6o4ErFDw7m/o0Pwh6EVFZJoNev5dHaCfmX3GMljhrGtAZ/56BRgWReTs1iodVp8FjtFt38FXaPJ8UCG3a7MOp1bNgRXOfbFTh+vOwD1YR+dOHU6yO3TomvhwmCb4Io7rwMb9N91jDF2ybLkOJ19xuQ5zryiFFf6zDgz6E/8EvrKItK5s1WHXpS/pMFU2E1aYtQGcrsEkOEZmfSOsUBVv0+GiZW+dqvWKX36NDte/slWHBWYaVhiQIe6KT53PAjOrwtISHf7oKD4cTetB77pg7xs6tHJDsMLuP27Q4clXL4SNO15+lw4/KTN0mBbcw1ekb9LhWbeBc1hEwuYfdfijvVU6vCnvH2GFuaEGHf7qYJYOnR0PwQrNk9+jQ1/rk7BxIAXOwbYoGA566sGGiUjABw700nkVOvQLnlTnzl6iwxNnglBE3lwDOvPcrmYdmptfhRUMNC0vz47gbcsHHWa0/aQOrRTolESkKwrG0Ghniw7NNK4QCoBts7PLYONtr+3SYWsKTDysdnxjWDDjAh2mDuMJbV5ung6TfnS7F/e47U12gbAL3cvA6bdIPAVuDN00qCAiYvR3up208ZBtRMHRdw1wlFN7QG8gIo6Ayl73gP3nekyqXfSVc0Jg4ioiLd3gixx74mEdhgTdqYkYPtRv2+DW2+cLwwoO3BVOFDb2cKo3RB470+s+FOSuDU5LEXHR+WMEweGwrG5YIatwqg7LFl8LG4crwES3p6lehx1HtsEKOeiWPCsfrEHZgparRHImgg0uqAKhiEgd+NbJunYdFl9xNiyw7419Oszd9TxsvPDqG3R44FC2DgsNPCWOFBTqMNkDurWi3BxYIYXuAnLL8SpfZ+L/Nwd78M5FvT+sRveG0Fh7Elb6vJHgoV8uGt4tISIiIiIiIiIiojFpQL+bagwuwvKNBERERERERERERDRyjMFFWBngOjQRERERERERERFRf7yDdxHIWF2E5RsJiIiIiIiIiIiIaJAM9BnQsbkIW1NTw4dhiYiIiIiIiIiIaDBkngHtp7G5CEtERERERERERER0emXeRTDQ30o1ZhdhMy9l4BsJiIiIiIiIiIiI6HR5B/8E33BddzA2ZSSoqalZs2aNiFRXrupNjLkf0s0iPrwSXVhSpMOcLAs09QVhhZ6kocNoVww2jjaf1GG8vUmHna31sEKga7cOLbdLh6lABazgix4EqWHDxrlVl+qwK5oCBZJt+OPQnjdNsNN8kQmwggHaSiQSgY3b2zp0mIp36tDpAcdCRExJgNTKwtvmREGY7tFhOtkNK4jhA9sQyAGbkFMJCwTzp4IKHn/z0n38VR3aPcd0GPaHYIVkGuwfV3APU5RdrMMZFXN0OLF8IqzQ0tqiw2gU7OGy0nJYYfY5Z+qw7RD4yiKyexe4vnYe2g42rLsRVjh1hoAz3msP97+CZYEzTURcx9Gh44Jw8MDvZnh843ThhTpc+p9fh41/Pf+XOvzIka/oML7+RVhh8fx8Ha6+DfxF6NJb/htWyL39WR0+05CEjQ88mafD2bf9WYdfvvf3sILvMhCWBl6GjYukQIcVx/fp8Mnm78IKt9/xiA7fXdWqw2BBIazgr6rS4dcmb4ONm+65T4ez763TYcBogBUMNPp4zJHwKViaN0mH53z0i7Dx9HeBvyHe1w0q/9x5ClYw/gzG9/L4TNi4shBsmzEPjK37T+6BFaZ3gk57waywDhNFeBQ+2gxCN4l35ob9T+owcO9fdFjo7IAVXAGzF9gHjmRePbzPBP12MFKiw8PpGbhCHByPQncXaOoxRpgmmv0GwTaISNIEHWZw2iU6TJXgIXvRbDCl6fo3MDSLyNrnntbhtI7/o8PffGQvrFC7f54OH7sN9D9Hs0HHKCJFh8GFMNsEE3sRSVnZOmw6eUKHEQGTHxG5/mMf06FxA5jw//7f0VEWMfeDeWBPNj4cYSetw4ICcOuUjIP5sIjYKTBpLCwEI52IxMHthUSPv6lDfxLfJfUkwKXktoPeI5yLv3KsE8wPTcsPG+MLwQeOcpbHbUvxrHNBgYLJsHHnMXAhNDeAk81p3QoruD3gZHMFTEjyI3jI7oqB+yzHo8t1XdA/w3DwGAa6Ixq8hRG0Jyx0rycijoUuBDwDR9eGiDjg2DkOuOjwfhjg/AcapAHXawtMuC5gBmBjx47r0PKDK9QM4UHNjYEZ5oTZ18LGxee8V4dNMdB7THf3wwrlJWDbGrrBwlTEBosbIlIwbZoOj0zEawhbHgXDhNkGpg0NJloeEYnsAANK1Sxwpy8iHUVzdZg6BDqrWZeCBSgRMcNgOmoHwNGvrwOHXkT8KbBG192Nx6+eJ/5LRDYdvb/3P2tra/kk7P/KvJohs4OIiIiIiIiIiIiI3rEVK1YMdAVWxvYiLH89FxEREREREREREQ27sbwIS0RERERERERERHTqMv/UPvObqAZkjC/CZnYK30hAREREREREREREp+Id/7N7/Dbo0c6AL2YmIiIiIiIiIiIiGqDM852Z30E1UGP8Sdi++DAsERERERERERERvWPv4Fdy9RqbT8JOmjSp73+2tLTE4/Hh2hgiIiIiIiIiIiIapZ6/c3rvD+/4XQQyVhdhjx8/3vc/V69e3fuosGFaurHTfgQWCU8I6DBUMkeHJ1sdWKGtrRF8XDIBG/e0tujQ7TihQ3/XAVjBTDaDj3NjOrSSHbCCGGD/iJOEbWNNO3ToukEQRutghZTp6jCUO1mHvryJsIL4s3QWTeINNl2w5w27GzRNd8EKDsyNNtg4u6BKh76cWTrsbjmMPy7aoENLbB3aXUdhhViiHWxD7nTYOFw4Q4dpE3xcCH01EUm1gEtpRn4ubDx1+dU6nH/1xTr0LQMnlYhMrQO50RTVYcmUCKwQmAGur7CBP67usVU6nPx78CruigOvwAqpdEqHzR2gl2jpaoIV0g6o4PX2FUNAbqJr3PTjY2Tb4FJyUz2wsQjoBuE2DBDoJXw+0DmLiLSs01njtz8I25b81y06TARAeOePt8AKtoDzp+rVH+uwc+1dsMLz7wVXQXdJGjYOJ0FnteL3T+mwQq27LAAAIABJREFUYDnuA6f41+ow1LYBNi55bLMOU3tBV3PxSdDPiEjlXY/ocJ97rQ7X1xfBCifv7NTh/J1LYOP1W5/QYTi9U4dOcACnJby8XHBW9ubgKjiwFWyDiLw+b74Ot728XofWM7thhYmLLtDh7FlTYePZV4HhclsEjDIXHALjlIicWQr2RVsK7Iva58GlISIdDz2pQ3/UY0LSASZFhSaYTrgOnoPJaeh/hp9XL2qjk62nG+yfUgccZRFxDXDsLJ8ffJaDOyXXBUOSxI6DUKSiqkKHRcsW6zAZzoMVFi0AQ/mPe0AvISJ5xo06fPDDr+nQ+DroOkTk5htf1OEfsr+rw8hTYD4sIlPmgFuGwuXvh403PfygDiea9Tr8wDXvghVm3gpmdytfv0OH6bWgrIhMCYEZVKQT3yWFCqfosKcFPPKSFcBXqJldrsMoHr4kywJz+JmLZ+qwqwdsmIjsXP8oSB2wwSnHo4t3wDaEIoWwbTivAKTZ4Cow/GFYIWqCyj2t+C7SMsFVE4hv1GEczSRFpGIC2LaSqQt1eKQF3TqJOIfA+CUuPqKuC+4vTsOkERbwHLLBHwzKtLW3MvqDNOxFRcQGIyAsYcCbd689jOY0cOriVTkSwLdU0SS4OxikPexVwYX73mMdA55sjg2uL7fnJKzgt0CFaDdeFuiqBwPx2e+u1mHyrBxYYeeRENiGDnDT2oDuyERk3S5wjDqfxPc4xtFjOkyc3K/DUMpjFA6DndncDkYZEUkeBCNgTmGpDluPgfUuEWnLAV1u88FdoGwcnxLZ0+bpMN6AJ7S93tmv5Oo1Ll5HkHlOeOMTVw3vlhAREREREREREdGocyqPwco4WYSVU95NRERERERERERENN5s+POFvT+841/J1Wu8LMJmnhbmw7BERERERERERETUfytWrHjHv5Kr13hZhBU+DEtERERERERERET9droeg5VxtQh76juLiIiIiIiIiIiIxptTfAxWxtUiLH89FxEREREREREREQ3Iafnn9eNoEVb4RgIiIiIiIiIiIiLqh8y7CDK/a+pU+E69xCiyevVqwzBEZOMTV1VXruoNA+f+K2wctcDOifVYOmzuaIcVjLYGHSZtGzZOtNfpMJho0qGVaoYVHLtLh6YJ1tktEx932zB06Bc/bGzF6nWYNsJgw1JtsIJjuDpMtEV1aHhssJU3VYfBvHLYOBgM6TBnQqUOm3Z77OFkK9gGdJ6IiKS6deYPgG2IFM2EBZKBLB2GfeAYpVNxWKG7C5w/gr6FiISnXa7DeGCpDlPxFlghJ5Kjw8nvugk2nnvRQh36KkCFhsJXYIUlpS/o8K92oQ7r3Gmwwqr0YR2evwec2CKy4PI/6/An59+iw4V78JtP2naC82pt7RM6dN74I6wg0qmjSCAbNnXNgA6jMXDsLHSuiohrgHMbdRIiIi64mk8DQ8DnpewkbGz5wAbXt5+Ajad85ns69BWW6bDqxutghbNPBnWYc+eXdfhv//J5WCH797frMOTHXW4oF1wdU76ySoduGJQVkX3bfqfDVxrBSSUiO2OgK75hCdiG4qc6YIWCi8GueP8nn9ThkmoweInIGcs+qcOSXxTDxtkH0jp0/OBUsdCJLSJpB1TwWeA68vvBSCci3XHwRRJbn4aNO+rANZNub9ThNPckrJDdAz4u20jAxscKQT5hIuhdz52TDyssMLfp8DPt4DzpeORSWKGsAPTPqbbNsHFWdIcOzTDYNjvt0SuJg0KvxqMOOH8M1EF7nO9ioucw0h69K94CG5xUfgv3YNHWwzostcHspegMPGSb6MRceGw5bLwqB8ygqnrAvvjxz0DHKCLZvwVDdvITYHxPPYz/WWJuGNwy7N55CDYuNcBQ9YkffEuH8y7HD9DcdPzbOuy8FfTPs+2jsIKVAkc/XLAENo41gis0lDdJh0beYliho/6gDifPWgAbX3bDRTpsKwIn2x+/sxZWCKD5T9AHenhD8J1apBTsilAkFzb254P7i+a6Azq0bdhTidkGzsC8ykWw8fTLwf7Z99eUDgsPPwYrVN/yOR2+cgjsn/odP4YVLAecP64LtsELnEgOrMseyFx0kAaDAZWFnbZX7qBv57r4dIXzZxdN1n0ed9nhHHA5J1zQrYmImwC3EvjLnfL9gmcBfCsykM9z0OlqgMmhiBhGRIfxHnyPLB1HdHag+xwdPnrwUVhg+ktgZmVPAwsL8gqYSYpIohsMB+F6vOhhd4PlgnD3Xh1GInjQzyqYpcPOOL5lKMwG41oyDbqUk6/iHizqA1MEXxys0eVMmQ0r+NGksev1X7wlOV3PdI6vJ2GFD8MSERERERERERHR29p09P7eH07LY7AyDhdhM7+eK7MriYiIiIiIiIiIiN7iND7NOe4WYWtqavgwLBEREREREREREUGn/TFYGYeLsMKHYYmIiIiIiIiIiOhtnd7nOMfjIiwfhiUiIiIiIiIiIiJtMB6DlfG5CCt9diIfhiUiIiIiIiIiIqK+TvsTnON0EVYGYVcSERERERERERHR6JV5XjPzOtPTxXd6y40iq1evNgxDRJ554OzzbtikG3TXNevQPXJch05+CfyIQE6BDitz8D4/cGi9Dq1Uiw4Nyw8riO3qzO8L69D1qJBjgW0LZk2AjbuTCZQ2go8zDVjBEJC7rq3DaMtOWCHQfUKHodzrYeO84mLQePpiHbY0t8EK0rhOZ06qE7a1U3EdGskeHWaVLYEVYj1gM8KT5ukwbeM9nDj+ug7NVDtsbKQ6dGi7WaCplQ0ruDl5OoxF0Xkisi+Yo8PH28EJ3/HMJFihYGlKhzOb7waflXcZrFA+CVzO77Ec2Hjq76M6/Mn0b+lw77mlsMIdZy7SYduJK3Xo2/88rDAlPFGHRl4ZbHy8pRWkMRA6dhJWcAUfOwhezoPE67McB/QeXlwfOH8WT6zQYdAGB05Emu78tA4DLzyrwyML0XUkMhd1uQFpgo2LTEuHj33vZR0+ee2ZsELHC+CEN+rwkBTaXaTDtReAypf/y0dhhao3wCVzzgtbdZh4FR/Q9y36Pzr8S/obsHGFcxJsw1m36PDQpntgBb8V0KFlBXVohvGwmEh06zDashc2NjtBd1cSBJV9eeBYiEj0yEYdHmwHw6KI5Pn+QYf73zdLh7NmPQor+Nr/osObLXAd/e7fz4EVsjdeo8OuP0yBjc3X7tOh3XUYNh6PwIxPYNfowpYijoDBDveuHr07rJyywSkhIrHuBh127gDTqglXgHmOiJxYeFiHnyrAJ/ylAmbg7n1f1qHPwl3umx3g69VtWabDObm4h+8xcnUYatoPG3/iP/9Fhxe8C3RrBc+Abk1Etvxgug4XHgFTPl8ETFBFJCsC5hjJBJi4iojbfRCkIdCLdhzbDisYXbt1WH3TtbDx/iVgsv3bp17SoW8bGGVEpCIE5q4umvIZqNsXjzuUYNFU2LjHAjcddvfzqCyedoZ9YDI5B8/4JGc5+HbmwbN0WDyjClZY21quw11P3KHDsm5w4ETENcC1b5n4eS8HfWsX9SkeHRg2lHPR08Krf3bR94bfzfX4yrACBCc/IpKQkA7T3Uc9yqCPcwflcHgXPeWPG0iBZBqc8EY36LRF5Nh20Fl1H6jX4ZTz8E2rzAKrNx1/eU2H4Sj+GuFsMCQlomDiKiJW8x4dRsJgG7KLwdAjIikfWBYoqASjjIh0NdbpMB0D45eN1rtEJKsL7Iqyipk6tAoKYYXmNjAt77VixYqamhqvP31nxu+TsMKHYYmIiIiIiIiIiEhERF66/29/7XraH4OVcb4Im3kz7PoHqod3S4iIiIiIiIiIiGjYDcZjsDLOF2GFD8MSERERERERERGNe4P6GKxwEZYPwxIREREREREREZEM2mOwwkVY4cOwRERERERERERE49hgPwYrXIQVPgxLREREREREREQ07g3eY7DCRdhefBiWiIiIiIiIiIhoHMo8Bpt5UnMw+Aav9CiyevVqwzBEZP0D1dWVq3rD7uxluqXVsQeEpgvL5k0Hj9YWXf1R2DgamgAqv1mrw5ajb8AKTsrSYdqO69DnC8EKVhbYhoI5F8HGbTs26dAIJEBZOwgruOkeHfrR3wsk7RSskIg1gcZNu2HjVNYZOowY4Nj5FlyKK2xN6tDq2AIbp5PtoEJ3vQ7tBNhpIuL48nXY1nBMh4GyhbCCNQGcw27rVtg4aYNdn2wBO9PnD8AKsVCpDre98jxsnNvk6LAuD+wKd9NBWCEw/3IdPj5rpg5T/lZY4V8LwIG+5z33wcZPZh3V4ct/OKzDac9lwQrfP/cFHV538e06PJn/CKxgHQJnYPeRvbBxqh1coaYfnFROCpyrImIYoEtxXXDgRAR2ggZsOjK46NrffwLszI0P4Cv0PWeBS+mxV9OgaTIHVgg64KSKRLJh45auRh02PvRFHVbVhmEF07V1aFv4ck77QWcV+B04h5/+88fxx1VN1eHd/wXGr08cuR9WSPaADXZuKIKNZ70MxtayqZN06KbA0CMiXYc36rCzC+wHSeNTQky/zsJhvMHBnHIdOj7Qe6RtsB9EJNUFJiSpdtxhOn+q0+G09g/r8MfXXg0rrDs7qsPvCNi2i+QuWOFi83EdWh1LYOOiCOjMg62wu8OdkjGie6BBgr6ygZ+3MFC37cKd6eJZLty/hsfH2ah5+57ndHjo4fNgBXNOgQ6XhV+DjR86904dbllwQIfpK8BlKyLPGODcXvgAuG8qXZgHK5g26Ciu/OBVsHFkeaEOi154rw4r7gWDu4jk77pChz7/izoM+vEY4aL+J+DHt4qRwgoddnWd1KHlb4MV5paU6NBfAGYpInLP2md16HwHDChTkzthBV8YnD92HGyba+IePpQDjpEvGIGNy6um67Cq4lYd1u3CB3TyfHAXWTpvGmz8QE+HDtMu+HZ7N70JKziH7tFhWXKbDgNhfP5Yvlwd+gzcD9tpcH+aQrd7aQdNq0QcB1yhI2Eu6uKtGCjYmfcz690O8Cdwy2IpMLiLiLSDAdc0vR7gG5zdfOpVPY4GPlUGcgLBGyIXLU2IiERbdBY2wX1ESd6HYIFdf31eh2YD+jh0cYlIV+FEsA17HoKNg1loscgPJrQdrQ2wgj8Mblo7bbwGZTfu12EgBIakvBx821I47WLwcTHQsnXvLljBaljb9z8H+xlNPgn7N3wYloiIiIiIiIiIaFzZdPR+EVmxYsWgPgYrXITNWL16de86bO+uJyIiIiIiIiIiojEssww4eL+PK4OLsP8rs7u5DktERERERERERDQeDOrv48rgIuz/qqmp4UsJiIiIiIiIiIiIxryhfAxWuAj7FnwYloiIiIiIiIiIaJwYmsdghYuwb8GHYYmIiIiIiIiIiMa21zd9vPeHwf59XBlchH2rzK7ftfPfh3dLiIiIiIiIiIiIaJAM5bOYhuu6Q/Zho0VNTc2aNWtEpLpy1Vv/zADL1sFkC6zTnejS4dwl74aNe265TYfTJzs69O/thhWe+frHdejETujQtCxYISuYq8Oc2dfAxidabR1ah2t16Fr4HCvKKQPbUDRFhy0tx2GFWHe9Dg3BH5edVaLDsks/o8O9HbCA+FvrdJgXBMdIRIzOgzps3PukDiP5U2GFqDUZlG3fBkKfH1bwF8zWYTAPlBURp/OQDq1ARIfpWBusEGs7AMqmYrCx2GmdmQ44M10D7+HA5HPAts24Vof1/nZYId0FrlBpRqFI96WGDs2CO3V43ZmtsMK3toPD9FQc7Mwvlk6DFTqP3qDDnI0TYOPsXbt0mB9/EzR18TFy3RQKPU54Aftn1HFR7+G3ArhxFAwHiUfBq2z233k3rDD/0b/q0AzjHixpg8MBd7rXoB4KF4EKufhks21Qxo41gI/racaf5yRAhdkf0eHBVfjvgxdf/Hsdzp5VDht37f2hDi9MFOow2Y330DM/f1aH9S/crkPDxBX8ftBhRvImwcZpF00nwjk6tA0frGCnUS/qD8PGxRVgOHDK5uuwLQB2mojM/yqY6nwp9Ssdrv75vbDCZ1sX6jDnxffAxsUp0GFmN4Jj5Nq4yx0bndLAoDmqgULx6ihcMLXzulMY0P41DNDc8Ofp0Il34k2bdJUO459VE3UREXnXZnDCP1gNLsb6nctghZk/Bz1YVhnqRe0orFAx5wIdLv74rbDxM2eBIXv9N8GtQcmji2GF8jw0VDWAS8bvx4NauARUrjwT7HYRaT4GZrmWC3aaiWb7IlIoYP5zdNlNsPGOp8HYOqWrSYeVVRWwwoEX79JhIAB2RU75Ilghf+IcHZZMB6GIzLzibB3uaQIXY+sL62CF4tngHN7chS/GvevA01vh/eDuqTwB7iNExDXBscuNgBvDUC4ehXPQ/jH8Idi4q+GwDmPt4Ka1B93riYhtJ2E+SOB+h32gV5dr4tyjJ8ZbAT7Qa1oOczjL9RwrBzTF7L+BjcwDao027pQ32DA9DqgJeg/HBteRiPisoA5TSdRh2njK55roQBvwK+OdBit43WWbvmz0ceAru0m8LGD48kEYLsbblgTjfnFplQ4Dc6+HFeobwHBgNe/UodPx1jDzGtKhXBflk7BA5mFYvhmWiIiIiIiIiIhozMgs99XWgkcJBw8XYbHMYeA6LBERERERERER0VgyZL+PK4OLsBh/QxcREREREREREdFYknnacuXKlUP80VyE9ZQ5GHwYloiIiIiIiIiIaGwY+sdghYuwb4MPwxIREREREREREY0NmecsM78OaihxEfbt8GFYIiIiIiIiIiKi0S6zuDdcz1xyEfbt9H0YluuwREREREREREREo9eKFSuG5TFYETFc1x2WDx5Fampq1qxZIyLVlau+9Muf6gZe+/DoruM6fOLnt8PGiWSPDi/7f/eApqu2wwr//WewpJ792d+CMLkDVjBMQ4eO68DGphsCjSWBysICMnXiQh3e8NUv6fDXv9kIK3TtfhRsWKoTf14qqrNg1gQdxvLAhomImVWqw+LJU2DjYDFoXL9lvQ473rwLf5wV1qFrp0AoNqwQCObqMKt8KWycPaVah0kbnBLicUpIKqazzuNbcdvGV3VYVjQVNJ0wG1ZoPAQqpKOtOjRSeP+kLbB/4FUgIlYSnVeuD7T8wB2wQuP1X9DhdUee1eEvmq6DFXJuB9tWZZyAjd0AuPAMf0CHdqodVoAMwftnLPMYJL/4ua/q8NrbwElV/rPPwQrFXwS9RHawHjbu/543TNznGiY4+q6Ac1hE3BQYkly4L4wBzCJMG34crnDhz9fqcO6NX4aNpwgYkiIuOBxPOXhP3v2jeTrM+cnjOsyTI7BCdt4kHboW2DARCYdADx+pAP1zYxO+QmPNB3Xoi+Ntm372+3R4qA0cjuT238EKV98D8r/mX6PDTb8Au11EgnXzdZizzw8bF3cd0GEodUiHjgsmHjLWO6v+X3WG4bUfQO4KGN8HtB+9psQhPzjhjZwqHVpuElaINoNz27Qt2LirCgyjn33m1yD8KZ7yzfopmNIEjEYduobHpAhZeO1/wnzP4vN02LEZTPjnzT8DVtj78AM6DOwHdwGuiTd49qQFOrRu+C5svOfhWh0WTgCT6qgDhh4RSR/fpMMOoxA2Lp9YocMz332xDh984kVYofDlH4JwQqUOc6dfACtMmrdIh1MvwZPqbQVpHdYfB7ui5znQ14lI/TP36TCvEdxHiIhjgY9zfCCcUIhm2iKhbLDnS8rB/smfgqflqaLpOjzRhvuPjkO7dJisB7cM8YbXYIVkvE2Hp97te3WtsK7fB8b3UCgPVoBXnZ2K48ao306hxq6DO0zXBfc+I2FYHLyFp4ENVWhDfBaakPjxAbUTYG7muuCiExGfCaZbkVzQrSUMPGlMdoCOwkAfZ3qsvNjolDgdK4EeOx4Vtiw8ZAeLQe8aj3aDD0s0wAqXfujzOqy+YI4Ob//Mv2aeraytrR36t8H24pOwfx9fSkBERERERERERDSqDcvv48rgIuzf1/elBO+9qmh4N4aIiIiIiIiIiIj6aXh/H1cGF2H7ZXgPEhEREREREREREQ3Uyuv/9iK42lrwRp2hxEXY/socKj4MS0RERERERERENFoM74sIenERtr/6vpSAiIiIiIiIiIiIRrLMY7Aj4d+4cxF2ADIHjA/DEhERERERERERjVgj50UEvbgIOzB8KQEREREREREREdGoMBJeRNDLN9wbMMr0vpRgzZo1IvL1j3+qN1y3/9Owcdtlh3W484PfgI1zf3BSh8fu/p4Ozy7/Mqxw1vW36/C5P87V4fS1R2EF1+jUoSEGbOwYcZhrpmHBPD87R4fZc8t1uPOX+G8L8t9ztg6nTMTr48mmXToszArosLHuAKxgmDEddte7sHFOQbYOI+ddp8O8ilmwQt2Ld6CNANdsquswrACPXAztBxFJJqKgQqgENA0VwAr+CMh9xQtg44KiUh3OqijUYVb5ZFihYxbYb34fONnWr30SVsiywHllGPhk86Oz2Iq16LBxza2wQtEDoMT+fwcX/tevnA8rfDHxLh32/LoKNs6y9+vQtZOwMeR17Y83rsdu2PDSRh2uTVygw+nGTlhhf+AMHea4jbCxYYLtcF0HhA4IRcRxQA/mBX4c3hNeOwhug5XWYWXxNNg4/tj9Ony94Guwse/KP+lwumzQ4XktT8MK33eX6zBtFeswJ4G7/WSiB2xYdi5sHHcjOmzavVWHjkcPbzqg055QijvM7hQYO3q6OnRYUTYFVmjc2KzD3bv/QYeRv7wOK8xJrtOh40/Bxq5pg8YG2PPjs6fq/3eGvcSA4NPdE960RBpMGkM9YAR0S8DUTkSkC/SNjg0uOhGJHF+jw+9f/o86LPxnPOCmF4PxPbAVTMyyQmA2KyLzpi/VoX/5FbBx2643dbig5nwdbv4F+GoiUhxvAqkJpzT4lGhqbwDhvT+GjX0mOC/aWraAltkTYQW7HUxHp08FO01EcqeBfunxn9+lw8KTj8MKgaBfhy46Xa0cMBcVkY4s0Ls+fwRPGt+ceEyHjpvQoS/VBitY+eDj7HbcYeZmg20uqlyiw7xKfMKXzV+ow9KZk3S4dT/4FiKy4/U9Oow21+GPKwb3F+Wzq3W4vxHPoETadQQ7qwGNEF6NA/6wDsOFM3RoB/F9aKoHHGhHWmFjJwV7NvT9PG5bxAVjKG7Yz3bvpEy/Z5ID2YyBDfkerQ00d03b4PoyHHyF4j3v8TXSDpj9drYdhluGPw19E9jU7veh9yrb+wcgQ0s6ruPxcWj32Gg/iIg/BjqKaz7wTzo8/6bLYIXyBaCjuGnKv/b+sOno324oRsKLCHrxSdgBW7lyZe8PmcNJREREREREREREI0FmyW5E/XonLsIOWN/f0MV1WCIiIiIiIiIiopFmxYoVI+cxWOEi7DuzevXqEbWUTkRERERERERERJknJjP/ln2E4CLsO8SXEhAREREREREREY0cfV9EMEJ+H1cGF2HfoZqamtra2t6fQ4HzhndjiIiIiIiIiIiISEbeiwh6cRH2nev7cliuwxIREREREREREQ2XOcai3h9G2osIenER9pTw5bBERERERERERETDK7MCOwJfRNDLN9wbMOqtXLlyzZo1IhIKnFdduarvH9027aRuP3vvB2EdY0ZAh/9zRbYO16/aBitcvR68nfbZFd/W4eGX58AKU1Ov6dD0GbCx49g6dFFLG7UUkWMnD+hw52Pg25nmZFihqxSEByQCG589ba4Op158sQ4PP38YVrC3PKxDy26GjQ9vfEaHxWddp8PCRfNgBWvqL0DZ+7+pQ9OshxXSLjggbrwNNg66aR3mF5TosLXpTVghkDcJVCipgo2LShfpsOz9F+kwUQE2TEQirqPDeBO4jo4fS8IKE176mQ7LF10JG8+pPkeHeaXFOqzfCq4jEdm3/hEdnrgDfNy9P14GK2Rfc7YOuxZmwcb+/bk6DPrAznRb3oAVxETXPjqpxjr8lV/Ztk6H1Z+v1uGWk3j4PyOxS4dWNjiHRSSZTnhuYP8YgjtzDH3pAR17+GGmAf7qt7B8Oqzgm3+xDi9ItcLGs00w0CQSLTrc8yauIEnQmRtRNKA4nbhAFHRKqVQcNnbNMPi4dEyHvgC4lkVEkh0663DzYNvoRjBDKChboMPJl9wIK7y+7nUd5q9/QYdFxjFYIR3CnTkET9eBncMkIt47DV7Og7h/0efFEuAcNo6vhQXCBdN0GO84AhtPnrpUh9PnzNfhwVfyYYW4ATqK3CnLdVjggG8hIrsOgksm+h94jnHJ9Z/R4WPHQbfv7t0JK5RWX6jDfBPsn93H8SyutadJh77uZ2HjQLhAh0svv0mHoXAQVojFwbR8YTW+Q9mXPVOH1WhCu/2RJ2GFpI3G0BjqRbe+BCs4WzfoMP+sD8HG7pFuHXbtA4N+YDvY7SJS4jTqMBgBu11ESmaAOWpkEri/sCI5sEJ00Wwdfq8NfGX7PjD5EZGJ9eDKnVRaBhvP/cB/63D9dnA743aD/SAi/iAYQ1PpKGp7Gjq2RApUTjXtA03Ng7CCGSrSod1dBxu7ktKhZYH5oSFg4iEi+N4bOU3d/qmW6f//7z0XhTNXXNjj40Dsunhfeuz5gXzcgDbtlLlo/5iGBRsHAmANKpHsOsVtOHPBZTBf9NnbdJh3KZg0XmC9CiucOwV0KSPzRQS9+CTsqer7UgL+ki4iIiIiIiIiIqKhlFmRG7ErsMJF2NOCLyUgIiIiIiIiIiIaepkV2Nra2uHdkrfHRdjTI7PQzodhiYiIiIiIiIiIhkBmIW7Evgo2g4uwp01muZ3rsERERERERERERENjJL8KNoOLsKdN35fDEhERERERERER0eDJPAe5cuXK4d2S/uAi7OmUeTksH4YlIiIiIiIiIiIaJKPoRQS9uAh7mvHlsERERERERERERIPHl3te7w+j4kUEvXzDvQFjUG1tbe9T0P/w/AvVlatQJqp1AAAgAElEQVTe8qdLw/j/unuWX4fOgRt0uPvKQljBOue9Ovzqr5/Q4Q/W7oQVUucd1KHPaYGNjX6HXnFTV70O3/jd/+jwgsv+DVZ4uvGYDs2mBti4e9FMHe6dUKDDk4cehRVyojEdBqKNsHGya78OndbtOpz2sf8HKxyeN1mH0errdBh8CnyWiFjpDh0aHofDTsdB41irDrNmXAkrBNrBeRXKL4aNDxzr0uHh7/1Wh0tvBFeBiOReCL7IU8vu0mGsPgEruAboANMn34CNK+Z8QIezr52ow5Mfq4AVzKc+qMPm/7hRh8VGN6wQfBz8nkfDtmFjF/XutpEGLb2uW9fFfzDOeF0yPQlwDr/64Pd1OKsnC1ZIB8FFZ4NDNFLAHeEKPk9CAfCtY8keHbacxD3YvKyoDiMLwUUnImvjc3X4vuZfgpZuEFYoKt2iw/TSd+vQ3fAqrCA2OKAOCkVEzEA/Q6d9NyxgWOAijzWAbyEivsgEkKbAGLF75wlYofkI6OGLDDAKuxbulLwuJRpUXv34UB8MA3ygibYiGMqFBVJJMAfz+n6pBGiclwemfL7dR2CFZVNydDhz1ed0+PSzh2CF6JY/67B8ajZsvLsJ9Ev+7z6kw6suOwdWKLpyuQ4ffxR8nHnk/8IKhg/sTL8f9VQi16z4qA5LvnCZDrc8h0fAs6eAcOuSl2Hjp391UocnloEZ+Iw1+JSwwuCLJNAsV2LtsILhAzuz6bkfw8b+pKPDCrdNh74Q3sOh4nk6DPtAKCL2ZHD0tzeBWYq7dw2sUHAI3D3NnQFONrMsD1bwRRbqsCgPNz6wrU6H/gNglMkvmwYr9HSAUyKN+hnPThAZ0MTXcdCtk4sfcbN70Nhq4OEyJwzungxfSIdd3eBuemzzHrwGMKzBAw3/f9MESzQiYjspVGFIh9b+fwsR8Vngi0Ry8U2rT0APlk6BObztek35wIWwfc8rsPESdDMbyvurDs+twj1Yr1HxIoJefBL29OPLYYmIiIiIiIiIiAZD5l+f19bWjooXEfTiIuyg4MthiYiIiIiIiIiITq9R9yrYDC7CDpbM49BchyUiIiIiIiIiIjpdRtGrYDO4CDtYampqamv/9gJHrsMSERERERERERGdit4VttG4AitchB1UfV8Oy3VYIiIiIiIiIiKidyaztjaKfhlXX1yEHVyZl8MK12GJiIiIiIiIiIgGbpT+Mq6+uAg76Ebp8jwREREREREREdGwG72/jKsvw3Xd4d6GsW/16tWZpdjqylWwzdYmnw5LLUeHYSsNK/hBAbl4yXwdTv7jP8MK3339HvBxH+uAjct61oLUNEB4yudYdqQI5u1WlQ6trgOwsS8rrMNA8Zk6jBXOhRWseJcO0/VbYWOz400dOk63DicVToEVqj70TR3ujOXqcO+Lf4YVSnfeCzYsgP/qxXbweaVZVgjmZWd/QoctnQnY2GeBzQgkm3Q4e8EcWCHyvst0+MvY73QY274ZVqjYeb0O/8ndCxuff8U5OnQ+VKnD6pM/ghV+sPl/dPin1zfpcLkvCSu8fMetYBuMFGwsxqled4agy5neHu4CB3AsRvJudwV8kaAPdwiBXHB1xOKgD5xZVAwrLP/K7TqsvwT0EiKSzHoZND72Sx0Wbt4JK/yxrUCHrXUf0WHxgxFYoaQRDIuBoB82TqfBleumozp07BisYJho1HfAtKG3NUxBZICxUjxGctcFMwQDf9ZpmAzQKIY6NtOwQGrh6wuWsFN4jjqjDMwcym/+hg4DIXyFFk0G061H3mjVYdc9X4UVQk6DDn25eMqXToM5WNXSa3SYKAMTexHZtgdMJwJbQaeUncATVzhtWDDlDNj26m9+W4d3nblDh4uOLoYVThwL6PDVA6/CxoHnQM9fGsrXYXLvs7CCXYdy1FcZ8LQUcV3U2rFhYxHQFbtoDxsG6sk9ctdjrm7lgRM+t7Jah1PPBKGIBM9cqMPXfODj4rUbYIVzp4CxIzgJzARE5KVXwGS7bOESHTZtXAcrpDeBybbjgjHUc1oFY49hCs5/cGUDfxxsXJxbDhsXzLtChwd3PK/DVMdh/HGDM5f0GsVH7szVg2mCy9mygjpMpfGdrOuCa3+I5/DwtAygbyEi+ZPBoodVNA82bjv2hg5z4id12JMAE3sRKSuYqMMTk98HG9dtBksZpTl49juqXwWbwSdhhwJfDktERERERERERDRQo/1VsBlchB0ifDksERERERERERFR/42BV8FmcBF26PR9ZJrrsERERERERERERF7G0gqscBF2iNXW1g73JhAREREREREREY1oY+OXcfXFRdghVVNTk1mH5cOwREREREREREREb9F3BXZU/zKuvrgIO9T4S7qIiIiIiIiIiIje3lhagRUuwg4L/pIuIiIiIiIiIiIiLbNWtnLlyuHdktPLcF13uLdhnKqpqVmzZk3vz9WVq9Jdx3WbwpwiHQb9IViwrh1UMA1Lh6v+5Wuwwhsfn6zDp14+BBsXfvK3Ooy4B3VoiAErQPB0NDwLgD8wxOdR2UaVwf7x+/Aezqr+rA5bjuyEjc26F8E22E3g4yw/rDDvzHfrcMlHbtXhutc6YYU9935Bh4H0YdgY7nvXdTwaA5YJ/lLHDU+FjfNyc3VYcPGndNh8GJ+BoWxQoeXQDh36usFpKSIrPgV25vyPRWDj0sAxHUakXYcd8TthhVteiupw3vI5OmyLh2GFrdeX6rBq2wOwcVHuBB02dzWitgMaBfDVOICLnDJQ1+Y1KI+IPYw2wjIDsK1rgY7UTSdQ1TSsUJIPhqSln/85bPzsdZt1eHDTn3QYf/McWMGZvFWH6YdydDjpGdDPiEhRPghtFx86N9kBtsGO6dDnwx2CnY6DCk4SNh4kBhyeOa8kxWN2h2ZxhscszgWzOK+zbc7Uah3mXPuvOkyeOxFW2NMCKif2NeiweNseWKFn8y90GO0B80DxmI5KAAz6aQd3KY4NJmw+G9waeI0mfgt05ssuXgUbn/HJj+rwxLmv6PC4gOmTiOw5Bo7R+RtAty8ieVOCOvzltx/WYcH6n8IK4gejDxxwvTswfBbDprhrHLSbbtMEw4SVPUmHuVXLYYW2yWfqMNXdpcMlM0BZETnhL9bhgQd/CRsXmT0gnQa2Lb7zOVgh1LVJh44LhkUv8KIzPI4/PHamCTor16MHm1k2TYdTr/sEbLz+JTDN6N56N/g4E8+g+j8Qn4Z7gBHMh7o1EXHRzMpJgxmUY4PbNxng+sYgMU1wDgeCebBxpGyxDvOrwIUvIlkFhTo8tnWdDjsPPwsrOAaaEyebYWPIlzt5jP0yrr74JOywGUsPVBMREREREREREZ2KsffLuPriIuxw4i/pIiIiIiIiIiIieqP9b0/djrFXwWZwEXY41dTUZNZh32gDD3gTERERERERERGNbWN+BVa4CDvsuA5LREREREREREQkY+6XcfWFXx1NQ2Py5MknTpzom7zRtu6MgguGa3uIiIiIiIiIiIiGUuYx2LH3y7j64pOwIw6fhyUiIiIiIiIiovFgnKzAChdhh9fKlSsn9REKhXpzrsMSEREREREREdHY1vdVsGN7BVZEDNd1h3sb6H/V1NSsWbNGRKorV4nI7GnzdJvyq26G/29dY0KHux75qQ7LpBlW+Md7fqPDxrM3wMY/PPiiDt2lW3SYFWiAFU6dx7nrdUobp1g4L1ygw3jRObBxIh4DW9CEdprhwAoFWUU6vOYTX9ThuZ+fAit8+NBxHUbO+y5sbNngMLkCtw3vHwPtYdfzcAD+vNk6TPvLYOPyCvCt537kYzrsqG6HFd7fAw7o5Yu2w8a+V+/VYU85aJkdmw8rpI7/SofL0206fPPARXgbfg++8pLsWbCxmV2ow851X9bh9FJcoaMHbFtLdxNs7OChBITwPKFRzPN4Wjpy3bQO/ZYf/v8hf1iHKz8DzmER6XrfYh2+kXdAh+tTh2GFzh+ADlNeaNHZ9MN4WMyZBHqwnoYdsLG4SRAa4K/GDQPsSRFxHVDBQaEM6LrzbIj+gHNI6h84GfCYNnjXUEx0yYhIIJCjw6xKMLb6r/4UrBDLApV9C8A2dHfid7vFf/QHHVr7wFxCRBwXzOENdyD7B12gcP84rg0LTCqo1OG8D/wHbJz17kU63LsE3EesCoH5sIickQjq8PFACjb+0dardLjg84+BDWs9BCtsPQTuUOCQNKBZ7mngVRVtxYAm1QZ666ARBJNDESk/5590OO0y8Iq85x59CVZI7wMjY1U+HpJyCsHcPmCDU6XMwqdEOg2OXVtHqw6zwlmwwp6Th1GFY7CxD01UXBfcJZ191SdhhblXXqbDp7fjw3/ovi+AbYjt0qFHF+h1/gCjblLudQ2YBvoqBu6f4bGDHcIIuW2B3zoSiOiweNr5sEJOJei0k6ULYeN9Bw6DbXgDDGpmdC+sYFrg1JxVeQZsvL+5cdPR+3t/HsO/jKsvPgk7smReP5w5EYmIiIiIiIiIiMaS8bYCK1yEHWlqampqa2t7f+Y6LBERERERERERjTH3v/6T3h/GzwqscBF2BOq7Dvu75780vBtDRERERERERER0uozPFVjhIuzIVFNTs2LFit6fuQ5LRERERERERERjzLhagRUuwo5Yq1ev5josERERERERERGNGZnHYDP/Cnz84CLsyMV1WCIiIiIiIiIiGhv6rsDW1NQM78YMPS7CjmhchyUiIiIiIiIiotFunK/Aiojhuu5wbwP9HTU1NWvWrOn9ubpyVZaRhs3Kzl6lQ2fZVTrcds//4Aqda3V46533wcZTrvqJDm96fq8Oc97bCitY4agOHceGjfvP64Q2cGPYHLbFqWngv8lwfXkg9efqzIke9vg4UPnCxZfq8IO/+SqsUC3P6TDwq1/Bxkt+2KRDO5zQoeM6sAJkeO0fVCTkD+vwustWwAqb33hVh8cS4OMuvfW/YIUF/9YDQvNPsHHR5j/rcGKdBZrmz4QV1n/6jzrcsCiowx8ti8AKLdF/02H5H8BOE5Fyq12HFee8V4cFhfjjIjkhHZ544jewsb+nRYc98W4dHm48ACvAa9fwuBhpWAyguxSxrIAOfT5wuqY95iHvOR+MXxd97VOw8fbKOh0WZz2qw/9avxlWaPzuIh1mbdivw3JnB6zgK5ihw3TbHtjYcVM6NAywO2eUzYYVDjQeAmXtOGzsfaDeaTuiU+YxYcMxHA48ZnG4sRUu1qE55TpYIXv+ch12LS7R4YkjG2EF/4sndFh8/HHYOOR06jCWjOkQTp9E8KXr0bniNDeUr8OcGZfAxgUf/pwOe64E3d0/lv0QVrh8E5ilOBUXwMbpsE+H/xIGM+0DU++FFZbNO1eHiQToMHcf2QkrdETB7cyAzsDTwKNq/2/nZyzGJ3zhcrAOsmFvvQ5z2xpghYuvrtZhVroDNq68ao4O1+aAyuFNZbBCsgdcCO3bjuhw7yZwvyAixp4/6NAfwLctiSi4S6qefb4O53/uK7DCT9a+rsPUky/AxhNan9ahge45PDuE8WdAN/XQqV+0A1yFALKC2bBC+bSzdRguA7ecMQG3byJy/DC4OmJd+Aq1ogd16ETBtNNrJSQLDShxK1tENh29v/c/x+0KrPBJ2FGh7/OwmbOWiIiIiIiIiIhohOMKbC8uwo4Ofddhnz8yvn55HBERERERERERjUaZFdgVK1aM5xVY4SLsKNJ3HZaIiIiIiIiIiGgkW3fiL70/rFixYvXq8f5MIRdhR5PMOiwfhiUiIiIiIiIiohErswJbW1vLFVjhIuyow3VYIiIiIiIiIiIayfo+AzvO30KQwUXY0YfrsERERERERERENDLxLQQQF2FHpZUrV/b+wHVYIiIiIiIiIiIaIbgC68VwXXe4t4HeidWrV2eWYqsrV3k1m1JYpMPUlV+Gjfe+9IwOgzt/Dhtfd/NtOgx/39HhHX99BFZI3bFch1M236ND20nDCiOBKwO4gs6dd5EOX9/3KmycSMV1mBXM1uGnv/QtWGHmJybo8Lf+KbDxz6bfrMMldUd0OG/mAljBtm0dHm08BBvHbXBMC3LLdLjytq/ACpd+eL0Oa4ru1uGimWfACuaMc3S4/6dgp4lIfMM/67CuEXzln7VGYYVgytDhEweadHj/vHxYIXLJJ3XY030FbDzpS/U6rMy3dFg1rRRWWHA92D8NoICIiK8ZXPvp4w063Po73KU0Hdumw+54FyjrpPBGDA5DwIGjv8swwH4zfWEdluSWwAorvvdTHUauBqeEiJx0O3R4Rgj0rt+7DwxeIrL2xU/rsOqhXTqsyEnACs3d4HL2+ttu1wWn8byKRTosveE/YYUXvnOTDo0AbCu2Azorntn0FgOa0owM+Cz2mWCsctDFaPhyYYVQ5SU6bAiBWUrs2D5YYXIJGFvDBaCCiHRuB3enThTOoAZwjOD4NaCjPKkQTxqXf+0uHT71rg067DTbYIXXGmM6jP3qm7CxGy7XYbgKHOXymbjCqm1zdXjk5U0gfPrbsILjgg0e4hmC95EDf1KWN0mH2QveDf//Ha1+HS6ZAqajl9x8GazwcjG4bTm8Bdy2iEhLITgrymeCCjsT7bBCybfRefXaH3RmpcB8WERmTZ2vw/pm3DjZcVyHWdPfpcNjxYthBdMG8+TAuq/BxmKBA8pFm14DugpO/Qr17jBhZdw47M/S4YK55+mwYsXHYYXuplYdtsd9Ojy27yis0Lr7OR0WWXhSHW0DRbqT4A7XCOE5vIhsOnp/7w9cgdX4JOxoVVNTU1tb2/tz5hQnIiIiIiIiIiIaelyBfXtchB3F3rIOy6VYIiIiIiIiIiIaelyB/bu4CDu69V2HFT4SS0REREREREREQ4srsP3BRdhRj+uwREREREREREQ0LLgC209chB0LuA5LRERERERERERDjCuw/cdF2DGC67BERERERERERDRkuAI7IFyEHTu4DktEREREREREREOAK7ADxUXYMYXrsERERERERERENKi4AvsO+IZ7A+g0612HXblyZe9/rtny0+rKVW9pU/zQ5+D/WxYs0mH7hd+AjR9+6D4dLt9SrsMv3/9jWMH90jwdfv2ys3VYHmiCFRxfGuZDyRAD5q64Oqy88DIdLvzK12GF39/yHh1GY5063PPsOlhh6opP6/AbiZdg4+bJ5+lwn32FDqecdRGsEJ11oQ4PPvYybOxs+R+wDS1HdPin2/EZOGHR3Tp8dssLOqwOLYYVCq/YrcMb/r0HNn5489X/H3v3HV9Vff4B/Dl3Zu9NCIQV9h4CIgLuPXKjqF1uWzvUVts6am2rbX8/rba1bq0D0dy462TIEBCRITNsCISEhOydO87vj/vr7W2ez0V2Qvi8X331BR+/eXJy7jnf871PDufqsCGnvw6vaW2AFTznt+iw/5kv6dC3F29DVUkvHZ5//jw4eMsbETpM/ODnOkw2wEElIk4POL829C6Dg/dlgW12TNuowzVThsMKSfeC4yd68f/qMC46GlawWx069PnxLOGwOXVY21ytw3ZvG6wQ7tynAL/pB6kXnAVVjWC3i8j6f83RYd60s+DgS6Pe0WHUliIdrmruASv4epTqMHL4FTqcOhMcqyLy9t0uHaKjUkTE4wNhfGyiDtfWRsEKhgl+j24I2u3U7cA1hqBJKdw8BStE2CN1mBybBitUNVTosNUDzvFwrBarDo0wN4jAKcVvohNJxBtm5gfaD8C4dc8CHcYL2ODYMBVSc6/SYdX+TXCw0Q6urQkxYM+3t+MVQgvK4ascfuEKZKf1hIMbnOBQ2VDu0eGUPnWwwr6WZ3SYciF4HyEi2//eqMONWzbr0Bj1Nayw9EpwSFTN2qfDOD++6Fut4F1zuDXGcVohwFNGRBw28HI0O8AFpXzDalihp5TrcNJNj+nwxSi8aMzeCN5FRtfjMzQvMUmHqyI36NBZEQsrOKvW63DkdLBWt0wA72VEpHj+NzqsXf8LONg0wPzTuPEtHcaeczqs0D73ITA4Og4Ormup1SEXnQHh98Nh7CE43VkMUMFi4EtSbESCDvOG4/fII2+4WYcthl2HpQZ4eyIinjhwOagvBRfc3D7NsMKI8+/V4acP/RQOlmYwb9tiwPqZHdgjwzthuyHeD0tERERERERERMccO7BHjE3Y7ol9WCIiIiIiIiIiOobYgT0abMJ2W4E+bH5+fuCv7MMSEREREREREdGRCXaWCgsL2YE9AmzCdmcul8vtdrMPS0RERERERERERyy0A+tygY9DoG/FJmz3xz4sEREREREREREdGXZgjwk2YU8J7MMSEREREREREdHhYgf2WGET9lQR2of9eOtrnbsxRERERERERETUxbEDewwZpml29jbQieNyuYqKigJ/Hpczs8N/tbTX6C+JiEyCpZrSpoG0Ya/Oott2wAozbrxHh8bM63T4p9GTYYU8Y50OfaYPDjbEgPlxYgo4s04be5EOr3v+l7DCpxmFOnz9lkwdZn7yMKzwm1dn6XD4DPAaiYj9ufd0+P2FD+qweNl9sELedDAdb9+xDQ5u3r5Gh4l183VoWvywgtMWocN+I87T4WmftsIKZW8+rsO9A7fDwZE9KnW4qtcPdei3eWEF0wCHRGvKJB1WTR4FKzTFV+iwz/gCOPj0a57Q4YUGePUXtPwIVshtHaDDXVIHB7+9DvxKL2IFOBn39FkOK3jeBhNFr6/adTh1QDSskNKnnw69tig4uGpHMRjcVK/D9qp9sMK+KrAza5oOwMHQCZ6Uwnw3nJomOO+O0waHW4VkJvbU4VnX3QIHG/eCcGb533R47gufwAq7Vj2iw6smXqPDz677CFaIHPKuDpNiwTEsIs2t4IKbEJWsw2rnYFjBWrdeh6YflJUTf7CdeuBF//ixGFYd+vH6B7/0idFgdTfs7O/qsF7iYYWtHz+mw/goPDguOkGHfrRt+2vKYIX6llod2gz808VExOqwoQXM8DarDVZobQcrh5g4sAbrN/lqWGFfNXg5PHiJKtIILjTe1gYdNu9fDQv4Wvfr8LBOfIsFXMdTU/Pg4MgzfqrDqJ+k63Bn1iJY4f7o53Q4tfIcOPiF03+uQ+MmcLAtvX4KrPDRinE6TH24tw5jip+BFdITsnRYXodXCBB8McJNHPDQtlmdcLA9IlGHfgsYPHD8hbBC79On6nB3dAb4XvH4Fq6W/uAMlaowa7Ccch06UzbrcEUjfhdw5cdn6nDIQPAjP//+HljBW/hbHcZ4wIaJSEwkmFJqneCQcGSMhRWSHY069OxYDAfvqdqlQ9i04aX94OC0JiJWG3grEe0E4YjTL4YVxl19qQ7L0+Lg4D37wAvlTwfrw43tbbBCa7VDh4OaQbg9Hi87y/8E1qgR6/8BB1vjenRI2IE9tngn7KmFzyUgIiIiIiIiIqKDWFEymx3YY45N2FMO+7BERERERERERAQFm0X5+fnswB5DbMKeitiHJSIiIiIiIiKiDkI7sG63mx3YY4hN2FOU2+0uLPz/R46G3mRORERERERERESnoA4d2M7dmO6HTdhTl8vlCvZhhbfEEhERERERERGdqtiBPd7YhD2ldejDLi/HnxlNRERERERERETd1araRYE/sAN7/LAJe6pzuVymaQYfEcs+LBERERERERHRqSPYgS0sLGQH9vgxTNPs7G2gLsHlchUVFQX+PC5nZjBPcxhwvNcercNqj12H0VExsILPmQrKlnymw8nvfggrPPt1oQ77PfgCHOw323VoCP7pjpO+GXk6HD3xTDg44v4rdLi95wM6fPHBTFjhV46zdJh/XwQcPHBHrQ7vGjBJh8VXwwKybN6dOkySNjg4oXmtDk2rX4dWqxVW8Pm9IDXAL5Yy4vH+2db/Wh02PhUPB8/vsUiHzxf+RYcv3fUDWCHH+yXath46rKgphxVqnCN0GBWNz6/EQVN1OPjJkTr8U9JbsIIP/ZIuQpLg4IKWXjr8+kCjDvNeHgUrtOzaqcNEq02HP/zhUFjBgi5nJb3QcSJiq3PqMKoBHGw11T5YYdeafTpc+L/goLJY8TzjN8EBf5gX5cOYwQwDDsYVTLRtYRztKsJqAa+yiPQfA+bAfhPPgIMzhvXXYc4VH+kwsfQPsMLVjz+qw5Sl4GRs7ZUDK/gqq3QYs3sFHGxUgykFvvqGGeY1MuCeP34XNfTt4LYdm03osqtT/OPB0yshKvnQ67Z7weXS6/PAwR645/2gggVdFkVk0ozv6DB26uU6/KoMzJYiYm4G1/GsWLDWEpF4f6UO21KH6HDlaw/CCoMz0nWYmDcaDvahl8ms2a/DHVtWwQrRTrDKzcroqcMNkeNghepKcI3wNtXgbxePlsQNoIK5fxms4PeBVdxhrXLhKWe3goW9iAw560c6bPg1mJ+3ZSyHFR5O/liHk5fgl2POExt0+M33wWvkjcOH6xMr79Lh8G+m6TC5ZAmsULHpXzr0tYHdfkxY0frHGYmnFIs9SoeDxp+rQ3PwDFghPQ8cgdUDm3X4ubUUVvBUxukwJgavoLw2MFHEpTylw6jIC2EFpx+8nfnmE4cOB36BF66pLdtB2dYDcHDNN+BwbXKCl2PavY/ACmvX1umw4pWb4eDG1gYdenxghg93jp/g9cHRC3PJP4yVQKQDvCFKSgSTtogMmwDeJU25ASw7y3LxbtsHXiLZaQFvfETks+YKHTqWgpW2pREvv8f2H6bDUh84v/zvgdlSRFo/u0eH1oj/OoaDTyEoLCzkx3AdV7wTlv6f2+0O3g/L58MSEREREREREXVjoZ/Tzg7sCcAmLP2H2+0OPiKWfVgiIiIiIiIiom4p9GO4TNNkB/YEYBOW/kvoR3WF/kqEiIiIiIiIiIi6gdAOLB8Ce8KwCUsdhfZhReTDba934sYQEREREREREdGxwg5sZ2ETlgCXy2WaZvARsezDEhERERERERGd7FZV/P/HoRcWFrIDe4KxCUthhX5UF/uwRERERNO5gJ0AACAASURBVEREREQnqVUVn4V2YPkQ2BOPTVg6GPZhiYiIiIiIiIhOasH2q7AD23lsnb0B1NW53W63211QUCAiH257fVzOzEA+5pLb9ODoTat02FxfAyv7/T4d1iaN1OH8Sy6EFZ7636d0+LfNu+DgDRNbddivciEYajFhhaO3vXyzDre9UwwHTzISdZiYe5MOI89bDCu8My9Zh1O9kXBwbvvTOjw3C4w8sArvn/rLtuqw76x6ONhn9+rQYXXq0ONvhxXgRhimX4fltaWwQszKR3UYO9KAg1/85m0dZl63TocNX82HFUrmgItcZopdh3HpeGY2t76rQ2ujAw5u/gqcjNa7rtDh3P+5BVaYmvwnHUZ+1QQHv/TKb3VYnwpe/Tl/zoMVdnru1qF17nk6bLfjI9AxfL8OZzjmwsEN2c069Ag4O96uHQ8rtE4CR2bcQPDtGn9xJ6xgNG7TYUSY+afNA2YwEx3w4eAjO4wwkyCILQb+bW6kPUqHTe2NOnTY8KTUtgecX3LJtXBwnQN8uy9rwGv3m0Rw4ovIOu+DOsx25eow76FKWGHYuBk6bB4yHA62W4bo0Lv5cx0OvOAaWGHN+6/oMMqBJwS7FUw18FW22fD847CDypt2rdfhiP5jYIWmZvDqh1NZW6FD+FOU1eyFFVLjMkAFG6gQDvyRoyJi4OCaxlodDj+/QIc+L1j8iEjtnt06bCwBy4Zw27avGsyB4yZMhRW82QN1uHn1Lh36G/F8AH8Qb84wODh5cJwOP/aDykmrLoIVzrkH7MzGeLBsEBHL9iodxg4Ci6K8HWBqFRF7VbkON3+9EQz96FlYQbxgUspyeuBYowXM0NWtLTr0meDiFaihI7xSCvP1cLjThvdwTRO4+tR/EKvDAwVgt4vIimSwK3aX7ICDV10MztzcOBA+uhkfgc6EHjpMHAfm4bp6cC6LiDVqpQ69bfg9jmGg3YxeD4vFCis4I8C7gOik3nBwQu5YHVbUtenw9CGgrIiszAIH24q2Azr0F+OLvt9TrcNqK16lxEiqDm2XTtRhZdsaWGHv9mgdWnPACxo/EVzHRSSvB8jXbMXTnX/1v3T4s788qMO/JuPjp/adPTr0NODjx2KDO/kw1nGHteQ7ema4ZeMhc1jBRQ1ex9MHjIMVhpw+WYcTv4vX8I3ozeX7GaAtMMAJLqwi8rd1q3Vo9V8KB6csBdOgpQy8pfrd/wyCFT6IfEeHzY+DH3lUOl7nrI1Ilv9+CGxBQQE7sJ2Fd8LStwv9qK4VJbODZy8REREREREREXVZHT6Gix3YTsQmLB2SQB82+GgC9mGJiIiIiIiIiLqyDh3Yzt0YYhOWDpXL5Qp9ROzTj43u3O0hIiIiIiIiIiLthUeHvvDo0MCf2YHtItiEpcPDPiwRERERERERUZcVbL+KSGFhITuwXQSbsHTY3G538BGxTz82mq1YIiIiIiIiIqKuIPQG2MLCQj4EtutgE5aORIdHxLIPS0RERERERETUuTo8goAd2C6FTVg6QnxELBERERERERFRV8CHwHZ9hmmanb0NdHJzuVxFRUWBP4/LmakH9LzwAfiFLS1tOmzf9KkOo+JTYAVHTKIOB589FQ4uTG/R4d4HntVh3p6FsILFDkKf3wcHHzeGjnLzn4RDd5pWHfY/byAc3P+SF3T46t9+rcN+62tghcXrf6TD4ZvWwcGxSck6rG/cr8OwcxTYE3iwAYeGYQr+dgN6jtBhwvAZOvzAhg4UkbpNX+swpwoMzhkyAVbYt36RDu1V+HAVC/hBxo69RIfT7/whLLB0wnYdtkQugYPvXPuMDjfNKtWhpw2fMkMePl2H2bWZOny/F94/PU2QZxgb4eD05gM6NLxNOrQeKIYVVucm6TC1DUxrk5YOhhX63gb28NiBOXBwQzvYb3vWz9NhW3sjrAD5wpxfpulHIdiGKEcMrNBv5Hk6PLBtpQ7zevWHFSravDrctmUpHJx15i906DzzLB3edytejDZecKMO51SBF3T+7Cthhf7JYMLs/aQHDs6cCn5zGdEEjsDkwdGwQokBtq3pn2CeEZEhF00Eg1vBqxwZh2cwSyIYXBJTp8P2l/bACp4BQ3TYWI/3T+XKtTocNqa3DnfMWwArOPoN12FkQhwcHBEBLpc9eieAkclOWKFtL9gVlWiu2tWCf+SUSvDtsprBhomIZ9tuHTqmZOuwth7fb1G+DmyG1QvCXZsrYYUdH7+ow7wzLoKDUyeP1eHr6zbosG9LD1gh6zqbDvfH4AXJbX0W67BGwOxR658CK7RUXqDDcg/YP9MaU2EFbwM4ZSp2g+NERPasAIuldR+8rMPEaHwMV9SU63BfzV40NtxbP7BYCreCgouliXcV6rBsPFiri8iS9nt1aCnDM/zV1/XS4euFYA70ZE6HFSJKRuqwTyVY2kWHOenq3gAb3H4AT7mGAc87sNPs1khYISapjw5zJ10OB0dng8G21DQdOrLx8fPhSHB1bl4Ur8NEIwtWiGgA1454A19QNvTfoUO7BeyKCt8nsELk3AwdOkrA4Try+/iQsJ35lA5n7MVL4iYbOPfnVbTqsKQRr3K9V4PjJ9a3BQ420GkH33Ie1nucwwKnCQNumYjD6tDhgGyw+s0YcRqskJrTU4eDzhmvwxhw1oqI1FrB6ndQHb79c3tqbx1+8GSRDuc3LIcVfGfE6vDSPDDti8h3UsBr5/E+rsNfvInXqBsywbvs3OvBNXRFyezgn/kIgi6Ld8LS0Qp9ROyKktmhZz4RERERERERER0/wT4MHwLbxbEJS8dAh0fEsg9LRERERERERHRchd4Jx4fAdn1swtKx0eERsezDEhEREREREREdJ6GNFz4E9qTAJiwdS+zDEhEREREREREdVx0eAssO7EmBTVg6xviIWCIiIiIiIiKi4yT0EQSmafIRBCcLNmHp2HO5XKZpBm+JffupQZ27PUREREREREREJ7sDZ93X4SGwnbs9dFjYhKXjJfTRBG8/NYitWCIiIiIiIiKiI3PgrPuCf+YjCE5Ghmmanb0N1J253e6CgoLgX8flzAz+uebe3+jxfZL76jD5/UWwuGGP0OH4M/Pg4LIDPh1+sXibDvcvfglWiPUWg22wGHBwlzizDPBbltxzHoBj29JBl3zJ8kId+tZthBXy/Dt1aFrBbheRmPhYHdY1V6GxeA+HSUFsmv4wFXANyBTwguYMPFeHlc1WWKFqzxYdxraX6NAKjmsRkZbIwTq01a/Do61gg9NiM3Q49Xt3wAJRl43X4ZrszXDwYu9KHY5selmHsZvBfhCR20el6rBHS5oO03YmwgqWuDN0WL9yFxwcOy4SpBX1OjMr9sIK/pxmEPYYocOvqt6CFR7tPVSH51a9AQev3w6Oq+X/+FCHlo14BvO2N6IYnx3i94IMhckxKbDAtOt/qcO8i8BBlZmAN+EfdXU63H3dg3Bwc9kqHVpisnUYP/I7sMJKO5jB7hl2tw535tphhSGD43Ro9E6Gg31JD+ow1jNchwkRc2CFs8ABKP6a1XDw7kQwuy5y3KbDhb61sEKarVqH1zV8oMNX54BpTUR2XfITHa5dg3fm8KYf6zBjzAYdLqxphxUuLQUH2/YaOFZ6DKnVYUnsdh1enQJCEZnvAYfrDPtCHS6u88AKYxLA4ZrivxAO9htv6zBOwCxaJviSPafpFh3Gt/TX4QclLbBCLzc4988cgQ/4D9bt0mHVoi90mLhjCaxgTQUT5vBLr4aDF9ywQIf5nv/R4W3pY2CFjZvn6XBkvxk69FjxHS0fRJ6tw1Qr3plPbpykw4IDuTrcuQofxJufuEmHfhOswWqa4FpL/Gix5LThFUlKv2k6nP6re3RYtA+vAxsiwSkTc0Y5HLypGCx1rNFgMeApwT/dhKzLdIjWjOKdDwtI3Rt/1KH/ADjHA7VRCBZmUU5w4RCRgWeAS5V9JDioRKRZHDrMHg0qr8gqhRXW79ujwxHZPcGGmXiDo9ucOqzYb4ODdyeBw3hF48c6TPl8CKzgeXGWDnMnX6HDW14aBiu49r+qw2WNT8LB5y+fqEPrzqk6HF82GlaoXvCYDn31eEkMj8xjAdRNj8+EQ00LeO1uevpZODghBUwUe9PAxS7Kj98lxVjARNozGUwp18z7FFa46yxwZK79O17SzIrpp8OHvgdW4NlOsPAQkTNbwM6MfPUhOHhpIliBXzb/YR3a+4DruIhk//0/e543wHYDvBOWji+XyxV8RKzw07qIiIiIiIiIiA5Z6MftsAN7UmMTlo67Do+I5ad1ERERERERERF9q9D+CR9BcLJjE5ZOELfbzVtiiYiIiIiIiIgORegNsKZpulyuzt0eOkpswtKJE3g0QfCW2G23DOzc7SEiIiIiIiIi6mrK7p5Wdvf/P4ObjyDoNtiEpRPK5XK53e7QPixbsUREREREREREAcH2q/ARBN0Lm7DUCTo8moB9WCIiIiIiIiI6xXW4AbawsJCPIOhO2ISlztHh07rYhyUiIiIiIiKiU1boDbCBRxCwA9vNGKZpdvY20CnN5XIVFRUF/3rFn9v0mJ7D7fBr08fU6HBliQEHT5V4He4uBb+H2FEJC8hX9/xYh2m+b/Bo42jPLFMOvQL+kXEahtUKdrLZCuviDTMNPyjrsMLBNvTtWtubw2/gkQu3J43D20OH/O3CvG5hvh0YbbXineb1+VBZzGq1hfkvHU0cdyHMJ9x6ow4rBkbCwX+2fqlDWwQ4nRMa58IKYz3zddgUEafD09NBWRGZYM/W4fhPo+DglvmLdVi7eb8OrZERsILp9eow7dYxOjQcGbCCeJ068w2eAMfenL1Nh2/ekqbD/ttzYYWI0nlgE+p3wMGmr12HabGpOrSFOdImXzJTh4N/fTYom/Q3WOGtBX/V4eMf42XoyH+AqdjrBIeKxcAvqNEOzi8xwRm2c0w+rOCMTARh/hA4+Ac3/I8Oc8xGHfau2AkrfN4EZo/owjCD68GumFMGjkxr/VWwgmNhExjsQzNQryxYwTcqWoe2jR44OHvwmTos67sHbENTmAkzAbyg/Yv7wcEJ5wzWYWV5lQ73tH8FK6SljNThzn1v6TA9+yxYof20JTocZS/SoYis2gV+dd0zzwGG1u2FFbJ6JelwyUJwOjcu6AUrTIm6WYdxfWPg4PXvf67DfhFgg62lS2GF2FhQOWrU+XDwgq836fCGm8Ge/031H2EFW1yODp+6YpYOX3lpNawQf/m5Opy6HbzKIvJkzj06vDUNnM4P/+x0WGFiOVhWebfO0WFDxRZYISEaHBJREfgaOvi6n+nws959dLg/FpxHInJ2HjjYlibgj+3d8hE4VCJ3g6nmpiumwwq7MtbrcMMOMAdGrwAXVhFpe+Z5sA3lH8HB8VHgclBRt0+H6T3BskFEbIOv0GF7fA842DkIHK4rvviXDpPGjIYVfvITsOIf4wQLj10C3nyJyOx2cLgu2DAZDv6RAyx1FuSCPbxpTAus0EdKdXjXJ4/qsCnnYlhh3ntrdDjfj/dP07rv6XBCT7AgKX7gl7BCYjM69w/njUiYtzO4RJ/0/jpMzh2qwwueuANW2JIJJore0Z/Cwc1+cDL2NcAKM6IeHJYi8vsXwcsx1/mIDu390JVOZOiQYh3+IGs4HOwRsNxKlWQdnrN9AazwvizU4e3rwGkrIhGPgDM0NxGczt7i10M/vZw3wHZXvBOWOlng0QTBW2Lfvht0JYiIiIiIiIiIup9ln10c7MDyEQTdG5uw1Pk6fFrX23c72YolIiIiIiIiou5t2Wf/uWWbjyDo9tiEpa6iw6d1sQ9LRERERERERN1VsAMbuAHW7XZ37vbQ8cYmLHUhLpeLjyYgIiIiIiIiom5s2WcXh3ZgeQPsKYJNWOpa+GgCIiIiIiIiIuquQh9BwBtgTylswlJX1OHRBE+cxwOViIiIiIiIiE5i5StuDb0B1jRN3gB7SmFvi7ool8t1xx13REREBP76xHkWtmKJiIiIiIiI6GRUvuLW4J8DjyDoxI2hTmGYptnZ20CEZWdnl5aWdgjH5cwM/jna4dBf9eTmv8FqD9Rs0WEfSdXh4Lh6WGGP7TUdvpTVAgcntK3SodVm16HX1w4rGGLo0BRwwsZGxMEKfnR2N7U1wMGHzmpYcW6x6dDr9xx6Zb/p1yHcD92GYRzGrxZMAfsn3BRuMcB+g3t4fN5kWCH/sd/qcFsvHxz8N/9KHbYuydChNwdXaLMf0KEjabcO+8WuhxVuS67U4YTtePDbW/bocHp1rA6jy7ywQtxisMEtSUN0GNGwE1aIGTFah470eDi4eMmnOryzd7MO9+eBH01Ezl69DaRoUhIRqQFFUnv20GGjBc8/DcXgkEifOE2Hj0/YCCtUPf+iDp3WkXBw8q6+OkxZ/qoOHRaw00TEi04leB752nAFOFd5JvwKjrWib1f5GDhlDnxQhCtsQXt+aTUcbLGAB/vE79uvQ1sEOAtEJLVxjQ79NnD9MszDmNYMP76g4Mq2GB2ed8vvYYXydHAyDhoeAQfvQLttxIg2Ha7Zg3+6tthWHbasABs8ZjKeUuaVgnx3v01wsDUSXMord4OTzp6RCStULwbzkr8R7Pbs1efCCpNvGarDNdvAVUZELowEh6stEZwGPfz4oh/VDrbtrVZ8/PTvAS40nxSjnVaxDla4YNIEHX4oz+mwcVEkrGAmgW/njM2Dg3MzwLerzZilw7Y6/HKMaumpw+Ff1+lwyEiw9BWR5Yv26tBYCGZREVnvHKHDvIvO0WHDZLwOnJO4RIf+7QlwsGMjOO/umD5Gh2avElihyvmhDuceAFfhhOXjYQX7ix+DwWHOr41Fd+lwWC9w/Sp3ZsMKLVG9ddjqxPunoqRYh0OmXqbDnz+BH/I2fReY4ZtXgOvX1VH4KtN+7g91GOUB87CI9Iv5RIfP3zFRh6fvS4MVBj4A1q6leY/qcMm7c2EFa8ZAHbbGDIaDq368T4eDN6LZw2yEFUwLnBvxdBfjBBdiuIa//w3cv5s/CqyfZ30JTsbew/D70N4pYNn51UY8OBW9C4heA94Lr21JhxUk4a86uzhqqg5vuOwLWMAnm3U4uhEvaSJ3g6uztw7sH5sHr1FtfwWL6rzl+HIQY60J/nlFyezgnwsLC3kD7KkJNE2IurLAzBXaiiUiIiIiIiIi6oJC26+8AfYUx3/fTV3X3r17zRDBT+uS/57FiIiIiIiIiIi6mg43wLIDe4pjE5ZOGoFP6wq2YleUzF6w7eXO3SQiIiIiIiIiog42lf4j2IHlZ3BRAJuwdDJxuVxutzv0llj2YYmIiIiIiIio69hU+o/gn3kDLAWxCUsnnw63xC7Y9jJbsURERERERETUuTaV/iPYgeUNsNQBm7B0UuItsURERERERETURYS2X4U3wBLCJiydxHhLLBERERERERF1rtD2K2+ApXAM0zQ7exuIjpbL5SoqKgr+dVzOTD2mcPc9Osx69nEdNk8uh99l18BJOtxpwYN3z3tXh39++gkdZi78hw5FxO9vh7nmsDph3qvHEJDmjIeDty5+RocpcWk6rGuuhhU8Pk+4LTxhDDE6exNOtHAzON4RKE2NzYBjZ977Bx1arkmAg9c7X9PhrG0pOuyfnAMr7NzaQ4fe0lod2lbjU6OxPxj8s+/jX8wkr16pw+19BurwSmsjrDBkZ5QO45pH6XDd7z+CFZIEzB4xk8+Dg5e+CPbwF2NtOvTO+i6scKkxTYfb5Qs4+OE1d+jwruo+OnzJUg8rtDy5UYfnjcvS4XuF82AFs3avDnuMnAEHl3padOgt3a3D1H3vwAqxTvCCWi1WHTa3NcEKw/qO1OGK4mVwsGGAs3HKH97X4ZtpO2GF2o1f69DyV7DbRSS7sViHDnszGuuHFWKjwbkfnzlIh14/npYyEmJ1GJ0MrjIiMuKSC3SY0CNRh56hXlhhfZVPh7vTV8PBke1gM65NWavDYm8yrDDeCl6maInUYZlvDqzwSevPdDhrBz47fBFgg1sqwEibB5wFItL+TrYO7eV2HfYZfT6sEDcoRoeeIXvgYG8rmKxGp4GzoLDuG1ih5T0ww+eefhYcvL8K/NQFfcHhWid46dKQuUaH85eCbbgkZzqsYO25WYfvF6MXScQaB3Zm+9Y6HZ42ZDSuYAFn7tiUNh2+UL8NVrA/nqrDwSvxKdNn1FgdGr3ydFh3IZxn5Csp1WH9XHw633ZFXx0mJ4OV9mizDFYo98/VYaX1ezpc2IRXKbvWgD3f5zUwtYrIuIm5OvzsA7Aza4rBholIUzs4Gf21+LVzXfcDHQ79BVhODPzLj2CF9/fN0mHJ7eCSPSwXXCtFZGniLTr8roFnsBvXgUMlufWnOvRVgFNDRHbEgFffaAFXwKaPwXVcRCzLwbmftw1M+yJitYA1huFAd7OFefuWFgd2pj0hEw5On1Sgw+RLJ+jwuYQ3YYX2XWAz+kRfrsP9yc/DCo5Fk3XYFo1P57boKh1OGw/eOP98AK7wzQFwURuYeLMOpzb/GFawlIP3py/n/xIOnr9zgw4/zANtgdiaBlgh1dfxYAt++lZAYWEh268UDu+Epe6gwy2xK0pmd5gHiYiIiIiIiIiOodDOA2+ApW/FJix1E/opsezDEhEREREREdExF3rvV35+Pp8AS4eCTVjqVnhLLBEREREREREdPx1ugHW73bwBlg4Fm7DU3fCWWCIiIiIiIiI65ngDLB0NNmGpe3K73aZpht4Sm2uAj0whIiIiIiIiIvpWu3beH/xzoP3KG2DpsLAJS91Z4OkEwb+yD0tEREREREREh2XXzvuDHVh+ABcdMTZhqZtzuVyht8TmGiPZiiUiIiIiIiKiQ6FvgO3EjaGTmmGaZmdvA9GJELgrtqioKJiMy5kJRz6UuBjmbbm1Orzk+6fBwWt67dfhiE2DdBhdHgsr+CtydDj4yS/BUHs9rJAYnQK+nTMGDu558c90uPbDZ3U4YPyFsEJyBvh2Kz/CD+RtOrBJh/0yB+rQbrPDClv2btShz/TpsN3bDiuIHJfZzxDjeJQNJ/zPAP6LYYBti3LgI3DchPN1eOUfb4eDl/V/Toezl7+jw5qe18IKSY59Otz6eZoOUx1nwAp9m3vrMLMZ76Fxk0C+sf8sHZ7tqIMVJtRX6jB5T5UObb5kWKH09T063LYehCKyetHnOtyHCsc+lAgrRI1N1eGICBsc/NLHe3X4zgbw6kemDYAV0kr76/C2aUN0+F4GLCC2LXEgXbIOjz6wXWdRNq8Oz714DCywd91mHeaOGw7KJuJZNH0YOJW++Ns8OPj9l/+uw0mDhurw8xtvgxUOvPaZDq17q+HgrEaw32wO8Or7Ww7ACjm5o3XoRJO2NQJPKdMvGafDlrwkOLi1GtwlUOMEM7x/FL5kF5s7dbho4VY42EwDP93Fw3bo8PGqRvztdr+lQ8vGNh1uLsFTyt0NTTqs7XMjHGw0g/PO5genTI8VvWGF1IgEHdobwLQ25ILJsEJtpFOHq7Nq4ODKZLAzWxeB1yhuYRSskDVqog5HDcDHT9aFxTosat2iw35OP6ywuxycuY59D+nwqvFgvSciz9aDSTt2SwEcnCQOHdZkgMticeEaWGHypeDK+GXlyzpsq0mHFdKdM0Doxgf8kP5gyVd7WrwOP9oJLqwikptyhQ6zM/AlO6I/eEEfi1qgQ2/zWlih756rdLi57H4dzjkHrIdFpKz0ch1+6gHXShEpux8c8BFfrNRhuq0UVmhvrNDhjVdeBwf3fxjszG2j83S4dFQJrLD3ZnDJvvXc83Q4wjwdVui5dZEO78/GS5pXfgRejuRscAWsMrbBClFPzdFhfL8JOrQV43cihgWsECLTwDs1EfG1gJfDYgWnbWYcXoPtTAbnl7kLzBIikjYW3FxZeu1g8O0skbBC/xzw3mdDW7MON8WshhVyP5ukw3RwGRcReSvzdR3ueekRHQ6LGwUrvPpT8Ga2z9ngbe8rS1phhRYUfnc3vvVqVBqYG6f0ARscoD+AK9xIokPBO2HpVMEP7CIiIiIiIiKib8UP4KLjgU1YOrUE7ocN/cAutmKJiIiIiIiIKEDfAMsnwNIxwSYsnXICt8SGfmAXW7FEREREREREp7gON8CapskbYOkYYhOWTlEdPrBL+HQCIiIiIiIiolMVnz9Axxv+RA6iU4Tb7Q79wK7/n3MTszt5s4iIiIiIiIjohOAHcNGJwTth6VSnP7Dr/G/wR50SERERERERUbcRYRvO5w/QCcMmLJGI+sCu87/Zy1YsERERERERUXcVYRse+AOfP0AnhmGaZmdvA1EX4na7CwoKQpNxOTMPMn5m37dh7u0NnvVRHuvVYcvEWFghY3WLDufYfDpcXvpTWGHYh9/o0O9vgIOhPpNu1mFlNdgwEcnoP0SHWZPGwMGrIp06nNFQqcNho1NghQPL1+lw14jhOlz/u6dwhY3v63BgT/BTiEhbe6sOt+4r1qHX74EVDn2yNcQ4xJEHEeabgTjSHgWH9h0wUYcTZ14LB6dc2EeHf7H8Soc7dqXCCtlDwWZs/bxZh4mJl8IKl41p1OGyevxynNM0VIe5vfaD0DkHVohvXaHDdE+mDtO2gwNbRGx1w3S4542P4OC33/wEDLaCFzSiIAJWeCK+rw6NwZfDwa1rd+vQ+V6WDvs3VcAK/b7zRx32nQBe/Zf2fQYrWMrBT5ezLwcOPu+0HiC8OE6HZpiTIz19gQ7/ZYJZtH0XmBhF5KrcMh3ueu5sOPiS31ypw34t4KASE08IbXbwIzuMejjYHpumQ38LOODDzT5nXny9Dn3ZYMr1NoEzUUQyzhihw+esO+Hgpl0gvzx9hg4/GI7fLNUuKNdh9MaecHCiDxxX2RcP0GGx8TtYoW5BLx22Vm4EQ21tsMLQnVfrMNI1BQ42msBi4LTLwKuf5YmBFXrsA1Puntw6HW5ZnAAr1HjBqVSHfzgZmAkGb80E1yrVswAAIABJREFUR2D8fHyNuLQA/MhVUWCDReSZuu06fLInWJit9G+GFb5oAE+mejoe3LyyRP4JKyQa43X4fNlZcHCpB6wxNlSCeTihEpx0ImJGgnPXGgl2Wt1+fJNB3CxwuUyOSYeD7SbYFU29wYI2LwVX+HLgHh0OjAGTtoh8b9x9OpzeMlqHsXPBjywiO564U4eDbgE7c9lpeJWb/2VvHTY9OxUOTtwFzoRMS6kOPehYFZHrZ96kw4G34Ev2olHguj/6TKsOt3x8Gazw43pwSXJur9KhWb0VVrj4syd0uOCLB+Dg2F1gdSdpYAWVf8ZIWGFbHThUfLu/0mHNziWwgt0B3olY7ZFwcEsdeO3MJrC6M624wrSrwZu11hnnwsHx2eBkrLa167CszzJYYWDcOzqcVXqeDn+Vgd+H3lS5TYdN8/4GB/e2363DiZdU6/DsptdghbnPbwBlV4PzaMJNGbDC1V+CF/SM58A8HIrPH6BOwTthif4LP7CLiIiIiIiIqFtaUTKbH8BFnYVNWCKgw9MJQqdpIiIiIiIiIjrphL6vD7RfXS5XJ24PnWrYhCXC9Ad2sRVLREREREREdNLpcAOsaZpsv9KJxyYs0cG43W4+nYCIiIiIiIjoZMTnD1DXAR5RT0QduN3uwAMKioqK5N992IN/YBcRERERERERdZYOd1AVFhby7lfqXLwTluiQBJ5OwAfFEhEREREREXVxoe/W+fwB6iLYhCU6DPpBsXd+3nbn522duElEREREREREFBB5/3Y+f4C6JsM0zc7eBqKTksvlCjydIKDD0wlabvxAf8kW6w9AoTC/CrHLZh22VqaBkRv6wAq2aqcOE7bthINTZStIDZ/Owk0ZhmnosPfYq+Dg5qh+OmxK7KnDqQWDYYX1KbU6bOgBfroNTaWwwhW7LtBh2ohqOFiqo3SWWgvC0q24Kb/G/YkOzS3v6dDu98AKVQ2VOmxub4SDIUPAa+SwRcDBOdlDdNj3LPzb48xRw3S4PS1Gh6+0v4U3zmbVmbN3gg6tzmZYIDsG7LfYyC1w8AD/WB3+OhIc3RFN62GF5VErQFm5SIc5FXiDHTV+HXqKnoeDty3fqMN5O1p0uLcX2JMi8lR/MNfY01+Dgw0HKGIWN+gw7Zt2WOHs6aN12BAHzvH1O8pghaat4Ee+7JLT4OCzbs/Q4RT7Bh22v/QmrGCueUeHHyeAeebNTHyOX3v7czp85t7vwsELXr9Zh4PrvtGhzYafHOWMSNShIyIWDk7sMUiHKX2H6zA6Eh8/xsDxOqyqA9eIqAgwz4jIrkZwSaqvwVOu3erQ4TnTUnT4SVINrOCze3W4bTe+Al7dDn66HSMqdLiyEW9wY91KHcY/CKaUtDAL75t+c40Oq4c3wcEpPjBvfy95uQ59lV/CCjZ7tg6f3HiPDv8c/RGscE5aug7P640nzPfqo3U4JRocbGfYwGkrIvEt5Tpsd4JtEJHcN1/SYdnAVh02pdthhfadYLrrvRvMogv64tcoswUcw49WVsHBn/V8QIeTBozSYZkTzBIisnshuGSb7eAssC0A+0FEEvaBJY1zDz5l0noNAOGkMTpsbMMTgmcaWL3kDiqGg78btVSHY95cp8N9hZ/DCoXl4PjZUQAmpXfje8AKLS/9WIfJdfh0TmrfpkN7NLhO5SbjGX7sgz/X4Y0bwVpLRF75HThrJvUER6AtDfzIIpJ8HviplxWDZWeBfRyskLbjVh0mrfkKDo5PTAKD+4PK+5vASklEPFsX6dDqByejv347rGAIeo/jx0uaCCc4O/KGTdFh/6vRez2RdTawJP4iB735EhnYA2xbahqYzG934FVuQgM4cx+MAO8i93h6wQrlC+fosG4NeJVFJH4FONgaVoLT1ufEU64Rgd6MDASnzMBpd8AK7X8+N/hnPn+AujjeCUt0hPh0AiIiIiIiIqJO1+H9OJ8/QF0Tm7BERy74oNhgwlYsERERERER0Qmj2698/gB1TWzCEh0tl8tlmmbog2JXlMxe/8Bh/CNxIiIiIiIiIjosS26v5uNf6SSCH0NDRIcrMNeHPih2/QONQx8CDwAiIiIiIiIioiO25Pb/PKg9Pz+/oKCADx+gro9NWKJjye12Bx5QEGjFBu6HZSuWiIiIiIiI6OiFtl9FJD8/n3e/0smCjyMgOsb0g2LXP9DIpxMQERERERERHbElt1d3uAGWj3+lkwubsETHhX5Q7PoHGtvv/VsnbhIRERERERHRSafqre+x/UrdgGGaZmdvA1E3F/qg2IBxOTODf65pi4Nf5fDU6rAiYbAO/e1tsEJOw2ow2OKAg00DPJzEZlboMC4qHlZw2CN02NreDAe3oNxigF8LeTxeWEGsIEuc8qAO95/VFxaILAMl7OdGwsFbDnytwwWX7dVhXHMJrBBTvU+Hf6/5uw575uAXtOLpbTosn/sBHDx2/BgdrlqxSocHag7ACiPGTNBhXUwyHFxpgrzBAw62nUYCrLDn6wU6HFDwHR1m9sWXraKyJ3QY6cev/swx5+jwiSHrdeiZD3aaiOz+eI4Oe585SodblpfCClHla3T4+pxlcHD8SKcOHel2Ha5Jb4cVPvQZOqzd9Xs4ODvhdB16E9Eps6UGVsj0tehw0LihOrRGRcEKhhP8yFfeHA0Hj4rcqcPoHWAWfXz0RFihfDSYA5+YAZ4s9tP9b8MKr44ZocPKD8bDwY554DTPs2/WYaQd75+o+GxQYcplcHBEYooOzWRQYdV28MKJSFIqOHMnjAOhH369yMImMMMPcILDUkQGpYGwchTYP7aqLFhhT9JGHa71lcHBk/fP0OHKFHDuJ+wFx7CIzF3+Ix1Gv3SWDq+/6gJYYdhtYFdk+r8PB7/f/IwO/a8N1+HvL78HVnj5rkd0uHwGOMcjr/sQVjhj2bU6HNOElzRXRILTuaAMnLaOPviA/98VYGZ7zYaXNL9cCS64m1f+Qoe2H+FLttWzW4c5peCQ2NB+Naxg6wWOTIuADRMRWw6YlxJ7leuw4m2w1hKRHB+4qLXWVevQv3QDrGCvAruib298fg27/jYdbgXbK8PPw3f8eAeCK+CNUTvg4L4rvwHf7k9P6XCB3QcrPDMOXC431oIrXfYLebBCUiwIeyXhw3V/yhk6bFz8Wx2aMfjb+R98WIc3O4bAwTu2N+kwsxiMfKgvOBNFZLANXJJWLr1BhyM2opdZJDqxpw4bvGiviciBlTrzRufq0NEKlr4iYjjBstPfUqnDnJ7grZOItNWBH+TOf70OByclg5XnD54Cp8zIlB6wQnk0mF1vvWYXHNzDVq/DcYteAxu28HlYoW7LFB32/unjOqzfDC6sIhL/h006HDR4EBx8oHixDs2GrTpsbcZrhBZrkg4TIv7rwA5+9Jbw8a90kuMzYYmOO/2ZXYGrSGgrloiIiIiIiIiC2H6lboZNWKITpMNndsm/ryj90m/p1O0iIiIiIiIi6kJC26/CT9+i7oLPhCU6cYKf2RX6rNht+5/Zth/8u0IiIiIiIiKiU8rWiuc73ADLx79St8EmLNGJFq4V24mbRERERERERNSJtlY8v7XiP8+6ZfuVuh82YYk6R7AVG0x4SywRERERERGdanT7tbCwkO1X6n74TFiizuRyuUzTDP3MrkAflg+KJSIiIiIiou4ttPcq/PQt6u7YhCXqfIFf8elW7OCkqzpzs4iIiIiIiIiOg7VVb4f+le1XOhUYpml29jYQ0X+EtmIDxuXMPPiXeBv24v9wOCe3afHr0GJYdZiV1h9WSOo7GoS98ODqsn06rKmu0qHdHgEr7Fv7rg4j7JE6rGuqgRUcdocOPaYTDj7t89k6/Ggj+CkGxfeCFb5OWK7Dvb1LwDYsbYEVSpat02He3ZfBwZZ91TpcNLQf2AZ5GFbY+c4bOjxvIv7V3T/j5+tw8/XROmwycIWKBf/UYawFHBJn3PAArLAqs68O64q3wcFTBufqMP+GBh1OXfZXWOGjt8DDQyLWNuowvsEHK3xR69VhXZinBC0/09Dhphi7Dqszx8EKnpiJINx7AA5OtVytw2t6TtahfRA+ZWb/4X0d/rDgDB1mjU3C2+AEP/KwASvhYOdfXtfhI4//BVSYFAMr/MA4W4dJ6yfpsC2iFVaILN4JBsckwsH9zK067JOUosOSFnz8pEaDuXH85d+Bg2MGD9fhivXNOty3sRhWGDkgTocTbhqqQ3fEDljBV5qqw7MH4Z25tRG8+qdnrNBho2yCFZ5tTNbhr2PBKSMin/vX6PDpZ8A1IioVnOMi0vwLUHl4Btg/fYYOgxWMUWN06L32Jjj4g8cH6jBzRoEOl435GFZ45YF7dJgRAX7k6zdfCytYKsCPHFmRAAe3TvLo0Ps5uAJmVeG1S0UiOAJzasE1QkRMG5iX4m2VOmxPPw9W2OcEm5FYVavDRnTaikh8VZkOnePwt6utBcsJWyLYmY5eGbBC+xowpfhawHIieR84j0Qky9Gkw3Mf/QccXOwB1yp/aZsOx14EC8iw7GU6HP7S2zoUkR2zXtThZ4PAGvW5niAUkc0bvwu+3RIwOKP3YFghO6eHDi298Om85uNPdNi29TUdGvG4QmkTWNC2XIkX1d5ycCn3poBX31iJV5iD9oHD1eIFK0kR8CqLiOkHp0xSfBYc3NQMNtgwwTuRAXlg6SIiGWnpOrzob7eBbUgCZUVk7KsP6tDyT/ym445rbtXhzNvW6jDaBEs7ESltA4vGQaX4213yCFiBn/VzsEbtlQ2u4yJy+7/AKdPzoyk6vGg8uJqISLSAQ2XbnnY4eP2r9+nQYcerl6DQz90Stl/pVMI7YYm6Fn1XbOAS9a2tWCIiIiIiIqIui+1XOsWxCUvUFbEVS0RERERERN0D269EwiYsUVfGViwRERERERGd1EI7sGy/0qmMTViiro6tWCIiIiIiIjrpsP1KFIpNWKKTA1uxREREREREdFJg+5VIYxOW6GTidrvdbndhYWGHVuyoRPB5l0REREREREQnEtuvROGwCUt0knG5XC6Xq0MrdnXNYmErloiIiIiIiDrDN2Wvhf6V7VcizTBNs7O3gYiOUIdWbMDBH1DgayqFuSl+HRpi6NBmscMKfQZM1mHGkHFwcL8pE3UYmZWow6ryZlghMytSh+uW7tZhcqQHVtj+L7cOK/ftgINbfGCq9HuadFjR6IUV+l35EPh26Tk6HHS5FVbY32++Dt1zl8DBm16ep8NZH63SYUIP8CqLSON98TrcePVf4eB7oiJ0+Hjhj3X41oc3wAoDaqfrsOnrD3WYbtkFK6RkDdJhxiU/g4N9mUk6vGAqGBnf57ewwo4nn9RhcXOrDgf0joEVlq+u1eGbvr5wsBk9QIdRY68HYU5vWMG/tUWHvjfwAX/BeQU6TLqwQofNFnAWiMisxUU6vOQz8Cpf8T9DYIXaGLCHE+eCUERmrgW7wv9cuQ5NB172xO8Fv5bOMbeCsrG9YAVr/Wbw7QwwtYrIoKFngnTUVTpb9/YTsMKUyafpcML118DBbfHgDH2lCsyuaVVRsMKoWJ8OM88r0+Fy40tYob8lU4e9HW/BwX9cW63DJ4aN0eHfZ/8eVljpA9eIM1Lxy9G+pkqHha+CycpZjW9fyHMc0KHpABe1ERPOgBWGf+dyHRaNWQgHby4H5137bhT+eSOs4EsAV8bEr8D+GRAPZioRmTz9fB3u3bQODm6pBodKcjSYG8e78mGFlW+/q8PY2Fg4eOBVV+uwOSZFh7Nnr4UVvGtf1+GoaZfosKEer1KiYsFPV7kfHGkiMmAYmOFLBZwyqxctghU8Vft02CMtQYcDh/aDFYacPkyH9We3wcH1XjCRfj9thQ6TzWRYoeX8s3X4aTNeQe2YDtZFc6PAcnS9+4ewwqAGcOampIBtyx0+GlYYee5YHf55ztdwcOIbj+jQMMAKwe/Da9QWay4ITTw/J1rBhGkxwbeLd+IlX1b/CTqMiQHnl20wuI6LSNmqxTrM6IOXNHU71+vwhtlg0ZiV2AArvPMKOIyb6sHx8/qk22GF6q/AAX/NuEvh4N/mgdVvyief6vAT73ZY4ZMDNTp8/+p/wsFNCz/SYZ+p4P1dlh2/KVv9XLQOoyZl6bD18t/ACvEmmLRtUXjKDQi99VXYfiUKj3fCEp3EAnfFCp8VS0RERERERCdWh/ariOTn5wc+zoSINDZhiboDfmwXERERERERnRj67lf599tSIgqHTVii7oOtWCIiIiIiIjp++PABoiPGJixRd8NWLBERERERER1bbL8SHSU2YYm6p3CtWBEZnYw/FYSIiIiIiIioA7ZfiY4JNmGJuhC3211YWCgiwc5p4Nk6R3yF061YEVlVtUjYiiUiIiIiIqKDWn3gX6F/ZfuV6GiwCUvdX6CzGdqFPPSnhuuvlePzgY8d+qRBgTDw/4WFhUfZipWQ9i5bsURERERERATp9is/d4voKBmmaXb2NhAdR+Gam3IIV5GDfK18W0u0w386mm8U6uivfLCtHO5xsd6mvToMN2lYLVYd9s4eDgcPmH6pDodPH6vD1P7xsEJdj0YdRjnrdJhj2wQr7PVl6zDbWgoHL9p0pg57eSw6XPbYq7BCTT3Y4NJNK3TY7vPCCtlTr9VhZP65cPCLvsd1GNX6tQ63DvDACv4Xl+rwjb21cPDW08GuuPDHn+vwy1UFsMLv7r9Rh0P6gcEl7udghT6OHTpM6jcNDq7cs1GHp3/3Dh2uy+wDK3y5+lkd+peX69BySQ9YwZsBzq/IWvzT2VP76bBNeukwcXhPWOGm0SU6fOSJKjh4UPPLOrz+2hgdlmTNghX+fC84th+88Ckd/sX+AqzQ+BrYmXH/3AwHN0fG6bB3UpoObT4wS4iIv71Zh/bWXWCkvwlWiEoAh4rNCXaaiMR6wKmUNvFqHa4s9cMK461gZpv+xD1w8A5Lqw4fmQNe5SFZP4AVyj9dosOZPzlNhzX9X4EVPvp4ng4r1oIXTkSmjwKHStzaBB2+N+uHsIK1CVyqbI14uvO2glc/z7FPh45IcKUTkfiUvuDb2SN1mNQDjBSRadeD6e7eyGI4OOpzMOX2cw4G385TDyucNilFh8mjfDp8N2o5rJBVOUyHhf5VcPDj3uk6nDBkkQ7flr/CChv3/UWHk2Oj4eAdreAy+nzNeh32vT8WVrh55gAdtvQFh6vTB14LEdmWfkCHW8LMP3vfTtehfz1agy3Di8A+g8Fya+T0CTqMScE/8oEZYIPjImrg4O9Yd+kwZcFHOvxq+SewwldbQOWVp+Pz6yM0Ddre/YMOR0bjPTz4rMt06DPsOtxYE2b/+MAqru3LBXBwVAu44FqatunQ31IJK2Sl99dhZjI4TkQk+2KwPqxvaNdhkwfv4bgocBj3OTNPh1vAYSIismdNtQ5v/AU+Q8978AYdRtin6HDsnWA/iMjX88HpnPUq2OCLLp0KKzRfBZbEZ279Phyc2+jQYenT4BpRUPddWCF1A5hyx75yJxy8eOutOnT+BLx2keAQFhFJtOxEMbosxuBFY4cnDwjbr0THDl43EHUPhmEcpLlZVFR08C7qwRujBQUF8FLkdrsDXxvK5XKFu251+Eb5+fmFhYXmv+Xn5wfu2z2UbT4UgS0pLCwMLbuiZLa+1hIREREREdEpQr8rzM/PN02THViiY4VNWOq2QpuVgYtHaGczkIfrabrd7tCnsnboigaHBZ7f2kFBQUHga/P/LfCNCgrATS6hHdjgFS50k9xut9vt7rDNR38VZCuWiIiIiIiIRL0TDL4FZvuV6NhiE5a6p9DmZmFhYYeLh9vtDu1p6i8P7a7qrmjwv+oebuCvwXZqhxaqbviGdmAPfoUL3WbYzz0CB2nFshtLRERERETUvcH2a4e3wER0rLAJS91TaHMz3L2uwT/r57eGNnD117pcrtCupf6+ukkaSA7yfIND6auGjjmGv5OErVgRWVEye3XV4mP1XYiIiIiIiKiLYPuV6MRjE5a6odAG5UGaleEaqaGN13BXoGA/FPZV9VfBOqHhoVzqQsfA7vDRCLRiOzxvQURWVy1mK5aIiIiIiKh7WF39xerqL4J/ZfuV6ISxdfYGEB17wQZluDZrwLfeTHqQL+/QPz36+1IP8Zp3zJ9IALdE/v3UhWCLOdCHHZUMPreUiIiIiIiIurjQxmvAtz4Tj4iOLd4JS93QQf7V/zH88oO0aPWVDF7bQhuph3hna/A5s8f7t5TwGQW8K5aIiIiIiOjkom99DX6KSSduFdEpyDBNs7O3gegYMwwj8Icj+83eIX558LO/QocFw8LCwmCf1O12B/qtumDwex3x1p4AHe6KDRqXM/Pbv7hlP4yjHFE6HDztWh0OnTIeVhh0fZwOT/ds0KG92tChiJgNLTpsW/cNHOxPzNWhp6JMh9asfrDC/J/8SIfPzuqhwxEHcKc7vrJNh5VljXDwgVXLdbhy+Wodzrj0fFhh9AO9dDgq+ks4uO+fntfhWwvn6ND16M2wwn2zn9HhX+qu1+HYqhtghYb6Kh2m1IPXSETsMUk6rFjzng4jzApYodk5UIetTbU6jPJUwgo2X7MODT++KFc7snTYZE0EQx0RsEJMfKoO268bAwdbanw6vP7uQTr8VNbCCuvvACej7GzVmXNnHawQ23ZAhzFOOFYcVq8Obb5qHUYk9YcV6hvB+WXUr0Njwc4RkZ7p4JBw9hoFB1fVgW+XEmfXYUS/SbDC8Kng5UjsGQkHb8wBB+E//vqKDq/PuBFWKHoL/Hpyxv9epcO5T38CK9SPXa9Dy7JoODh6Ub0OW2rKddg7uh1WcEbHgNQAe1hEzMYdOkzN6KvD+KwBsIIlPhuE0eAMtUSgDRPxR8TqcNwVYBtEZN/Yd3T499e26nB6j5/CClOGg5PxD4vf1WHWcwmwwvTbLtXhGxVgw0Tk3okX63DqkF/p8LlqNHWI3JYEJquSN1+Gg6/a0FOH30sDR2b+rfiQ2G5Hh7FnsM4enA/mGRGZMAAcEsUmvhzs/3SbDiev6KPDaTPAakREIjPBy1SRCc6O+JwaWOHSuC06TN36KhxcshUsBqIiwM58by44uUTkT1ZwsatrvA8O7h8H7jw4OytNh2lgbSgismC3Q4e+2iYdVi/7FFZIaATrwzFngQNbRMr3N+gwJRMsPBypmfjb9QE/3Sc78YK2rBa8duMMcNGf+kvwI4vIbVc8rsOL4i/S4eYSvChqWg3O/T+8g8/QYWc9qcNRt4NrxI05j8IKPaaBnfnIa3/UoWGCl15EvA3oHcpcfDr37neODlvqwOmcuB0fPxYLOOAtTrAOFBEDLTMshhWMjMyAFTro8HnL+fn5BQUFfOwAUWfh4wioOwvtjYb7TwfJD7ElGtqdDNyjWlRUVFBQELyHVPdqg/Lz84NfXlRUZBhGF7wuulyuwPYEW8wBgSv6IbViiYiIiIiI6ITo0HuVLnzHD9EphU1Y6m46tC+Dd6F2EGh36uvQ0X/gVbAPG9qvDHfNCw4OJsEvDPRwu9SVMrAxbMUSERERERF1QWy/EnVlbMJSdxauAxtQVFR0TD5TC37fwD/hD/z14He26j5scPPk388r6AoN2ezs7NLS0nD/NXixZzeWiIiIiIjoBOOTB4i6PjZhqTsLdmCDTcwOjzc9fn3Y4D/hPxTBO0wlzMeCBRuyXf/XmLwxloiIiIiI6MSAt76y/UrUNbEJS91chyuQfrxpUVFR4F7UztxKEQm50TV4Fy28PdYwjNBP/TphCgoK4LMaysrKRMTv94eGbMUSEREREREdP3zyANFJh01Y6ubC/Q7Q7XYH/qW/iHRKT/MgQu+ihbfHFhQUmCb+CPXj57HHHnvssccOPqbDjcb/eUZB6vTju3FERERERESnhq8rPw/9a1d4eB0RHQpLZ28A0XGUn59/kO5q4FolYZ4A0EUEHqFgmmZwawO6VNc4KPBsB721Kyrnr6ic31lbRUREREREdLL7uvLzwP+CSX5+fmFhYeA9YyduGBEdIuPE309HdFyFfsjVwf85RujHdoWeCME7ZA9+doR+oxNzHnX4nLGuf/J2uDE2KNxjCoYMm6hDT2szHJzYo5cOW5MH6/DSP+TCChd4inVYUbQMDv70L8/oMDl2uw4zep4BKzz9zlwdpieBkfVe/MoOSAa/NpvxzBA4uPC0p3RotPTW4Z4mA1Y4rzpLh4m92uHgtPivdJix/3Ud1pmbYYW+c8Bm/PDLRTp8PvIyWCGybArYsMocODimGRxX0TGxOqzbBF44EYmyg13ha6rQodkGQhExDT/MIac9Uoden0eH/nBVTZ/OrJFpcKzhBIfmkPxf6NB+GTgTRcQ34S4dvj7ArsNBVeBMFBFrXLwO42MS4eC2llodWpxxOmxta4EVfF4vSE0Qmm1VsEJaFjgZLfG94eADjeCAt/nAT5GUnQcr9B87WoenFQyEg3+47CMdnlEF/o3CF034gE969AUdRtlbdWgYaE+KONLB/Owf+304uHol+L1ddlQ9CJNiYAWfDZwy9WXb4OCEtJ4gjQRHYEwGPuBbGhp1aIkD51eDLQVW2L+/RoeTJ/WGg1+YskaHSS+A0zbpZjCTi0h0j7063LT0LzqsXTUJVsjKOFeHP74QT7ktvX6mw989sFiHzrN/DCvUPA8G58otcPDLL/XQ4cTyb3RoeiphBVm8Vme7LgIH/I0OcCaKyOn+aTpM2wLOAhGJ79ukw4hScGzvTwJHmohYHGDqH5u4S4d9N98JK9QnRetwz7z1cPDOHeBkvKsOzK4tTb+GFVLiJuvw5zOmwsFbosAFd+0eqw4d+/ENRuMGgPzLGnBZTNmC93BTBNg/cQ3VcDDciO0tYP+UL/gEVkgzwLYZUfgKWLUXzGyxrSC87Gf3wwqzPlunQ8tWsLTLki2wQsnQ7+nQk+aAg5tWgvMrevcGHaab4T4TGBzwJvo3vimZeA60W8GCxJmABze0g+tabRVBM7vhAAAgAElEQVTYNqsfv21x2pw6zM4dCgdv2QomK+GDX4m6C94JS91NaNf14L8PDL1iwZGHeEnrcNfnoXP926GPD/1eXf+3nYEbYwsLCzveGFsyWy8jiIiIiIiIKJR+65Sfn2+aZhf5XBMiOix8JizRETr6hxgcQYWu/CjbcEI/DE1Cfmp+eBcREREREZHGW1+JuiXeCUvd2cEvUaF3koaOPNw7W0MfEXBkDv1SGrrNR/99T7DAs4o63Bgb+NUub4wlIiIiIiLira9E3RibsNQNHWIXtbCw8OADDnKnauj174ivhUfwHIPQbT5Jr8FhP7yrZPY/P/xJZ20VERERERFRZ5k175ez5v0ytP0a+NCtQPu1EzeMiI4hNmGpGwreIlpUVHSQK1bo53eF5uHukIWO+IGwHbbkEDuq4bb5ZBRoxXa4MfafH/4k8L9O3DAiIiIiIqITI9B+Df41Pz+ft74SdVdswlI3FPoBVgUFBd/6oVt6QPDLYRvX7XYHm6FH80wAt9sd+o2+9eEJoQNOumcRhBPuxli2YomIiIiIqLsK9F47tF8LCwsDz3DrxA0jouOHH8xF3VNBQUFonzQ/Pz94JXO5XKHPGYAPJQj9/KuCgoLQj8AK/fL8/Pyj/OVk6HYWFRUZhhHsRQY2OFg/dJuP/vt2QYGfN/DQ2OAPG+jDXjvjj525ZURERERERMfIwh2vyY7//DXwBpCNV6JTgWGaZmdvA9Fx4Xa7v/V20dDm7OF++UG+9rAcynYej+/blXVoxQaNy5kZ/POE6x/WX+jMTtfhhkWb4XcpWz0PpE3lcPCCrVfqMGpNqw7vmzADVmgfauhw12V2HV5kjYIV7q1s1mGT509wcN19aTrc/+RHOlw/C38qmm3tCB0mRZ4FB6daxuowpdmqQ+feWljBv/BFHfp8STp8+fVPYIXbR6fqMHrBT+HgkbngpzPbwR5uqKmEFVqrS3Ror/4ClDW9sIIY4PprCDhOAv9Bi4wA+yciPhsW8Fgideit2QYHx6X216ElOkWHVbVgp4lIY1WpDsf+7lkdup+5H1YYVQX28LgLvg8Hr99Rr8OESL8Oa7YtgxVaanbrsN3brkPT0wgriIFepLCrLPhbcJ+O0vufCb8+dTiYas687jQ4uCgT7MyFz3ygw8g5+HBNqQSHSoynWIdDh58NK8T0HqzDsuZoODhnQE8dDprQC1TwgllUREr2g1d/z5ItcHB6LNjzPXPB+dWWCM6CcJvRtnGPDsuLN8IK8QkJOqyowwdb7R5wXesxbDIYiaY1Edm1fbEOzSpwHo0ZfQ6sYBkzQYdbar+Eg6ui1unQXgNe/bZNO2GFS8ffrsP4H4CrjIhM7/dnHX795DM6fDh3IKyw9P7VOoy9LEOHo0ZfBitIbj+d+eu+gWPr+4LVy54ksH9y9lfBCm3Na3X4xlZwsDU14XP8s7XgYPti+w/gYKstXofThzykw9E3lsEKnzaD5VbFF/h0HuIYpsN+EeAfdL5U+xyskLQgV4f5g0bqsNYE10oR8baAy0FJMZhaRcSLJn6zpUmH/sZqWKF2L5isUrP7wMHVjajyPnBIRETHwQqRrVt12O4FE2O4a1pUIlh7REbFwMFeDzgI/T6wh1PSe8AK0278jg4fehFc1Iw9eBXXs2quDu1OcGCLSGYuOFTGF8zUYWUZmEVFZOE/fx/4g/4s4vz8/IKCgu53ew3R/7V351GSXeWB4G9UlWqRVCVVaUOUltKChJBACLMvNrSbwZixdcARybA0bffM+Ay2x27haXPOzBnbTJ+x8cFA+7S7p3HTNh7axkRku7GNoW08YECYRWCLVRIgJLTLElpKpdqkypg/ovLVy7hfREZmxov197OPiPrivhs3Xtx4cd+X991HL2bCMrMajUaz2eyT3yzPb+21eZgKTEPNhDYajXa73TU/NzQ/P9KNRqPzNjv/LfZMMXApZ2MBAAAmVlf61dRXmFuSsMyyIr+ZsltaDfKb10kFlmdldratIhPaa/GBrtUJ5k2vRSRuuONDN/z6h1JKv/Dr8ZQZAACAMfrt/+vKrsj8zKoBQpKwzL4Npi+LWZkjMJ+Z1kGEK8amlH731y9KUrEAAMBkCHOvybkeIAkLTJFeyxR0UrEppV9+f7z4HQAAQKVMfQX6k4QFpk+vibHv/p+O39JKNhYAABiBt7+1+36Spr4CIUlYYFr1mhiblrOxUrEAAEAV8txrMvUV6EsSFph6ve7fVUyM/bG3/MMYmgUAAMyccOqr3Cuwqlq73R53GwCGKV+moPC8C95QPD7rDb+bFzjpnF1hnfdc/8U8uPm+b+fBXRdcEdbwY390Yx583UOfzYPnvv+usIbHr3w8D97yZ7eHhb/286flwdOf/U/z4JW1HwtruOJjNwTRh28JCz9491fz4EkvOTMP1s59eljDroOX5cFDn/h/8+B9Tz4R1nDrfQfy4HtPejQs/Mna2/Pgcx56U9CwHXGX2HrscB68f+nJPHjg0x8Na9h+8Ht5sHYgCKaU2kvBG9lU25wHt2w6KX65HafnwcObTg4L12q1PLjj1OADPZq2hTUceOj+PLj5SNC320vBa6WUNp8c9OFn/fBCWPgpz7omD55z8dl5cGl3/Jb/9MvBxPl7//B9eXDnI18Ia0hHgrfcTsfiwrF4V4Q2bwr+jn75f/e2sPDz/9lr8uBv/kXQM/fdFn+guy+9Kg8e+U5wlHjRc84Na/j2gTPy4NkXBp0qpfS0H92ZB//s3OA4/Pnf+2RYw+6PnpMHdz4Z7+E9p56aB9tbTwmq3RcfwR7dsikPPn5K8Onv/9Snwxr2nrw9qOGRfwwLb9l9Xh48eO93gpIH7wxrqC0dyoPbTt2dB598/MGwhmO1oMHHUnz82Xr0vqDwseDj2LL5SFjDyWcHv63P+JlfDQt/rPatPHjkiqN58ND+b4Q17Nz5tTz4C5denwcfuvXhsIbDNz+WB2/bHBy0U0rnnxHE//D2l+XBLVvjS3yOPP6MPLj1y8GX8fylq8MaTt7/gzx4wXnB9yil9KNveXke/L83fzko+tn4V3jbncFbPn1PMKkwpfTQI7fnwSPXfyUPXvbDrwtruO3WoG07oj68+UjcA7ce3p8Htz3+3bDwsQP35sHaE8FXqb0UdMuU0plnXJwHDz8Rt+1QOzhuHzsajFL2XR2MA1NK7X0vyYOP3nZzHtz/QPDWUkr7Lr0wD9717fj79cT+YDBw+tkX5cGHHwwOHSmlU3YE/WfXKTvy4EU/8tqwhnMuCH59vveVb4aFv/mJ9xePb7jjQ13PWnYAWBMzYYFZ02eZgs7IqZyKBQAA6CXPvaaU6vW63CuwVpKwwMzqdf+u4wOp3/rQj789mPcBAADMuQ/8px/Ng5YdADZCEhaYcX0mxn7st45fHisbCwAApCj9KvcKDIUkLDAvyvfvSj2ysde+J15vFAAAmGFh7jVZ8hUYHklYYO6Us7Fd9+/6s7cdv6mIbCwAAMy8X/25p+RBU1+BKkjCAvOr16KxSTYWAABml9wrMHqSsMC8KxaN7ZONfd7rrh9P4wAAgOHJ06+WHQBGo9Zut8fdBoDJEmZjO553wRv6b1t77W+E8Qe/8vmg8JHDefDUg/8Y1nD15efmwZ9tvTAsfPZbX5oHzzzvVUHRU/eENTz28T/Mg3tf94Kw8JO7X5YHj377xjz4m//+T8Ma9u7elAeveO6uPPj8n7o4rOHPP3lbHjz94h1h4b+688E8+NFo0vOdX3xrWMOrnvrKPPjyt/zTPPjBD34xrOHJu76XB7c+eTAs3L7rE3lwS/uRPLjz5DPDGs447xl58N57gzaklI4cfjQPLh0JXq6damEN23ZflgePHgh2+9LRB8IaarWg5h2nBJNWUkpLm7fnwTMueE4efPOH4w/0f/n0r+bBJ5eCndn+jWA/pJSe/uB3gsJPxO+uvfRkGM5DtR57OK62R/yHnx1012f/6b/Mg9d96U/CGs7/rXPy4DUvD774B4/Erfjb3//tPHjhyYfCwtt3BYe7x/e9JA9+7zufCmvY+0jwMW1vPxQW3nTs8SD6xGNR0ZPCGtpbd+fBpe178+Cxw3H/2ZyCA9Dmo/eFhWtbtgZtOLI/aEP7SFhD787S7dzd54XxrVu25cELLrw8LLw/Bfvtlu/dkgePPPLdsIZ//uu/lwdvbF8YFr7mhcHLvasdvFw6sBTWcOyCm/LgA+/+bB486SvB71RK6fSb78mDZ+27Oiz82I7T8uCLfvhH8uA5ZwfHupTS974e/AL+1BuelQc/90T8s3jnXUHwvpvij2PL04Nv6MG//nIefOyrwU5LKZ1+NKh506H7w8LtWvAN3bYl2BVPOfOisIZdT9mXB+8/EByHDx2OD0qv/fmfy4Mf/mhw2E8pPe2U4Gv+gle9KA/+6Y3xN/Huz/5lHjz1jg+HhTcFA6i04/RLgujJZ4c1HN4WfJU2bQm+Rwdu+7uwhm1Hgl3xlD3BMTCltHlv8Ou89dQzojYEx7qU0rPrP5EHP/K//89h4bIb7vhQHqzX63KvwMiYCQvQrc/c2GL0tmo2FgAAGK9euVfLDgCjJwkL0JNsLAAATB25V2ACScICrE42FgAAJpzcKzDJJGEB1qDIxnb+G2Rjf+dDz/+lYGk2AACgCnKvwFSQhAVYj2IJ/zwb+6XfOX5fCNlYAACoyP/x5lPzoNwrMLEkYQE2RDYWAABGJs+91uv1VBqWA0wmSViA4RgkG3vxS/949A0DAICp1vrIG5YfnAjKvQLTpdZut8fdBoDZlGdjC+u4i9cDF7wmD+6477th4XPPPScPXnXlhXnw7N/eF9bw5m1/lwe3/8Lvh4X/4198Pg+edPbmPPiKHzotrOH79xzOg49uDn6hdr4wuO4spXTPSUfy4HMuPiMs/MefuysPfvukWh78zA/eHNaw9SPBu7tm36V58BVvemNYwwtf/5Q8+NN/9d/Cwq/4xlV58Lv/8Pd5cPMtcaL/3DPOyoNXvuLasPCh7WfnwS98+oY8eOyBr4c1pAM35bGlY8FnVKvFfw9ut5+MCsevFg5mdp8SvOWHU9wlavvvzoNLu87PgwcvfVVYw4HbvpkH99QOhoW37Q925lI72j+px3tei1q0437uN9+fB9955tawhgf+9Yfz4D9//Vvy4I13Bx9cSulbnwh65vn3fyosnML91g7exdGdzwkr2Pb4zVG1R+OXi7Tbx6Jg/O5S9DHVoganFA+847I9CscvF5XbtCn+fu3ZGXzHX/2z/1sePHxq8GuSUjp/3+48+JFvxC93y58Fv4NP3xYch6+97q1hDfdsC347Pn7V18LCR/7j3jy4feFQHvy71/+bsIarNwcHikc37cmDL7zklLCGVzRemQePPT+oIaX07z4dtO31Lwm+jP/hu/eGNTz+vi/kwaftemYePLIp7lQvfdnlefCu2raw8N/8+3flwcseC46ie7fFX7rNO3blwSue/+Kw8IOnXZEH20eDnfbFP/8vYQ3/5OXX5MF7N+/LgztOj0cpm08POvyOo/vDwn975vY8eKB1fR48//b/Gtbw6CN35sFabVNY+OTtwc48WIveyOH7wxouOmdfHrz00mC3H73k+WEN13/843nwp3/5Z8PCH3jHr4TxXnot9prkXoEpZCYsQFX6zI0tBpTryMYCAMAMk3sFZpIkLEDlZGMBAKA/uVdgtknCAoxOMXxstVrNZjPMxiYJWQAA5obcKzAnJGEBxqDRaHRmxebZ2GR6LAAAs07uFZg3krAA41RkY5PFCgAAmGlh4jWlVK/XFxYWilExwEyShAWYFKssHbs8Zt330v88+rYBAMD6/Pz/eH4Yl3sF5ookLMDE6ZONTSndfv2bOw9kYwEAmEy9Eq9J7hWYV7V2uz3uNgCwinDp2EK+WMFjl78xL3bo7lvz4NnH7gzrvPyq5+TBZ770uWHh3f/irDx49OA/yYOn/ck9YQ0/uONwHjx4ylIevPQnzg5r+PEUDPQ/+IEbw8Jf2nIwD/5R7Wl5cOnWV4Y17Ppu0Ixzz39mHty3Z2dYwyVP35sHn35V/O6+9eqb8uAHPvjv8uCxv7o8rOHcb5+SB6/euzks/Ko3XpsH73xyTx78yJ9/Maxhy+3/kAdPOnJvHlx65OawhtQOPqOTtmyPC4dt2BS8u6WlY2Hho8eOBi+3eWsePHLkUFhDbWlTHmxvCvpwSinVwtFXFKzFFYRl11T4mZe9JA8+emW88smdW7flwVPuDj7QRx75QVjDQ7d8IQ+e8+RXw8LtFBwQainaw0vxHt6y5aQ8eOVlLwoLX/ma1+bBI/cEx8ZjPUbND993Xx6857Zb8uBDD8XHwCNPBP3q8NHHw8K1WrArdmwNvuP7Lro6rOFH3/Yv8+B9Z+3Og++/+66whq1fCb6h2w8Fuz2ldNVpQf956XN35cEHLo9rOHTx3+bB33r3DWHh7becmwcv+n7w7s7ae1FYw85dO/LgtW+5Ig/+2mf/Pqzhhc8Mfg52nH8gLPyRGz+TB3dff2YevOTU+Ah/9aXBsfHGB4Od+cCX44P25pOCw90PPWtfWHhrOzhg1k4NfuxOe/LRsIYvfTk4evzIK+N3d9ue4LP73B9/Og8+7ZzzwhrOv+C0PPiNTafmwQf/+hNhDVddui8PXvmTzwoL/+67/yAPXnjzR/PgM658cVjD/seD7/4ZZwZjrZTS3he8PA8unRWMMe4/KR6Q/Ld3vjcP/ouf+Yk8+Pn7gj2ZUnr4v6w4pPRacCDJvQJzz0xYgCnQdSOvZOlYAAAmRp/FXpMbbQGklCRhAabLgDfySnd86Omv/IuRtw4AgHnx1+89p9dTJr0C5CRhAaZV/6Vjb/7E8evIZGMBABiWXrlXk14B+pOEBZh65cFunpAtsrEppQuf8W9G2TAAAGbAO95+Wa+n5F4BBiQJCzBTihFweC+v73/rxJ0TJGQBAOijV+61k3i14ADAmkjCAsym/qvHpuWE7PdTet7lvzz65gEAMJn6515NegVYH0lYgNnXf3rsDbe8u3gsIQsAMIfuvLnnINBdtgCGotZut8fdBgDGIJweW/aCn/xUV2T/d74clrz44vPz4NLZV+XBQ4cOhzU896WX5MGvp9Py4Ne2XR/WcNY1F+bB79/+vrDwEwd25MHNRy/Ig4e+cGNYw67Pn5UHL3zai/Lg+T/03LCG9uOH8uDS7uAtp5SeuvRoHtz/zD158KbP3BrWULvvsTy4fc8ZYeFj996XB591cfCWH0mnhjV8+Wufy4O7j27Og0/+4J6whh1LQYNP33owLLyp/WQePG1n0LaLLr88rGHLrmBX3HPvw8FrpaWwhjtuDrrKocceDAsfOXBvUPMTwVteah8LawiddWbwPUopbTp5dx68985v5sHa0uNhDXsueEkefPjoyXlwadPWsIbHHrw7D556KP5+pVrwrreeFHxtd+8ODj4ppbP3BcefF77pTWHhh/YEffsDB27Pg7suit/d7b/2sTx4ze4fyoPnXXhmWMO2o4/kwQfvDr6JKaVnX703Dx4+/al58B8fOBLW8NR9waHm83cF39D2/rhLXPXioFOl0+LueuTZX82DH24F3/2d9wefRUrpwMf/Pg/u6bF/zty5KQ+eclqw55/5xp8Oa3hoS9DZvvNg8A191Wu2hzW86zN/nAcvPv3asPDLLgu+Sn/x+B15cOtn4t/QFx8JPo6T9gVd4vxLgp2TUmrtfygPPnfb6WHhbz30RB7c9P8Fvz4vffHFcQ13BF3l0APxAXPzIw/kwS07g7d8ycW7whpufCg4bh/4enD82ZHiU+M9Tw3GGFs3xz8HB/YHP1W3fy0Yvew5GB8Df+l3ggWjfuX3/iYsvPvrQc3Xvul/yIPffnhnHlx837PCapNJrwAVMBMWYE51TY9NWUL2i3/+is6DPBsLAMA06pN4TSa9AlRJEhZg3q26emyRjU0pXXHFu0bZNgAANug33hlc0FAw6RVgNCRhAThh1emxN930r4rHErIAAJNJ4hVg0kjCAhBYdXpsKiVkb7opveY1fzLK5gEA0OWbd/7blNI33/lvw2c7iVerDQCMiyQsAKsoz5LolZD9y788cQsICVkAgJHp5F5DEq8Ak0MSFoA1WGtC9tU/843RNAwAYH7c87HXp5Tu6fGs1QYAJpAkLADrNEhC9uN/cFXxWEIWAGDdOonXXiReASZcrd1uj7sNAMyUXgnZsudd8Ib1Vb79Bb8Yxq957kV5cMfuU8LC9246OQjeuj8P1nbGNezduZQH7966LQ/u/8btYQ1XvfDCPPjFj34pLPz8512ZB8+49NQ8+Mk/uiGs4fU//dw8+J8+cH1Y+NpfeX4efM8vvT0PPvuM14U1bD3jrDx48L++LQ8ubT8jrGHXxS/Lg/fdeVtY+F0f+D/z4K/+P1/Ng7/4ukvCGp6zEHx2/+oH38qD5516V1jD/ltfngfv+eLOsPBt7/jNPPhTr311Hvy7j380rGHLwe8EbXtK0KlSSlf/98HX7es3/yAP3ndr8JZTSkfu+Js82H7y0aBoLf4D/+YdwQe9dChoQ0ppqX00D568Nejwz3hxPazhaT9+bR785CeCnZZSOumKq/PgZ9/3jjy47bF/DGs456yz8+ATm3bkwR//X38prOHuh2t58OWv2R0Wvv7+Y3nwoXZwUHrxmZvDGv7o/uCNbL/hcB48dXPch3e9JDg2fu59fxAWfuorXpUH7/zd38+DF973zbCGrZuDrnLu3qvyYErpn70z+H7dlHblwd/57AfDGnb+7ZN5cM+Vz8mDd37tU2ENr7v2jXnwsl98Iiz8a+/4z3nwqQ+/OA9esutpYQ23nR3sn+1LwS/dkZvvDmt481uDOzh97E++HxY+v/GUoA1/E7Th0I03hzW88hXBzvzqdx8LCz98x3fz4J6D9+XBB37wSFjDGfueERS+6XNB0SeDb0FKaeuBm/LgT746OM6klP768p/Ig8f+w8+HhQdxwx0f6vOsxCvAFDETFoAhG2SGbPmMYt0JWQCA2TNI4tUyrwBTRxIWgApJyAIArEriFWDmScICMCISsgAABUsNAMwVSVgAxkBCFgCYQxKvAHPLjbkAmCCXXXbZnXfeefhwfGcMAIAZI/EKMCckYQGYUL1myAIATK9O1jVJvALMmU3jbgAAxFqtVqvVavdVr9eLM5lCs9nsv9UghlLJWCqv1+sV1X/dddft3bs3/6Q6n8IGK282m52PcihN7VJ0ko23s0vR7Coq79rbQ/xYm81m+eMbVrUdle7timpuL09K2Lt3b0U1V9G3q+gb7Sq7R7lL792797rrrhti5ZX26vZyx67oAFtUvsF6ykeksr1791bRtzuq+9HpVF5Rze3h/RaHv4n9K28tyz8sAGaYmbAAzIjifsHOaqrWarWazWbXJOV6vT7he77RaFTUwlartbCw0Gw2h37T6re97W3vfe97i38OcSd32jz0ajsajUanewx9n9Rqtc6DoY9gOzXv3bv3rrvuGmK1xX6ubicPveZiJw+35qLBqYL9XLxEquz28Z1dMeE3pi/v5OQi91EpekVFfQ+AmSEJCwCsUzkba0RRnfPOO+/uu+/uPK4iDzv0VGk5wzvcjlF1enfoycGKGlxdbjctt7mijH9K6brrrnvPe94zlJrpUl1qHgDYOElYAGCjWq2W6T+V6kpjDSujV93kvk4yqIrZwZ1saUXTP4eehK2otanKPZyG+o0uz82s1+umClbN0RgAJpYkLADAFOhaBWJuZ7p1EkxDf+/VLUfQbDbnM/OoxwIAlEnCAgBMDZcbV6S6Katzqzx9u6IZuwAAU2TTuBsAAMCgOrMLU0rl1QlgAjUajc5t4tvttgwsAICZsAAAzDszYQEAqJSZsAAAAAAAFZKEBQAAAACokCQsAAAAAECFJGEBAAAAACokCQvA2DQajVqt1rkfzoBarVaxVaHRaAx4L51em6/3HQAzol6v1+v1hYWFcTcEqNCIBx5GHQCU1drt9rjbAMCcajQai4uLKaVBfoxarVaz2eyUD616W/Pi5ULNZrP/eVHXs26hPnTlPbzq7i0KLywsrHpCu6aaAejS+Qlex4aDHKJHaZQDD6MOALq1AWBM1vRjNMiPWr1e77V5vV5fdfNmsxlu22w2883r9Xqv8iNTtGrwTXq9lz67bpDN1/sOVhh8fNKVCxi88LCaCtDLjB2ZOwb5DQ1N2lF3wB+OrsLreIMzOeoAYIMkYQEYj/IJxpoKd53wdJ2rhKcoXWm4cpk+NRfKBTrWdBZXnTWd6ocndQOeEHa93Dq27Wxe1r/+VataX7MnLR0AzJ4ZOzIP8ip9TNRRd2QDj1kddQCwQZYjAGDU8gv0+v8YtVqtYqHGXpf+levMa+v/bP/6O9sOHh+lYlW7QX7NB1wCr9cFkv0vq+y/bXhFZ2f9zXL58kv037Fd72XwC0LnbdhjhQem1FRf/D5jR+b8hdaUkJ2ETySNfOAxq6MOADZqXNlfAObNun+MBpkD0qdM+Uy+15ygYvN8WkqvDYtq+ze+OhuZ0dP1drrOqPPNRzapZ9WquoqttXCfYhuRz2WbkOuIB3/vVniYQ+vuty5+H7Dlayo8yUfmtb6vydGnq/TfcCMDj1kddQCwcQ7iAIzIxs+FBsy1dRUb5FSqfMoUVtvnFfs3vgp5eqJ/+UFSZv3L9N+Hg2w7YHyQN1XuD4PsgVXf+wb1yRat+opVX0c8eN6kqyVWeJh56+63VXfaQV6ljzF2yBk+Mq/6WhOrT1fpv+FGBh6zN+oAYFi29PllAoAhyk9QV72IsuoGFLouip/Ma/0GvGo1Vz7Z6/XWGo1GvV7vfCJdn0ur1Soi4QXC5W1znXhx6WVhYWFhcXExvxJ2fb2i16dW9WWw/T+UxcXFPt1p1euIFxYW1nQdcaPR6HPlb/+O3VXVqrftLrdkkGJMlHX32xF32o41JWTzQ03V5uHIPGviOScAABbmSURBVL3GO/CY9lEHAMM37iwwAHNqfXP0epVZdVJJGnh6Vzg3cxIuDFz3r/la90BXhaOc1LOmS2jL10T3Klzp7K0+rV31jVjhgXFZd7918Xso9TbghpN/ZB7w5SbfaAYea/1kJ3bUAcDQOYgDMB6DnwutaXm1Xqea6z4dKuLlly6aNMpLX+uZAXfggHugXLLrdQfZvNerrPVUv39ru056V90JqaRP49eh/NJht9xIjmnOV3igOhvpty5+D83JkXmKPpE+RjPwGPCTnfxRBwBDN8U/ogBMtTWd0fVPHPR5ts88oMHbUz5TKp9jj/dcaB2n+v2Xa5yQST39Xy5/lf7vbsDGr8MgNfcqM8rbtgzST8IkbK/3NUgZJta6++2I7zU0vSm/WT0yT+8nUjaCgccMjzoA2LhNCQAmXqvVKk5CFhYWarVaY1mtViuvi9e1tmC4Ut66X31xWUqpXq9PyyJuxa9+/4UXh7Kvcp1dt7CwUN5drVarsxZh+Sy0XD4NvHJfedJQ11PVfUBd76VXsfzddZSb2utDKdZq7LUf8g1XXcW1V4HiJRYWFnq1OTQtX4GUUqvV6hwuyqpeMnjSbKTfjqvTzrDpOjLPofUNPIw6AOjDjbkAmA6tVqs4P0zRSf7gtxJa96sXJ1er3klmGhW7tHz6PWDWJqyn2KpzM59ygm/AU8rOtmHlgzRmkPverE/5ytA+xVZ90T6bD+u2La1Wq/+Ng8o1NxqN4q31v5/PdOl1O6nFxcVarbbqoaPr2enNgwyl346g01I2gUfm+THGgcc8jDoA5pAkLADToXwiFOqcq1R3ltKZ/1JR5WNXfmvl/TysST2ds/3yGWyv8/xy0rDr/DYs37mXdxptcnCDrzX4JN8+JfMM9fryJl2JufL+z1+iq3nreLnR65WBLSwsLPTKpHSSIF2bNxqNKU2IbKTfTlSnnR+Tc2Tu1apBXmWd7ZsA4x14zPaoA2A+ScICMAXKaZTiIsri/KTIwS0uLlY6H3ZWde3eKnbgUCb1hPP4urK05X+GM8hmQCfP1ZU67L/Cw5ry1EX5/Ns0dfmUVqtV7gbljlfu9r2OG0X+pTxVsKO98qZn9LfWTkua4CPzNE6HXwcDDwCGThIWgEnXdSIUXoZZlFlYWJAcGVzXNJ9Kr0IdfFJPr6RhrzP/PknDqpV7YK+n+sSt8FC1Pg0uX2i8uLiYXz7f2VH5Lu3s/Km+3H6t/dbF7yM2mUfmuWLgAUAVJGEBmHS9ToTKytdQT3VyZGTy66ynKBXSq53lt7PqOgbrlk8ODa9XrdVq4S61wsPIlKfBhru90Wj0uXy+SK90xTv7Z+p2zkb6rYvfR2YqjszzMHPZwAOAKkjCAjDRBk+lhdMnV70r0XzKV8mcqKspwzPbonn5+f8YP+X+KwZWOl/SCg+rKqcOe+2cVTPO+YaT801Zt3H1Wxe/9zfhR+bCzGcbNzLwMOoAoI9N424AAAxH/7tnpIFTJ1ORXVq3zvlh1zSrdrs9gef561O8kdGkC8trhnb2ZLPZLL9iJ59V0at3MmUd/V+l6wLwcvP6lx/KFMix69MHyvttZr4Fqxpjvx28086VmT8yz6r+Aw+jDgC6mAkLwIzoSqasdarOPEy26ppm1XWfotC4JvXk04uKB+FJb/97slcqv91T53GxtxcXFyc/3zTeFR4qstYbkYXyz24q3vuqpqjfznyKaoqOzHTZyMBjHkYdAHSRhAVgBpVPhNaanlt1Ru2U6rrNyDquXh/wDLOKjEn5dXvdxb6ctF3HfYTWrdee7LMS6+hN0QoPk6Nz6FhYWCh/fMWF/NOeGZyKftsxG1nvXqb6yExZ8SkYdQDQiyQsADNi1RPXPidFM39Jcp8bPQ/LcCf1dCUNi3ivPELXJM2RXURfr9f7dJhwneKpU6R4pmtB2HUk4rs+puJGUgsLC13rOUzgvZLWZB767VSYuiMzXfoPGOZ51AFAyJqwAEy0VadAFnpliAavId92NpTvEb+O8/y17pNxTeoJlzEd7wca7opxJe/yZWFXXeFhNA2ryFAS8a1Wq7MfFpel6c/ArirvD7P9fsdlTo7M02iDAw+jDgB6kYQFYNKVk0e9TlPL5zn5qWb/GspnwjN5mlpkozaYPBrxpJ6u2wR1HgzS/iJZVpHBp1iuuojqGG/bMsgKD50Ho1/hYaJ0JlbXlzWbzSl9+8Pqt+41NCxTemSeExsceMz5qAOAXiRhAZh05ROYznp5Xfmj8k2lw8tsu2ro2rx8o/CZPE3d4MneuCb1dCUBVxWeJ09pvqxj6Cs8FI8bjUY5ARSWH9cKDxOoc8zpmMlDxBC5+H1wU3pknhMbHHjM+agDgF6sCQvAFGg2m+WUXK/z/D7zico19Lr4eqoTdr2U31Sz2Rwwlda1K8prRIY3i69iUk9+arrWPMII8g79b4nTK0syLbdtKdo5OSs8MBTr6LfT0mmnxfQemefHBgceczvqAKCfNgCMQzmVs45NcvV6vf/mnWuK17ftBBpwB64vZZbXU3622WyG9Q99N3Y1ftX611p+4w3r/xK9PqNBPrt1fEHW1Ox1d55p+bIMvgOr2NWTaSP9dsSddno/lFk9Mm/kry8bf/VhGfHAY8ZGHQBsnOUIABiPVqtV/BoNvkmxOGMR7Pyz3W6vOqOkM/mrfFI07Ys8jlJ5otbCwkJtWdW39i5ba/3VTf4qT4/q06pJu1mcFR7m3Eb6rYvfJ9MkHJmnyIgHHkYdAHQbfd4XANi4Ec+3ao9jUk/XVfCDbDKyQU55V5QnoIUF1rp5+Y2Hla/bWj+40XzQFRmwJ0zvpMt12Ei/HWWnnd4PZVaPzLMxExYAxsuPIgCwBuGknnE3agy61nAsJzu6shW99k+vMvO5wkMVBmz2gBfpz4YN9tuRdVopv7VyZAaAyVdrD3wtBgAAhVarteqKB32uBV518yquI240GuW1CFYdB3aVbzabU3Qv71qt1nnQf08OWGxmbKTfjqzTdnW8NXF2AwBMJmvCAgCsR6PR6H9P8/4L/3U273MdcRUJwXIGbZDJhl1tmKIMbFr7yqRzcgf5jfTbsXRaAIDZYCYsAMCGdFKTXbczGjwb1blzS2fzzrYLCwvTle6cTOXZlL1GvIOUmVUb6bc6LQDAWknCAgAwm1ZdaqBIwprFCQBApSxHAADAbCounF9cXMxzrK1Wq5gHOidrEQAAMC5mwgIAMLOKybBp5Y3FygsRmAYLAEDVJGEBAJhZrVar/yxXGVgAAEbAcgQAAMysRqPRbDaLdQm6yMACADAaZsICADD7Wq1Ws9ksbsOVUlpYWChWJwAAgEpJwgIAAAAAVMhyBAAAAAAAFZKEBQAAAACokCQsAAAAAECFJGEBAAAAACokCQsAAAAAUCFJWAAAAACACknCAgAAAABUSBIWAAAAAKBCkrAAAAAAABWShAUAAAAAqJAkLAAAAABAhSRhAQAAAAAqJAkLAAAAAFAhSVgAAAAAgApJwgIAAAAAVEgSFgAAAACgQpKwAAAAAAAVkoQFAAAAAKiQJCwAAAAAQIUkYQEAAAAAKiQJCwAAAABQIUlYAAAAAIAKScICAAAAAFRIEhYAAAAAoEKSsAAAAAAAFZKEBQAAAACokCQsAAAAAECFJGEBAAAAACokCQsAAAAAUCFJWAAAAACACknCAgAAAABUSBIWAAAAAKBCkrAAAAAAABWShAUAAAAAqJAkLAAAAABAhSRhAQAAAAAqJAkLAAAAAFAhSVgAAAAAgApJwgIAAAAAVEgSFgAAAACgQpKwAAAAAAAVkoQFAAAAAKiQJCwAAAAAQIUkYQEAAAAAKrRl3A0AJlqtVht3EwAAABiadrs97ibAPDITFgAAAACgQpKwAAAAAAAVkoQFAAAAAKiQJCwAAAAAQIXcmAtYg2vOfHkt1VJtU6ptSqlWq21KtVpKm1KtVqttSsefqqW0qbYcH6jkcqRWqx1/KtVSrXaiks6G5cdFyVotpeKfxcvVVpbstKQoc+JVat0vV4tKFm1ejqdUepy/XHnbFSVLlaTo5VJWMi3XmbKGLdd84qmUaiv/2bOSbJN82/C/tRUl2ycep9Kb7fpv11NpuWHH/7ddjtf6PdVeUSy1a7UVT6Xjuy2l1D5RQ+eJdnfkRLH2ykh7gKdKD7pKngguP1Vrl5rdeXyiQKp1lW+Xi63458oNByjZLjWsfXzb5UpSrd1OnXcR1Ln8HoOSqVQmpeXXTauVrLXTiaeWH6zYtrzVikpqpZdb7jzH/1kr1bDcGYunipKdx8f/Wyrc+VjaqVb0rONP1VJXVcefLR4c/8yLkiueWvHP44WjkrVSJbWi2uV/Lj8uKkkrKjnx/90la1nJVC68omQ7q3NFJelE5MQmRUvKm6Subctt69ewVKqh/EJdBbqfTSsel4LtoEwKSp74UpaOHMuRE091VbLc5Y+XL22yXOeJo0W766nUu2T5kLbyqZXPFpWcqLAdPdVVZ3tlgXJL2qUCabmzR/V3V9Kj5PKDWv5yq5Rc7anuJhU3kjnx9e0uWT6KdG+48kDS9VS55V2VrPhn6Zi3asnjTTyxYbtXJV3/7X6qtOHxg31YZ9dTxT+XD9vBg6hhqR3VGW3bXlFgRcl2+HLFUz3qbBeN6a6ku2ErK2mXW9JeuR/avRsWvFxc8vj/FdW2T7yX0q7oW/LEE+3l/b38+ie6SVFn+bZJpTqLYPByKzccoGT5v+12z6e66+xdst1j85VdrFTyRPzEh9BdsquTlj/bcsnuXrziqVLDomI9unB3PI+EX4tw26Bk11Mr90O7u2StVyXFP7se5yX/9RNLCRg3M2EBAAAAACokCQsAAAAAUCFJWAAAAACACknCAgAAAABUSBIWAAAAAKBCkrAAAAAAABWShAUAAAAAqJAkLAAAAABAhSRhAQAAAAAqJAkLAAAAAFAhSVgAAAAAgApJwgIAAAAAVEgSFgAAAACgQpKwAAAAAAAVkoQFAAAAAKiQJCwAAAAAQIUkYQEAAAAAKiQJCwAAAABQIUlYAAAAAIAKScICAAAAAFRIEhYAAAAAoEKSsAAAAAAAFZKEBQAAAACokCQsAAAAAECFJGEBAAAAACokCQsAAAAAUCFJWAAAAACACknCAgAAAABUSBIWAAAAAKBCkrAAAAAAABWShAUAAAAAqJAkLAAAAABAhSRhAQAAAAAqJAkLAAAAAFAhSVgAAAAAgApJwgIAAAAAVEgSFgAAAACgQpKwAAAAAAAVkoQFAAAAAKiQJCwAAAAAQIUkYQEAAAAAKiQJCwAAAABQIUlYAAAAAIAKScICAAAAAFRIEhYAAAAAoEKSsAAAAAAAFZKEBQAAAACokCQsAAAAAECFJGEBAAAAACokCQsAAAAAUCFJWAAAAACACknCAgAAAABUSBIWAAAAAKBCtXa7Pe42AJOrVquNuwkAAAAMjUQQjIWZsAAAAAAAFZKEBQAAAACokCQsAAAAAECFJGEBAAAAACokCQv002636/V6Sqler7ephj08AkV/piL2cNXs4arZw1XzY1c1e7hq9nDV7OGqlffwCE8ogRMkYQEAAAAAKiQJCwAAAABQIUlYAAAAAIAKScICAAAAAFRoy7gbADDvWq3WuJsAG+UOD0w7fZhpZzjBtNOHgZlnJiwAAAAAQIUkYQEAAAAAKiQJCwAAAABQIUlYAAAAAIAKScICAAAAAFSo5lawAAAAAADVMRMWAAAAAKBCkrAAAAAAABWShAUAAAAAqJAkLAAAAABAhSRhAQAAAAAqJAkLAAAAAFAhSVgAAAAAgApJwsI8ajQatZUajcaE1AYDGlbHa7VaYVWtVmvobYay6g6eRc1DqQ16GW4fzo/GDsVUbYh92HCC8Wq1WhsfSDitg8q1gTlTr9fDo0G9Xh97bTCgYXW8ZrPZ5ydSN6Y61R08yzUPpakQGm4f7nM0bjabQ288tIfah/sPJ/RhRqDTnzcyinBaByNgdA7zpfhxrdfrnRFhvV4vB8dYGwxoWB2vfMpUVNVsNstjUN2YKlR38OxKBAyvybDCcPtw19G46yXksKjCEPvwIMMJfZhKFZ1w3UMIp3UwGkbnMEf6/DwXP7GDjxGHWxsMaIgdr8/IsnxCNZx2w7JKD55d01g23FgIDL0P9+qxG08rQGi4fbjPJnJYVG0oswec1sHIWBMW5kjx+7qwsND1VBHpfzlVdbXBgIbY8RYXF1NK9Xo9X6+t0WgUg06LYTFc1R08G41Gp1dDpYbbh4tjbL5JcSjWsRmu4fbhon/mA4ZigKEPM3SdNVsXFhY23ruc1sHI1NqlPz4Ds61zk5Yw5VQ8m1Ia8LAw3NpgQMPqeEW6qldVq74WrE9FB89Wq9U5U2o2m8UpkyMwVahiONGrfKvV6pz5Lyws+JMYw2JIzAwIb7+5vlGrPgwjYyYszItVf497rcU+gtpgQDoe0666PtxJvNbrdYkqKlVRH+61Vefm8p37zq+jWsgZSzAbuq5xXnc9vhEwSpKwMC/WcWHgyGqDAQ2x4y0sLHRuOJBfeNVh9itVqOjg2Sls1jYjMNw+bJDA6A39OFwsmpEfgYuINBYTy2kdjNKWcTcAGLVeKadJqA0GtPGO12g0+g8l+yyPBRs3xH7VarU6a2voq4xSFcOJYvGBIuicn+oMqw8Xi3J2em/RaYtVYob4WlAdvRRGQBIW5k6v85lWqxUuLTTK2mBAVXe8Iqvl4m4qMqw+XJzk66uM2NCHE/md5RYXFzvXK+jbVGFYfbjRaHQW415cXAxvkdRsNvVhJp/TOhgByxEAwAqNRsPUFaZFZ+KVhQiYduUMbGetmM7jxcXFhYUF3ZsJ12g0ei044C9kABQkYQHguM6f+otEgKkrTLgib+WvBUy74mrudrvduRNXu90uslqDL1kIY5H/FaH8hwRjCQA6JGEBIHVuvV1ksur1ervddtbEJCsWzfDXAmZD3pNbrVafWx7BhCgysJ3BQ2tZ8YcEeVgAOiRhgeOGe3rjZImxWF/H66RfizOoZrOpAzMug/c9S8EymdZ3/OzVk4u/jZkMy8isqQ+XM7D5hv6QwAzQdWGIJGFh7vQ6XV/f6c1wa4MBDbHjdV1C2JkSu6HGwQCG1YcXFxdrmeLZPALDMpoBgAMy1RluH+6VqPKHBKaF0zoYgS3jbgAwcYa7tqCVChmLATte/wksMEYOnky74fbh8KbzUKlB+vCqPbNIbOnDTDsjE9g4SViYF507Dg1ScpBZJ8OtDQY03I4nA8voDbEP97oTdyqd6vcpA+sz3ONwsRTMqnRmhmVcg1h9mMnktA5GqdZut8fdBmBEit/X8IvfeXbwbNRwa4MBDbHj6aWMxQgOnv1fAjaoiuFEr/L+WkYVhtiHiy7a6x6JrVarWMJbH6Y6Gxk/OK2DkbEmLMyR4i/w+S/oOv6wOdzaYEDD6nhFYZdWMWIOnky7KoYTq962yLGaIariONxr3cwirg8zsYxMYHTawDwpvvvNZrMIlkeNXeXLV05tvDYYiqF04yJYX035VWAohnso7lP/MBsNJSMYTrRXHqireBfMsyH24T4dVR9mZFbtaU7rYBJYExbmS7PZ7PwdfmFhofglLpZjW+u9L4dbGwxoKB2vKD/IcoRmATBcDp5Mu+qGE6k0N7bzrGtgqcIQ+3CxtPHi4mKtVuvqwB36MBPOyARGZNxZYGDU+lwtlRdedfrVmmqDYdl4Nx78h9LsFaow3ENxlzUVhvUZzXDCEZjqDLEPN5vNXvfd0ocZjVX7m9M6mARuzAVzqmtm3wb/Pj/c2mBAOh7TTh9m2hlOMO2G2OtarVZXGmthYcHFNEwXx2Go1P8PO0jvBp+ANXIAAAAASUVORK5CYII=", - "text/plain": [ - "" - ] - }, - "metadata": { - "image/png": { - "width": "70%" - } - }, - "output_type": "display_data" - } - ], - "source": [ - "fig.show(width='70%')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "44e22c8f-d7a4-4712-b678-48be425e163f", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a4076f67-bfdc-4c6f-963b-da9544d0da41", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.13.1" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/driver/check/.ipynb_checkpoints/dplrw_results-checkpoint.ipynb b/driver/check/.ipynb_checkpoints/dplrw_results-checkpoint.ipynb deleted file mode 100644 index e842de13d9..0000000000 --- a/driver/check/.ipynb_checkpoints/dplrw_results-checkpoint.ipynb +++ /dev/null @@ -1,663 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "cf1bab3d-ca36-498f-983d-9ac15198597a", - "metadata": { - "jupyter": { - "source_hidden": true - } - }, - "outputs": [], - "source": [ - "import xarray\n", - "import pygmt\n", - "import pandas\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "from matplotlib.colors import ListedColormap,LinearSegmentedColormap\n", - "from matplotlib.ticker import MultipleLocator\n", - "from IPython.display import display" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "b0efb38e-f221-4943-a019-581e93556deb", - "metadata": {}, - "outputs": [], - "source": [ - "ds = xarray.open_dataset(\"../data/MIROC_outputs/ctrl_MIROC-COSP2.nc\")" - ] - }, - { - "cell_type": "raw", - "id": "bc8c7853-38c7-4cc9-8550-4bfe379c03d3", - "metadata": {}, - "source": [ - "print(ds.info())" - ] - }, - { - "cell_type": "markdown", - "id": "b8f95c55-be27-4e36-a6c7-05b04049a4d0", - "metadata": {}, - "source": [ - "### config" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "3a3345fc-48d9-4848-9c58-f15f9cd18508", - "metadata": {}, - "outputs": [], - "source": [ - "# variables\n", - "\n", - "vname='Doppler velocity'\n", - "#vname='radar reflectivity'\n", - "#vname='terminal velocity'\n", - "#vname='vertical air motion'\n", - "#vname='Ze-Doppler'\n", - "#vname='Ze-terminal'" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "69ff28b8-67d2-44c3-9d8e-a911178c77d1", - "metadata": {}, - "outputs": [], - "source": [ - "# meridional zone\n", - "\n", - "zone='tropics'\n", - "#zone='mid-north'\n", - "#zone='pol-north'\n", - "#zone='mid-south'\n", - "#zone='pol-south'" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "3ffbf5f0-78b4-4c4b-92b4-9c4366d502d9", - "metadata": {}, - "outputs": [], - "source": [ - "# cloud regime\n", - "#ctype='ALL'\n", - "ctype='stratiform'\n", - "#ctype='convective'" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "85cafa90-23d6-4e47-9192-3914b4f5c04e", - "metadata": {}, - "outputs": [], - "source": [ - "# only for Doppler or terminal velocity\n", - "\n", - "zonal_mean_flag = True\n", - "# True: zonal mean\n", - "# False: CFED" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "55690fe9-ec39-4e75-bb81-d63e519ddc1c", - "metadata": {}, - "outputs": [], - "source": [ - "# only for terminal velocity\n", - "\n", - "weight_factor='reflectivity'\n", - "#weight_factor='mass'\n", - "#weight_factor='number'" - ] - }, - { - "cell_type": "markdown", - "id": "7d8737ab-22e8-48cb-a8a6-9836451780c2", - "metadata": { - "jp-MarkdownHeadingCollapsed": true - }, - "source": [ - "### internal process" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "65ec4419-02fe-4e9a-9f3d-50513d55cb91", - "metadata": {}, - "outputs": [], - "source": [ - "%%capture\n", - "# data access\n", - "\n", - "if vname=='Doppler velocity':\n", - " if zonal_mean_flag:\n", - " var=ds['dplrw_Z']\n", - " else:\n", - " var=ds['dplrw_T']\n", - "elif vname=='radar reflectivity':\n", - " var=ds['Zef94_T']\n", - " zonal_mean_flag = False\n", - "elif vname=='terminal velocity':\n", - " if zonal_mean_flag:\n", - " var=ds['vfall_Z']\n", - " else:\n", - " var=ds['vfall_T']\n", - "elif vname=='vertical air motion':\n", - " if zonal_mean_flag:\n", - " var=ds['gridw_Z']\n", - " else:\n", - " var=ds['gridw_T']\n", - "elif vname=='Ze-Doppler':\n", - " var=ds['ZefVd_2']\n", - " zonal_mean_flag = False\n", - "elif vname=='Ze-terminal':\n", - " var=ds['ZefVd_2']\n", - " zonal_mean_flag = False" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "ddafada6-a47f-4209-9c0c-f6e4f927f017", - "metadata": {}, - "outputs": [], - "source": [ - "#grids\n", - "\n", - "lat=ds[\"latitude\"].values\n", - "lon=ds[\"longitude\"].values\n", - "\n", - "temp=ds[\"lvtemp_grid\"].values\n", - "zgrd=ds[\"lvdBZe_grid\"].values\n", - "vgrd=ds[\"lvdplr_grid\"].values\n", - "hght=ds[\"levStat\"].values" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "f4bc95c9-dfba-446e-8f8f-5658a52f3b40", - "metadata": {}, - "outputs": [], - "source": [ - "# target region\n", - "west=0. ; east=360.\n", - "\n", - "if zone=='tropics':\n", - " south=-20.0 ; north= 20.0\n", - "elif zone=='mid-north':\n", - " south= 20.0 ; north= 65.0\n", - "elif zone=='pol-north':\n", - " south= 65.0 ; north= 90.0\n", - "elif zone=='mid-south':\n", - " south=-65.0 ; north=-20.0\n", - "elif zone=='pol-south':\n", - " south=-90.0 ; north=-65.0" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "3a89e0da-5511-44b5-87cf-207dc9218307", - "metadata": {}, - "outputs": [], - "source": [ - "# location mask\n", - "lon_mask = (lon >= west) & (lon <= east)\n", - "lat_mask = (lat >= south)&(lat <= north)\n", - "\n", - "mask = lon_mask & lat_mask\n", - "\n", - "index = np.where(mask)[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "0fff3516-6f6c-4fc1-8f69-f2f61f4cac2c", - "metadata": {}, - "outputs": [], - "source": [ - "# cloud regime\n", - "if ctype=='ALL':\n", - " regime=0\n", - "elif ctype=='stratiform':\n", - " regime=1\n", - "elif ctype=='convective':\n", - " regime=2" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "aff2506a-5aae-4e4a-8212-d49d8eb9fef4", - "metadata": {}, - "outputs": [], - "source": [ - "# moment\n", - "if weight_factor=='reflectivity':\n", - " nmlz=1\n", - "elif weight_factor=='mass':\n", - " nmlz=2\n", - "elif weight_factor=='number':\n", - " nmlz=3" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "d969c24b-398a-4b8f-9795-bc36da1c0ad4", - "metadata": {}, - "outputs": [], - "source": [ - "if zonal_mean_flag:\n", - " pass\n", - "else:\n", - " if vname=='terminal velocity':\n", - " sel_work = var.isel(loc=index).isel(regimeID=regime).isel(nrmlzdID=nmlz)\n", - " else:\n", - " sel_work = var.isel(loc=index).isel(regimeID=regime)\n", - "\n", - " if vname=='radar reflectivity':\n", - " window = 2.0\n", - " xtics = 5.0 ; ytics = 10.0\n", - " vmax = 0.2\n", - " origin='upper'\n", - "\n", - " extent = [ -40.0, 30.0, 20.0, -80.0 ]\n", - " zlower = np.searchsorted(vgrd,-40.0)\n", - " zupper = np.searchsorted(vgrd, 30.0)\n", - " tlower = np.searchsorted(temp,-80.0)\n", - " tupper = np.searchsorted(temp, 20.0)\n", - " sel = sel_work[tlower:tupper,zlower:zupper]\n", - " elif vname=='Ze-Doppler' or vname=='Ze-terminal':\n", - " window = 2.0*0.2\n", - " xtics = 5.0 ; ytics = 1.0\n", - " vmax = 3\n", - " origin='lower'\n", - "\n", - " extent = [ -40.0, 30.0, -6.0, 6.0 ]\n", - " zlower = np.searchsorted(zgrd,-40.0)\n", - " zupper = np.searchsorted(zgrd, 30.0)\n", - " vlower = np.searchsorted(vgrd, -6.0)\n", - " vupper = np.searchsorted(vgrd, 6.0)\n", - " sel = sel_work[zlower:zupper,vlower:vupper]\n", - " else:\n", - " window = 0.2\n", - " xtics = 1.0 ; ytics = 10.0\n", - " vmax = 2.0\n", - " origin='upper'\n", - "\n", - " extent = [ -6.0, 6.0, 20.0, -80.0 ]\n", - " vlower = np.searchsorted(vgrd, -6.0)\n", - " vupper = np.searchsorted(vgrd, 6.0)\n", - " tlower = np.searchsorted(temp,-80.0)\n", - " tupper = np.searchsorted(temp, 20.0)\n", - " sel = sel_work[tlower:tupper,vlower:vupper]" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "c661218d-216c-4051-9143-720c20a8c947", - "metadata": {}, - "outputs": [], - "source": [ - "if zonal_mean_flag:\n", - " pass\n", - "else:\n", - " if vname=='Ze-Doppler' or vname=='Ze-terminal':\n", - " smpl = sel.sum(dim='loc', skipna=True).values\n", - " smpl = smpl.T\n", - " nrm = window * smpl.sum()\n", - " nrm = np.broadcast_to(nrm,smpl.shape)\n", - " else:\n", - " smpl = sel.sum(dim='loc', skipna=True).values\n", - " nrm = window * smpl.sum(axis=1, keepdims=True)\n", - " nrm = np.broadcast_to(nrm,smpl.shape)\n", - "\n", - " zero_check = (nrm < window)\n", - " cfed = np.zeros_like(smpl)\n", - "\n", - " cfed[~zero_check] = smpl[~zero_check]/nrm[~zero_check]\n", - " cfed[zero_check] = np.nan\n", - " if vname=='Ze-Doppler' or vname=='Ze-terminal':\n", - " cfed = cfed * 100." - ] - }, - { - "cell_type": "markdown", - "id": "f7fca1b0-e94f-41f0-a093-10c8fcb33ad9", - "metadata": {}, - "source": [ - "---" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "f5ac58f0-3955-4da5-8641-261d4b534b89", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(40, 72)\n" - ] - } - ], - "source": [ - "if not zonal_mean_flag:\n", - " pass\n", - "else:\n", - " j_list = ( (lat + 90.0)//2.5 ).astype(int)\n", - " Nlev = hght.size\n", - " \n", - " if vname=='terminal velocity':\n", - " sel = var.isel(regimeID=regime).isel(nrmlzdID=nmlz)\n", - " else:\n", - " sel = var.isel(regimeID=regime)\n", - " \n", - " tmp = sel.sum(axis=1).values\n", - " smpl = np.zeros((Nlev, 72), dtype=var.dtype)\n", - " np.add.at(smpl, (slice(None), j_list), tmp)\n", - " \n", - " tmp = ( sel * vgrd[None,:,None] ).sum(axis=1).values\n", - " totl = np.zeros((Nlev, 72), dtype=var.dtype)\n", - " np.add.at(totl, (slice(None), j_list), tmp)\n", - " \n", - " zero_check = (smpl < 1.0)\n", - " zmn_work = np.zeros_like(smpl)\n", - " \n", - " zmn_work[~zero_check] = totl[~zero_check]/smpl[~zero_check]\n", - " zmn_work[zero_check] = np.nan\n", - " print(zmn_work.shape)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "b2d2372b-bf50-4cd9-8387-bb066ec8d4f9", - "metadata": {}, - "outputs": [], - "source": [ - "if not zonal_mean_flag:\n", - " pass\n", - "else:\n", - " window = 0.2\n", - " xtics = 30.0 ; ytics = 2.0\n", - " origin='lower'\n", - "\n", - " extent = [ -90.0, 90.0, 0.0, 14.0 ]\n", - " hlower = np.searchsorted(hght[::-1], 0.0)\n", - " hupper = np.searchsorted(hght[::-1], 14000.0)\n", - " zmn = zmn_work[hlower:hupper,:]" - ] - }, - { - "cell_type": "markdown", - "id": "df06376c-0eee-4d88-98dc-8d4982ab3afd", - "metadata": { - "jp-MarkdownHeadingCollapsed": true - }, - "source": [ - "### make figure" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "4f0215d7-c0c7-496d-9de9-77b79724dfdb", - "metadata": {}, - "outputs": [], - "source": [ - "colors=np.array(\n", - " [\n", - " [248,248,248,1],#white\n", - " [160,210,255,1],\n", - " [ 33,140,255,1],\n", - " [ 0, 65,255,1],\n", - " [ 0,185, 0,1],\n", - " [250,245, 0,1],\n", - " [255,153, 0,1],\n", - " [255, 40, 0,1],\n", - " [180, 0,104,1],\n", - " [ 45, 45, 45,1],\n", - " ],dtype=np.float64\n", - ")\n", - "colors[:,:3] /=256\n", - "color_listed=ListedColormap(colors)\n", - "color_linear=LinearSegmentedColormap.from_list('color_linear',colors=colors)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "f7e346ae-df53-4cc6-affe-3ef1193dfc51", - "metadata": {}, - "outputs": [], - "source": [ - "tmp=np.array(\n", - " [\n", - " [ 1, 64, 38,1],\n", - " [ 71,108, 25,1],\n", - " [154,125, 66,1],\n", - " [206,185,156,1],\n", - " [242,239,246,1],\n", - " [236,196,225,1],\n", - " [204,124,186,1],\n", - " [164, 65,138,1],\n", - " [101, 2, 75,1],\n", - " ],dtype=np.float64\n", - ")\n", - "tmp[:,:3] /=256\n", - "near0=LinearSegmentedColormap.from_list('lower',colors=tmp)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "45ecf13f-9b8e-4b94-b176-099acb1855f7", - "metadata": {}, - "outputs": [], - "source": [ - "tmp=np.array(\n", - " [\n", - " [ 26, 51, 51,1],\n", - " [ 35, 85,130,1],\n", - " [ 61,144,199,1],\n", - " [120,197,204,1],\n", - " [231,255,232,1],\n", - " ],dtype=np.float64\n", - ")\n", - "tmp[:,:3] /=256\n", - "lower=LinearSegmentedColormap.from_list('near0',colors=tmp)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "72913185-cab3-4fef-8434-98768042a687", - "metadata": {}, - "outputs": [], - "source": [ - "N1 = 128\n", - "N2 = 256\n", - "\n", - "lower_linear = lower(np.linspace(0, 1, N1))\n", - "near0_linear = near0(np.linspace(0, 1, N2))\n", - "\n", - "hoge = np.vstack([lower_linear, near0_linear])\n", - "\n", - "zmn_color = ListedColormap(hoge)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "0b29f7e6-d7a8-4ee1-bc10-62e4a3ae2209", - "metadata": {}, - "outputs": [], - "source": [ - "%%capture\n", - "if zonal_mean_flag:\n", - " pass\n", - "else:\n", - " plt.ioff()\n", - " \n", - " fig, ax = plt.subplots(figsize=(16,9))\n", - " im = ax.imshow(cfed,\n", - " extent=extent,\n", - " interpolation='nearest',\n", - " origin=origin,\n", - " vmin=0, vmax=vmax,\n", - " cmap=color_linear,\n", - " aspect='auto')\n", - "\n", - " if vname=='Ze-Doppler' or vname=='Ze-terminal':\n", - " ax.set_title(\"2d-PDF: \"+vname, fontsize=32, pad=16)\n", - " else:\n", - " ax.set_title(\"CFED: \"+vname, fontsize=32, pad=16)\n", - "\n", - " if vname=='radar reflectivity' or vname=='Ze-Doppler' or vname=='Ze-terminal':\n", - " ax.set_xlabel(\"reflectivity (dB Ze)\",fontsize=22)\n", - " else:\n", - " ax.set_xlabel(\"velocity (m/s)\",fontsize=22)\n", - "\n", - " if vname=='Ze-Doppler' or vname=='Ze-terminal':\n", - " ax.set_ylabel(\"velocity (m/s)\",fontsize=22)\n", - " else:\n", - " ax.set_ylabel(\"Temperature (degC)\",fontsize=22)\n", - " \n", - " ax.xaxis.set_major_locator(MultipleLocator(xtics))\n", - " ax.yaxis.set_major_locator(MultipleLocator(ytics))\n", - " ax.tick_params(axis='both', which='major', labelsize=18)\n", - " \n", - " cbar = fig.colorbar(im, ax=ax,\n", - " orientation='vertical',\n", - " pad=0.02,\n", - " fraction=0.045,\n", - " shrink=1.0)\n", - " cbar.set_label(\"\", fontsize=13)\n", - " cbar.ax.tick_params(labelsize=16)\n", - " \n", - " \n", - " fig.tight_layout()" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "d13229d3-98c2-4419-b993-2f1b09654904", - "metadata": {}, - "outputs": [], - "source": [ - "%%capture\n", - "if not zonal_mean_flag:\n", - " pass\n", - "else:\n", - " plt.ioff()\n", - " \n", - " fig, ax = plt.subplots(figsize=(16,9))\n", - " im = ax.imshow(zmn,\n", - " extent=extent,\n", - " interpolation='nearest',\n", - " origin=origin,\n", - " vmin=-4.0, vmax=2.0,\n", - " cmap=zmn_color,\n", - " aspect='auto')\n", - "\n", - " ax.set_title(\"zonal mean: \"+vname, fontsize=32, pad=16)\n", - "\n", - " ax.set_xlabel(\"latitude\",fontsize=22)\n", - " ax.set_ylabel(\"height (km)\",fontsize=22)\n", - " \n", - " ax.xaxis.set_major_locator(MultipleLocator(xtics))\n", - " ax.yaxis.set_major_locator(MultipleLocator(ytics))\n", - " ax.tick_params(axis='both', which='major', labelsize=18)\n", - " \n", - " cbar = fig.colorbar(im, ax=ax,\n", - " orientation='vertical',\n", - " pad=0.02,\n", - " fraction=0.045,\n", - " shrink=1.0)\n", - " cbar.set_label(\"\", fontsize=13)\n", - " cbar.ax.tick_params(labelsize=16)\n", - " \n", - " \n", - " fig.tight_layout()" - ] - }, - { - "cell_type": "markdown", - "id": "7289897a-0a71-4d38-9147-403391c657ad", - "metadata": {}, - "source": [ - "### results" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "11581c37-1a75-41ce-9f19-fe27c7436016", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABi4AAAN5CAYAAACfb8OmAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAArx5JREFUeJzs3Qd4bFW5MOA1k9MrVXrvggoIVpCqFBGUJsULqFgRRRQvWIALKihcUVRUsCACUlQQwYZIV0BAOtKkHHo/vSQz+3/W9iZ/knOSM0lWTlYm78uzyGTOzJo1u81kf/tbX6UoiiIAAAAAAABkoDrUAwAAAAAAAGgncAEAAAAAAGRD4AIAAAAAAMiGwAUAAAAAAJANgQsAAAAAACAbAhcAAAAAAEA2BC4AAAAAAIBsCFwAAAAAAADZELgAAAAAAACyIXABAAwrlUqlSwPI0dlnn93lWHXIIYcM9ZBYAkb6er/mmmu6vP9tt912qIcEAAxTo4Z6AAAAMJLFE33bbbfdYh83evToMHbs2DBlypSwwgorhNVWWy1stNFGYdNNNw3veMc7wsorr7xExgsAADDYBC4AAGAYaG1tLdusWbPC008/Hf75z3+Gyy67rOPfN9tss3DAAQeEQw89NCy11FJDOlaARn37298Or776asfvRxxxhGMYACBwAQAAzSAGMmI74YQTwlFHHRW+8IUvlBkaALkHLh5//PGO3+P0WoKvAICMCwAAyMxXv/rVsOyyy3a5r16vl1clx/biiy+G2267Ldx7772hVqt1edzMmTPDscceGy6++OJwySWXhHXWWWcJjx4AAGBgBC4AACAzBx54YFhzzTUX+7g4bdSVV14ZTjvttHD99dd3+be77747vO1tbwvXXntt2HDDDQdxtAD/EYtxF0VhcQAAA1YdeBcAAMBQmDRpUnjf+94XrrvuujJA0b1A9/PPPx923nnnLvPHAwAA5E7gAgAAmsA73vGOssbFFlts0eX+OHf84YcfPmTjAgAA6CuBCwAAaBKvec1rwm9+85uF6mOcd955ZU0MAACA4UCNCwAYQnF++r/97W/hqaeeCi+88EJoaWkpTzyuscYa4S1veUsYM2bMoLzus88+W77uo48+GubPnx+WWWaZcj79rbfeOkycOHHA/cf3c//994d///vfYfr06aG1tTUstdRS5cnUzTbbLKy//vphuItzeN9xxx1li9PxxN/jND1vfetbw3rrrbfY58dlcvPNN4d77rknvPzyy+VyX2WVVcJ222230EnngXjllVfC3//+9/Dcc8+V29ioUaPC8ssvX45xyy23LLe5gYrTEN13333hoYceKt/LnDlzwuTJk8PSSy8dNthgg7D55puXrzsYYmHqf/zjH+Guu+4qC1aPGzeufH9vetObytceiVZbbbXw/e9/P+y3334d98XtM9bBOPfcc/vcX3xuzOR44IEHym1o9uzZYbnlliuPVXF7jz8H6/h4ww03lNvVjBkzyu1p1VVXLY9T8XZqbW1t4ZZbbin3yZdeeimMHz++3KdjBsvaa68dhlI8Tt90001h2rRp5TpYsGBBuZ3H5bHVVluFCRMmJH/NuN5jnZS4bz3zzDPlGOJyf/e7391Q/ZXhdBx/8MEHy+Uat7P4ebjiiiuW9WEGa9tuVDyuxu0xji1+lsaxxfUej92rr7568teL+1r7sTQey+NxO67z+Jn9+te/vvwcBwBYYgoAGOEOPvjgWEUySfvZz37W0Gv+5S9/KXbcccdizJgxPfY1adKkYu+99y7uuuuuPr2f4447rks/8fd2t9xyS7HTTjsVlUplka8Zx/PBD36wePLJJ/v0mvPnzy9++9vfFoccckixxhprLHY5veY1rym+8IUvFM8880zRV937GizbbLNNl9e5+uqry/trtVpxxhln9Po+3/GOdxS33377IvudPn168cUvfrFYZpllFvnclpaWYv/99y+eeuqpfo+9ra2t3Bbf8pa3lP31NM44ho9//OPF008/3efX+Pvf/14ceeSRxRve8IYet6f2NnHixPI9/fOf/0y2vufNm1d89atfLbelnl53/fXXL375y18WuYvbVvexP/roowPqM24D3bfRcePGFbNmzWq4j7hdfPKTn+x1Gcd1/8Y3vrE4++yzy32jUfH9de4njrXdE088URx00EE9Hh9Hjx5d7LbbbsW9997bp2XSfXm0L+PZs2cXxx57bLHsssv2+D632GKL4ne/+12fXi/ug537iJ81fXXttdeW73XChAk9jm3s2LHlY2699dYky2Pu3LnFSSedVKy66qoD+pzryXrrrZesvze/+c1d+jr11FMbet4jjzxSHHrooYvdtrfccsvi4osvXqLr/ZVXXimOOeaYYvXVV+/1uPra1762OO2008rP34GI+9unPvWpYrXVVuv19arVark8vvGNbxTPPfdcw8ez+Fm6KI18V+iptW8zcd9daqmlFvlZ3VfxM6X7MeCPf/xjv/oCANIQuABgxFuSgYtXX321PMHUlz7jyYLDDjusaG1tHVDg4uSTT+71JHbnttxyyxX/+Mc/Gt42VlhhhX4tr3hCu68nhbr3sSQDF3H97bDDDg29t3gy8de//nWXPu++++5i7bXXbuj5K664YnH//ff3edxxvcUTWn1ZD/Gk6E9/+tOGX+P9739/v/eReEKuLye4F7W+//3vfxebbLJJw68ZT1DGE/kDOSYMt8BFFE8+d+/3sssua+i5p59+eq8nyxfVXv/61xcPPvjggAIXf/jDH4rJkyc39HoxsPGtb31rQCfq4wnsDTbYoOH3eMABBzR8onggJ7Cff/75Ytddd+3T8o8n2uNnRaPb+qKWx0MPPVRsuOGGvb7OQAMXX/va1xo6sb049913X5d+Ro0a1esJ9Sh+jn7+858vg199WbZbb7118cILLwz6er/ooot6DGr31NZcc83ipptuavg1Oi+Lo446qtcLKHpq2267bRaBi+iII47o8m/x86k/zjnnnC79rLPOOkW9Xu9XXwBAGmpcAMASEqfaiFOcXH755Yv890mTJpVTk3RXr9fLaV/22GOPMHfu3H699gknnBCOPvroclqddnEKiDjtxKKmCorTROy8887l9EKNThW0KO2vMWXKlFCpVBb69zjlzD777BPOOeeckLs4Tcpuu+0Wrrrqqi73xymRFjVNS3z8gQceWE5DEsWpSOI0UHH6rHZxmcSpNxY1JViczmuXXXYpp11q1KWXXhq22WabcnqR7uJrTZ06dZFTgcXX+NCHPhROPvnkAa3v+BpxXcepRXqaguqkk04KH/nIR0J/Pfnkk+V7jNOndF8PPU1z9uMf/zgcd9xxYaSJ21t3cdqwxfn85z8fPv3pTy9y2xs9enSP08XEKWbe/va3l1N39ceNN94Y3vve94aZM2d2uT++3qKmGovTJR155JENb7fdxel3dtxxx3IKrEaOxdH5558f9t577/K1B0scT5wq8Pe///0i/z1u54taBzHOFz8r4jKM0171Z4q/uM3861//6nJ/XBZx/0rloIMOCtXq//8z9LrrrutyXGzUz372sy6/xymsepvaKW5X73nPe8Kpp55aTtXX3dixY3v8TLz++uvLadHi8WewnH766eH9739/OUVTd3FM8bi6qM/Rxx57LGy//fY9bi89TSG40047hVNOOaXHbTkey3ta7/+JKefhk5/8ZJflEmv8xOkb++qHP/xhl98/9rGPLXJ5AwBLUKIACAAMW3/961+LH/zgB31uH/jABxa6CjBesbco8QrYrbbaaqHHxytb43NefvnljsfGKYK++93vllfcd3/8Rz7ykT5nXMTpgtqn8ll66aXL6XXilartVxLGsV133XXFu971roVeL77HRsTsgpjN8fa3v728yjsu0+5Xp8ZpGOJUVfGK+6lTp3Z5nXhl97/+9a+GXqv7GJdUxsWb3vSmjttxuoxf/epX5bRP7R577LHiS1/60kJX8sZlEt97exZEXBf77bdfeVVq5yu349RSe+2110LvL04r1Ygbb7yxvOK483Pj+j766KOLm2++uViwYEHHY1988cXi/PPPL6d56n7F9u9///vFvlacbiw+fqONNiqvXo5T6MSrtTtfnRqzKmLGyHe+852FpoaJ7Re/+EVD76v789761rd23I7TrcUMghkzZnQ8Pk4/Fq/C776NxWXTaAZLs2RcxO0r7pud+41X8ffmRz/60UJjiVNMxe2w83EjTid0xRVXlOug++NXXnnlchvrS8ZFnLInXjne/vv2229fXH755eXrtG9P99xzT3mF+KKulm9kSpfuV3h3nmYoXl0dr+LuPO54LI6ZJ4uaTijuV4Nx5X18/e5T9sRtNx6L//znP3fZ1uOyufLKK4s99thjofH993//d5+Xx8Ybb9xxOx4bzj333C7H8fja8bgXp4kbqJ133rnLa3/lK1/p0/Pj51b3z8hLL720x8fH7fbd7373QsspHufjdHKdp8uL21qcduszn/nMQvtPPJ4vLqOlP+s9br/dp9yLn6kxg+a2227reM14HI/Hi3333XeRGYyNZDzFvuL+1f358ZgZP8Ni9kbnz6Z4O34+fe973yu22267Mgu0tyyZRjMu4vbV/n2qe5ZJ/J7S2/ev7t8X2j+T2tvXv/71oi/uvPPOLs+P673RDBsAYPAIXABAP8QTaN3nVY51DeIJ6kanbIlTjvT0+CgGM972trf1eaqX7oGLzifbn3322V5P7MQaFZ2fE6eQiFOWLE4MRvTlRGscR+dAQKMnd6KhCly0t3iivrfpI2JAoPtzdt99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1tcg8HDKumikSHfczuL0ZO1iwGPTTTcd9PEBAI0TuACAHsTpR7oHKGJh4DjtAP/fkUceGW677bYuiyRODROvoo3Ta8X5o+OVnnHqkxhw6VzwOBYRZWB6KrY8UD0FFWKAKk6/0f2EZ5zy5ec//3m45ZZbyimkYjZFPNHYLEWuh6M4pU737cOJuTwt6f04J/HY0f0Ys6jMqMsvv7xL1kDM7tl+++2HZLmSr5hd0bngePye0T2AG/3oRz/q8nuKTBwAIC1TRQHAIsTClvGP37a2ti6FXLtPGbU4Sy+99EIZBbNmzerzHMrd56mPU7L098rMlB5++OGFro793Oc+V04j1EhB8LgsGHhB0s51VH7/+9/3u0B3IydBv/KVr3S5L2bbxDn/G5lmxvpesv76178udF9PdXm6H6v6Wwuk+7Eqbp+NSPV63d9H6tccyOv1pvty+sIXvhC+8Y1vhJEgFjyPU5i11414+umnw5///OeFjmPdp4k65JBDFjvVUffl+qY3vamse5GLJbnfdT9G51xTaiDGjBlTXnTyta99rUsti9NOO63HYEZcXvvuu+8SHysA0DsZFwCwiJPx7373u8sMgXZvf/vbwy9/+ctF1i7ozaJO5j722GMDLpwcT3bkMGVOnDu68xW92267bTj11FMbClpEL7744iCObmToXhcg1Zz7ixIza+Ic8Z2nGrn44osbnhvf+l5y4hXr3a8oHj9+fNhuu+0W+fju67A/x6n4mp23j74ELuLUO/3ZPrqPsy91Gh5//PEl+nq57Me5iZ+r//Vf/9VrkCLWquhchD1+/sXAxXBfrin2u0V9R1jUftd9WcTn5Dw940DEWhWdv6/FbMDO00J1nz4qbkux0DsAkBeBCwDodnJkp5126jIdxWtf+9rwu9/9rjzp15/5u7sXw7311lv73E/357z+9a/PYr3dddddXX7/wAc+0OfMFgam+9Q/cXqgJbW+d9tttz5dcW59Lzmx6Gz3IEK8orin49jrXve6AR+n7r///oXm/u/Lser222/v82t2397f8IY3DOrrdX9OX14vl/04R91rVVx22WVd6j+ce+65XTIgt9lmm4YKWXdfrjEw0D07YSil2O9ilsaDDz642P3ujW9840LPu+eee0IzWnXVVcss2XZxW4qZge3f8+JFF52DYIpyA0CeBC4AoNM0Nrvuumv497//3eWP3z/+8Y8Dmg7krW99a5ffL7nkkj49P2Y0xFoRjUz3sqQ9//zzC9W2aFS80jNOa8TAvPOd7+zye7wqebDmtR/I+o5iAJDBN23atHD44Yd3uS+enDviiCN6fE73Y8rf/va3hdb34vz617/u8ns8fvZlG/ntb3/bp9e76aabukyT1l5gd7Beb968eeFPf/pTv1+vL/txrA0Up0waKTbccMMun5WxsHznQtzdMzC618Xoydprr122zllBnTM3hlr3/S4GG/saUIvfKTof80ePHh223HLLhR4X98d11lmny30xIJSD7lmai6pxkqpI949//OOy/lLn6Q7XW2+9Ab8eAJCewAUAhFD+EbvXXnt1OWEQp8GJJzj6enK2uzjtVGexz0ceeaTh58eCpN2ngeje51DOJd3fObPjFEP9nRaD/y/OAz9hwoQuV713vpo0l/UdT6a3X/HK4InBhj333HOhKXHiVCi9FeaOV7BPnDix4/d4dXv36VR6EzMt4gnBgRyn4nR8na+yX5zuNYfiye9111234effd9994dprr2348eedd16XbT5ORZOqnkz8nIn1FzoHdkdKjYuesi7agxUxU+vee+/tuD/WiIqf143ae++9u/wel2suRcs33njjsMYaa3S577vf/W7Dz4/v43vf+16X+2LB8p6mPepexyHus30NUA6G7nW/UmTFxGnxYsZsu1tuuaXMaDnrrLO6PE5RbgDIl8AFACNe/MM/Xr0Zi4G2i3/0x6kqNtlkkwEvn/3337/LPNbxhGD8Q7mRuaXjVA6f+cxnutwXr6RMdZXvQMUrOLsHWRoRr5L+9Kc/PUijGlnidGSf/OQnu9wXt6/+zN/frqeTet3Xd7z6vPP0LT2JV88edNBBYcGCBWE4iCf5Y4ZC5zYcXH/99WHzzTdfaLqZeJX1t7/97V6fO2XKlHDwwQcvdIK3+xQ0PTn22GPDk08+2eW+vu7jMWjx3//93w09NgYcYiBhoCcgY2ZKvLp/cWL9jS9+8Ytd7tt9993DKqusElKJy7B7YOaKK67od3+5nJxv1Pvf//4uQdhYUydOZXT22Wf3+rjF+dznPtclKBezWY455piQg1hc/LDDDutyX6zH0GhALW4j3ff33va7+H2ic1Aj7nNxv2/kOD6YVlxxxS6/xwB8Ct2Xbayl0vmzceWVVy73YwAgTwIXAIx48URZ5+kS4omEOEXF1ltvnWTZxDnlP//5z3e578orrwyHHnpol+kKuotX9sYrlrtnW3Q/uTWUYjHuzuKJxMVNwxGn4orPy+Eqz2bahuMJmHZxDu+4/cYT2X0Rr0CPJ3+PPvroHq/K73wSP67LxW2Psch9vDr6mmuu6dNYaExcvnGqmLhPveMd7whPPfVUl3+PNXbiPhkDE42c4O18QjgWs33Xu9612Ayx//3f/y1bZ3Gdd77auVHxauivf/3rvT4m1n+IWSWdT8zHoFr3K/Ybcffdd4d99tmnS+He7mL2ys4779zlmBWzLboHMgYqHu/j8u4c8IvZAj/84Q/71E+s0fS1r32tHPNwErfR7pkUMesnZuL0Z5qodq95zWsWWlcxKBePdb2t90VNFRaDCjE42J9C8j35yEc+0uXEfdyu3/e+9y22JlDMYPvsZz+70IUNvWUBrbDCCuGoo47qcl+cDjOevG802+mhhx7q8za5OJtttlmX388888xevx81KgbMOx/7/vWvf3X59/g9rPs0VQBAPnxKAzCixelrTjnllC73vf3tby9P/PbnD/M4NcEGG2yw0P3xREG8cvaGG27oMg1GPDERTxLHE1ZxaqromWeeKU9EfvWrXy1vd/bRj360LIici/e85z3lCfP2udhjFkk8ARKv+Pzwhz8cNtpoo/JEd7z/zjvvDBdccEE5DUb7yaJ4IrwvU7XQc9ZF3Gbi8own19q37fh7LDYfT97E7TpOR9MeeIjrJD4mFtz++9//Xs73HwMXi7pKtfNJr/e+971d6rScdNJJ5TQuMTgXM4Hi/OpRvKo19vnNb36z42S69d24GATsnKnVvs7iFCoxqBlPnMap7eKJ957mg48nWGPdiTXXXLOh14y1AE477bTwsY99rOO+uB5jod+4fg888MByLvi4DcXtLAaj4uM7Z6tF8Zjwox/9qM8nl2PQJE4f96UvfSlcddVV5WvGaW/Gjh1bnsyNV2HHq++/853vLJS9E1+v+3Qzi/PmN7853HzzzWXtlVgk+ctf/nJ5/FpmmWXKf4/H31/96lflsbh7oPXII48MW2yxRUgtnqSP43r44YfL3+NyjifY45X1cb3EAFU8rsbASedARdwOYoZCzHq78cYby20iTkM03MTg0y9+8YsugYvOAar4+dq9blQjYoZF3F8612GJn/GxflRcrjHIE0+edy5eH+texWNizNCI2WWxxUBhavGzP27XMeDQ/l5jECHWv4jH4pgBFvfBeFFFPJkfj9dxucTP085iVkk8biwuQ+y4444rt5G//vWvHffF4Gbc/2NdiLgPxGnl2o/l8TXjMT7WvYnLL+73MTCesqB1fM34WdLuuuuuKwOf8ftOnEqr+9RXPX3X6m7SpEnl51/36bSiuA/FoBEAkLECAEawRx99NJ4lSNZ+9rOf9fhaTz/9dLHJJpv0+NzJkycX48eP7/Hfd9lll2LOnDmLfU/HHXdcl+fF3weyTNZYY41eH3/RRRf1OOaxY8cWyy67bFGtVhf6tx133LH485//3OW+bbbZZrHj697PYIlj6fw6V199dZ+eP5Bxxtfq63KJ/vSnPxVLL710j+ujpaWlWGaZZcptrVKp9Pi4ww47rMfXeOihh4qlllpqkc8bNWpUub7HjBmz0L+tssoqxbRp0/q8XAa6vg8++OCG99GenjPYX5m7r++BtilTphQnnXRSsWDBgn6N53Of+1yPfY8ePbrXbWy55ZYrbrnlln4dZ2688cbymNG9z/h68XV7es0TTzyxofcVX6Pz8/7xj38Ua6211iKPxRMmTOjx9Xbddddi/vz5i329uK11fl7crhrxyCOPFK973et6fP24706dOrXcD+M+3dPjNt544z4tj7hOhlq9Xl/kOmlvJ598cr/7nj17drHPPvv0uu9MnDixPIb1tr3F9sILLyRf79/5znd6PC7H9Rz3g57+PW6vV1xxRcPL4uWXXy623XbbXt9j3MbisWRR/9bbZ1J/P7922GGHho9xjRzH291///2LXG577LFHw30AAEPDVFEAsITEKVtixkVPGRMzZ85c5LQV8SrLWMMg1tzofDVoLuI0K3H+/M5XALeLc8fHaVa61/PYY489ygLS7Vd0kkacZiZedR2nDFqUeBX2yy+/XG5rPc1/H69sjUWOexKLH8dMiu7ZAFGcJz2u7+5Xw8f+4lW63WtkkNYb3/jG8K1vfavMpImZXP3dv0499dRw+umnL7KOQLz6uqcpZeJV4fGq7DhdTX/EK8zjttU9cyK+3qKmjYnvL2b0xEyJ/mYqxcyO7ldux/0jFhtflFhfIV6l371QfUrxyvebbrqpzFpb1HE17rvtmTc9ZdvEq+7f8IY3hOEmjjtmGCxKXBbx6vn+itvzRRddVO4jPU2dFjMq4jGst2mK4vGsp+LXAxEzFeP0T+0ZP53F9Rz3g0Udt2NGVcye2HXXXRt+raWXXrrMlIqv2dNUSXEbi3W2FiV+L0ktTtHZ02fXQMT1tcMOOyx0v6LcAJA/gQsAWIKmTp1aTkvyl7/8pfxDurcTi3GKgzi/eZzPPU4TkvM8zLHgZ6ynEKd16U2cfiJOhRKDFp2LpZLOWmutVU6/FQMFcVqnRmobxJNYcU71WF8gFk6P04X0Jp5cittlPMHY2zYcpwyKc+3Hx8aABwMTjwFxv4nLNe5LcXqVWN8knuyM07XFIr1xzvtG1nkjRavjXPYxaBqncertRHOckipOfRfXc5xKaiDi1GaxIHM8Qd1TcCBuc3F6vTj1T/f5+vuzv8R+vvKVrywyGNc5KBSPW3F6njh11WCLJ9l//OMfhwceeKCckqeRIuBxXHEqqTjlTqw/0714+XARi0Uv6sR4nM4pXgAwUHEfiVOgnXjiiQ1Np9UeBIpTl8WAUpyyLH4+D9aFALGmTAw8rr766r0+Nk4ZFoMwcRuJ04v1VdyP4rRr8f3EINnyyy/f6+Nj4CgGF+NzYvAutXicufrqq8uASpy+KwZA45hSBIm613tZZ511utSTAQDyVIlpF0M9CAAYqeIc2nGu6VgDIM5THk8MxD/e45zOcR7vwbyqd7DEeeFjZkl8T/H9xRNw8QRMPAkR3xdLVrxSN55QjnPmxyuJ41Xa8QRnvKo9ZkDEq1Hjydv+XkEbr06P23A82Rb7jifDYqHZePV9PNm3uPnWyV/8cyGe3I8nSONxKmYjxJP8seZJrGsSf/ZVrGURt7t28dgQ71vUtvXggw+Wt2MtgLjNxvn1F3VV+uLEK9PjCet2jz76aJf6HzFj6JZbbinrRcR9JZ4wjUGieOyKJzqHWgwkxZo0cWyxxX027sfxMyNmjay//vpLJKjSbGL9klhvKv6MtWNitkUMTMRtLAbiYoAgRTCwP2KNjbg9xv0uZj/EIHNc37G+SurP07ifx1pU7ft5PJ7HLM/4mnHbinVg4sUXw1E8TsV6Nu1iptZAg54AwOATuAAAAJaoRgIXqS0ucAE0n1hcPRZebxeDe08++WQ5VRwAkDdTRQEAAABN57vf/W6X3/fdd19BCwAYJgQuAAAAgKYSp0j8xS9+0eW+WJAcABgeBC4AAACAphFrbMVC77FmSbsdd9yxrA8CAAwPo4Z6AAAAAAD99cMf/rD8uWDBgrJ+zfnnn18WXG8Xi9l//etft4ABYBgRuAAAAACGrU984hO9/vtnP/vZsOWWWy6x8QAAA2eqKAAAAKAp7bfffuHkk08e6mEAAH0k4wIAAABoCqNGjQrLL798eNOb3hQ+9KEPhd13332ohwQA9EOlKIqiP08EAAAAAABIzVRRAAAAAABANgQuAAAAAACAbAhcAAAAAAAA2RC4AAAAAAAAsjGsAxdz5swJf/jDH8JXv/rVsOeee4Y11lgjVCqVsh1//PH96vPjH/94Rx9rrrlm8jEDAAAAAMBQaW1tDVdddVU46qijwpZbbhmWWmqpMHr06LDiiiuG3XffPVxxxRVDvnJGhWHslltuCbvuumuy/q6++upw5plnJusPAAAAAABycu2114Z3vvOd5e0YrNhqq63CxIkTw3333Rd+97vfle2jH/1o+OEPf1he4D8UhnXGRbT00kuHHXbYoYwO/fKXvywXdH+zNz7ykY+EUaNGhS222CL5OAEAAAAAYKhVq9Ww1157heuuuy4888wz4fLLLw8XXnhhuPvuu8MFF1wQWlpaygv8f/GLXwzZGId1xsXWW28dXn755S73HX300f3q60tf+lJ45JFHyp9PPvlkuPXWWxONEgAAAAAA8rD99tuXbVHe//73hyuvvDL85Cc/Ceecc0446KCDwlAY1hkXMfKTwk033RROP/30sP7664cvf/nLSfoEAAAAAIDhZrPNNit/Tps2bcjGMKwDFynMnz8/fOhDHwpFUZTpL+PGjRvqIQEAAAAAwJB46KGHyp8rrbTS0AxguE8VlcIJJ5wQ7r///nDooYeGbbbZpt/Bj9ja1ev1cgqrZZdddsiKlwAAAAAANKt4IfrMmTPDyiuvXNZsWFLmzZsXFixYEHJcHpVu56LHjh1btr549tlnw9lnn13ejnUwhsqIDlz885//DN/85jfDCiusEE455ZR+93PSSSeF//mf/0k6NgAAAAAAehenM1p11VWXWNBimfFLhbnh/1/EnotJkyaFWbNmdbnvuOOOC8cff3zDfbS1tYUPfOADYfr06eF1r3td+NjHPhaGyogNXMSVEKeIij9jfYulllqq330dc8wx4cgjj+z4Pa7Y1VdfvdxppkyZkmjEQE4eueO6ZH1VW0aHHOU6rlxVqmnqLrUr6rUsx5ayr5aE21it1prlsh8pUi6z6qgxodlVKnnO1loU9TASllnbgjkhR7luFy2j002lW2udF1JaMOfVZH2NGjsxWV9FPd2+VEl49WjK99g6d2ayvsZMmJqsr1Gjx4eU2lrnJuurdV66ZVZP+L0nV+ts+o6hHgIwDMyYMSOsttpqYfLkyUvsNWOmRQxa7F/ZPozJ6NT6gtAWfjnrrwudj+5rtsXHP/7xcNVVV5UzCf3qV78KY8YM3d9n+SzdJezkk08Od9xxR9htt93CvvvuO6C+ekq5iRuJwAU0p8mTJjZ9gKDa0vwnD1MSuOg7gYvmIXDRHCeoR07gIs+pXCuVtAHwPAMXaf/8nF9Nd/J29IgIXExK1ldrS7r3OGZCunGNGpM4cLEg3X7ZOirdMhsJgQvnUoC+GIqp+sdVx4QxlXzO51SLagi1gZ2P/sxnPhN+8pOfhKWXXjpceeWVYf311w9DKc+/mgbZfffdF0488cQyfeaMM84Y6uEAAAAAAMCQ+NznPtcxK9Gf//znsNlmmw35mhiRGReHHXZYmdYT61LECFL3ub/i9FHtBU3a/y1mVIwenU8UDQAAAACAJS8WA69mlEld/b+Mi/74whe+EL71rW+FqVOnlkGLLbbYIuQgn6W7BD366KMdtSniHGjd23nnnVf++xNPPNFx3/e///0hHjUAAAAAAKRx9NFHh1NOOaUMWsTpobbccsuQixGZcQEAAAAAAE2TcdFHX/7yl8M3vvGNjumhcgpajNjAxWOPPdbrvx9yyCHh5z//eVhjjTUW+1gAAAAAABguLrvssvC1r32tvL3uuuv2ONvQcsstF0499dQwFIZ94OKVV14Jtdr/n8CrXq+XP+fMmRNefPHFjvvHjRtXFuMGAAAAAID+qlSroZJRxkWljxkXL7/8csftW2+9tWyLEi/sH6rART5Lt59ihfPll1++o02bNq28P87N1fn+T33qU0M9VAAAAAAAGFKHHHJIKIpisW0oZyMa9hkXAAAAAACwJDMuqsM442I4GPaBi8GI+px99tllAwAAAAAAlqxhH7gAAAAAAIAlpZpZxkW1CTMumu8dAQAAAAAAw5aMCwAAAAAAaFC1WgnVSiWb5VUt8hlLKjIuAAAAAACAbMi4AAAAAACABqlxMfhkXAAAAAAAANmQcQEAAAAAAA2K9S1i1kUuqnU1LgAAAAAAAAaNjAsAAAAAAOhLjYucMi5CPmNJpfneEQAAAAAAMGzJuAAAAAAAgAbJuBh8Mi4AAAAAAIBsyLgAAAAAAIAGybgYfAIXAAAAAADQIIGLwSdwAWTr4duvTtZXvV4LKY0eOzFZX0XisaVSFOnGVam0hKZ/jyHP95havW1Bltt+vZZuXCNFrseekaBSbRkR6zHp+wzp3metdV6mn2+tyXqqjhqdrK96rTXLZZ/+2J/uu12u+1Glkm6m6NHjpyTrq2XUmGy/c44eOylZX6PGjM/y2N+WcL8cMy7ddgEAAhcAAAAAANCgSrVaZl3kotKEpayb7x0BAAAAAADDlowLAAAAAABokBoXg0/GBQAAAAAAkA0ZFwAAAAAA0KBqpVq2XFQzGksqzfeOAAAAAACAYUvGBQAAAAAANEiNi8En4wIAAAAAAMiGjAsAAAAAAGhQtVIpsy5yUS0qodnks3QBAAAAAIART8YFAAAAAAAM1xoXRT5jSaX53hEAAAAAADBsybgAAAAAAIAGybgYfDIuAAAAAACAbMi4AAAAAACABsm4GHwyLgAAAAAAgGzIuAAAAAAAgAbJuBh8Mi4AAAAAAIBsyLgAAAAAAIAGVarVMusiF5Uin7Gk0nzvCAAAAAAAGLZkXAAAAAAAQIPUuBh8Mi4AAAAAAIBsyLgAAAAAAIAGybgYfDIuAAAAAACAbMi4AJJ6+Pars1yiRb2WbX9FvR5ylHJclWq65VWptqTrq9KS7zZWJOwv4SZWa52XrK9KtZrp9prnuFJLuY2l3JfqYUHIUcpjT8p9sl7Lc3lFlSLhMkuonvR4na6vasJtrKhXs9wnk362hRDGjJuarK/R46Yk66so8jz2jx47KcvPyrb5s5v+MyT1d8Wkn0kM6d+7626+XdP/LZ7r8oKBknEx+GRcAAAAAAAA2ZBxAQAAAAAADapWKmXWRS6q9UpoNvksXQAAAAAAYMSTcQEAAAAAAMO1xkU1n7Gk0nzvCAAAAAAAGLZkXAAAAAAAQINkXAw+gQsAAAAAAGiQwMXgM1UUAAAAAACQDRkXAAAAAADQIBkXg0/GBQAAAAAAkA0ZFwAAAAAA0KBKtVpmXeQ0nmbTfO8IAAAAAAAYtmRcAAAAAABAgyrVStlyUcloLKnIuAAAAAAAALIh4wIAAAAAAPpQUyKnuhKVjMaSSvO9IwAAAAAAYNiScQEAAAAAAA1S42LwybgAAAAAAACyIeMCAAAAAAAaVK1Uy5aLakZjSaX53hEAAAAAADBsybgAAAAAAIAGVSqVss5FTuNpNjIuAAAAAACAbMi4AAAAAACABsVsi0o1n5yASkbZH6nks3QBAAAAAIART8YFAAAAAAD0KeMinyyHSkZjSUXggqb08O1XJ+tr3c23C80u5fKavNxayfqa/cqTIVdFvZ6ur6IWclSptIRml+uyj4p6Lcv8ylptQcLOQp5yHVfG21jLqDHJ+gr1PPfxSsLjfgitI+I4lnKZpXyf9ZTHsYSq1fFZfk+p19JtrwvmzggptYwel6yvMWGpZH3RN5Vq83/njGoJ96WWTL8PtM6flayvJ/51R7K+WlpGJ+trwtSVQkqP3XNL0v4AmonABQAAAAAANKharZYtF9WMxpJK870jAAAAAABg2JJxAQAAAAAADVLjYvDJuAAAAAAAALIh4wIAAAAAABpUqVTLlotKRmNJpfneEQAAAAAAMGzJuAAAAAAAgAapcTH4ZFwAAAAAAADZkHEBAAAAAAANqlarZctFNaOxpNJ87wgAAAAAABi2ZFwAAAAAAECD1LgYfDIuAAAAAACAbMi4AAAAAACABlWq1bLlopLRWFIRuAAAAAAAgAZVKpVyuqicxtNsmi8UAwAAAAAADFsyLgAAAAAAoEGVSjVUK9WsxtNsmu8dAQAAAAAAw5aMCwAAAAAAaFCsb5FVjYtqPmNJRcYFAAAAAACQDRkXAAAAAADQp4yLfHICKjIuAAAAAAAABk8+YaF+mDNnTvjDH/4QvvrVr4Y999wzrLHGGqFSqZTt+OOP7/W5Tz31VDjjjDPCPvvsE9Zdd90wfvz4sq211lph//33D3/961+X2PsAAAAAAGB41bjIqTWbYT1V1C233BJ23XXXPj9v2rRpZZCjKIqO+yZMmFD+/thjj5XtggsuCB/60IfCmWeeGVpaWhKPHAAAAAAAaLqMi2jppZcOO+ywQzjqqKPCL3/5y7Diiisu9jm1Wq0MUsTn/fznPy+zL2bPnh1mzZoV7r333rDHHnuUj/vpT3+62MwNAAAAAABGjmq1ml1rNsM642LrrbcOL7/8cpf7jj766IaCHbfddlvYfPPNu9wfV/BrX/vacMkll5SZHH/84x/Dt7/97fClL30pjBs3Lvn4AQAAAACAJgpc9HcKp6lTpy4UtOgs1siI00TFwEXMwrj//vvDZpttNoCRsjgP3361hcSIVamkm46uKGpZ9hXqIUv1Wmu6vuoJl1di1Wq6baxeWxCaXcp9Mmcp9/GU23/KC4VGwrhyPVbkvI0VCfuqpDy+Zrq91toW5PndIoTQtmB2sr5qrfOy7Ks6anSyvuan3MZa0o2rKOoZfyeoZnnsCQmXf0o5r8ss12Piz5GRIOW5o3U33y5ZX4xMudWVqGQ0llSaL4ckkc4ZFnFqKQAAAAAAYPAN64yLwXTNNdeUP8eMGRPWX3/9oR4OAAAAAAAZqFSrZctFJaOxpCJwsQiPPvpo+OEPf1jefv/73x+mTJnS60KcP39+2drNmDEj9XoCAAAAAIARoflCMQM0d+7csM8++4Q5c+aE5ZZbLpx88smLfc5JJ51U1s1ob6utttoSGSsAAAAAAEtWrJGcW2s2AhedtLW1hQMOOCDcdtttYfTo0eG8884LK6+88mIX4jHHHBOmT5/e0aZNmzaY6wwAAAAAAJqWqaI6FeA+8MADw6WXXhpGjRoVzj///PCud72roYU4duzYsgEAAAAA0Nyq1WrZclHNaCypNN876mfQ4gMf+EC46KKLQktLSzj33HPD3nvvPdTDAgAAAACAEWfEZ1y0Z1pceOGFHUGLWJAbAAAAAAC6K+tKVPOpK1FpwhoXo0Z60CLWtOicabHffvsN9bAAAAAAAGDEGjXSMy1i0CLWtJBpAQAAAADA4lSq1bLlopLRWFIZ9oGLV155pQxCtKvX6+XPOXPmhBdffLHj/nHjxoVJkyZ1qWkRp4dqL8S9zz77DMHoAQAAAACAzoZ9KGazzTYLyy+/fEebNm1aef8pp5zS5f5PfepTHc+58cYbwwUXXNAx/9fhhx8eVlxxxR5bDHAAAAAAAECsb5FbazbDPuOiP9qzMqLW1tbw3HPP9fr4uXPnLoFRAQAAAAAAwz5w8dhjj/X5Odtuu20oimJQxgMAAAAAQPOqVqtly0W1H2N54IEHwp///Odw2223le3+++8vSyyceOKJ4ctf/nIYasM+cAEAAAAAADTuBz/4QfjOd74TcpVPWAgAAAAAADIX6ybn1vpqk002CZ///OfDeeedV2Zb/Nd//VfIiYwLAAAAAAAYQQ499NAuv+c09VUkcAEAAAAAAI2qVkIlpxP91b5nXOQuo6ULAAAAAACMdDIuAAAAAACgQZUy4yKfLIfK/41lxowZXe4fO3Zs2YYjGRcAAAAAANCgOE1Ubi1abbXVwtSpUzvaSSedFIYrGRcAAAAAADDMTZs2LUyZMqXj9+GabREJXAAAAAAAwDCfKmrKlCldAhfDmamiAAAAAACAbMi4AAAAAACAvmRctOSXcdFMBC7IwpTXrBty9dRD9ybrq2X0+GR9zZn+dLK+qi2jk/U166UnkvVVqy1I1ldLy5hkfTG0ino9WV/1ei3kqkg4tnRLLK16W2uyvooiz3VZqbSk6+v/iq3luC+lle54XU/4OZJyXCn375TbflFPt72mlnJd1mvpjj0p98p6SPkeQ5bba9uCuSFXC+bNCDlKeewvKgk3jIR/P6TcxirVfI9jKdUzXWa11rlZfk8cvdRKWW6vqf8Wn7TMGtl+70xl/pxXh3oIwBIkcAEAAAAAAMO8xkUzEbgAAAAAAIAR5Pbbbw+f/OQnO35/5JFHyp8/+tGPwuWXX95x/yWXXBJWWild9lqjBC4AAAAAAGAEZVzMmDEj3HzzzQvd/+STT5at3fz588NQELgAAAAAAIARZNtttw1FUYRcCVwAAAAAAEAfitjnVMi+ktFYUmm+dwQAAAAAAAxbMi4AAAAAAKBBlZZK2XJRyWgsqci4AAAAAAAAsiHjAgAAAAAAGlSpVsqWi0pGY0lFxgUAAAAAAJANGRcAAAAAANAgGReDT8YFAAAAAACQDRkXAAAAAADQoEq1WrZcVDIaSyrN944AAAAAAIBhS8YFAAAAAAD0pcZFSyWr8TQbGRcAAAAAAEA2ZFwAAAAAAEBfMi4yynKoZDSWVGRcAAAAAAAA2ZBxAQAAAAAADZJxMfhkXAAAAAAAANmQcQEAAAAAAA2qVPOqK1FpwvSEJnxLAAAAAADAcCXjAgAAAAAAGlRpqZYtF5WMxpJK870jAAAAAABg2JJxAYtRr9eSLaNqka6vBfNmJOtr1OjxodkVCZf9SNle08pzXEXC5VWvLQi5qhQtWS6zlPtlynGlVGlJt+zzPi6Obvp1ORK2/dTba66fvUnXZSXPfbyo18NIUBTp3mdrwu/WKeX6/WL0mElhJKiOSvf5llKlmu7YU2/LcxurVKtNv+xzluv7HD12YrK+Hr796mR9rbv5dsn6YviI9S3yqnFRCc0mz08CAAAAAABgRJJxAQAAAAAAjcos4yLkNJZEBC4AAAAAAKBBpooafKaKAgAAAAAAsiHjAgAAAAAAGlSpVkOlpZrVeJpN870jAAAAAABg2JJxAQAAAAAADVLjYvDJuAAAAAAAALIh4wIAAAAAABok42LwybgAAAAAAACyIeMCAAAAAAAaJONi8Mm4AAAAAAAAsiHjAgAAAAAAGlRpqZQtF5WMxpKKjAsAAAAAACAbMi4AAAAAAKBBlWq1bLmoZDSWVJrvHQEAAAAAAMOWjAsAAAAAAGhQpVopWy4qGY0lFRkXAAAAAABANmRcAAAAAABAg2RcDD4ZFwAAAAAAQDZkXAAAAAAAQF8yLlryqStRUeMCAAAAAABg8Mi4AAAAAACABqlxMfjUuAAAAAAAALIh4wIAAAAAAPqUcZFPTkClCWtcCFwMosfvuzVMnjRpwP1MWGqlkMqM5x9O1tfsV59O1tf4KSuElIp6LVlfLaPGJOtrwZyWZH1VKun6WjB3RrK+qqNGhxzVWtNtE1Glmue6pG+KIu12kauUx8R6rTVZX20L5mY5rqT7d9uCZH1VE44rZ6PGTEzWV70t5XaRbj8q6vWQo1p9XtL+6rUFWe6Xba3p3ufohOOqt+a5vOoJj2Mpj9WppXyfKZd/ys/wlEbKd6iUf0Pk+p0/7WdlPifwBmv/riU+jqXcx2utKb9bJ/wO25LunEq1ZXSW3zmBwSFwAQAAAAAADVLjYvDlGQ4HAAAAAABGJBkXAAAAAADQoEpLpWy5qGQ0llRkXAAAAAAAANmQcQEAAAAAAA1S42LwybgAAAAAAACyIeMCAAAAAAAaJONi8Mm4AAAAAAAAsiHjAgAAAAAAGlWp/KflopLRWBIRuAAAAAAAgAZVKpWy5aKS0VhSMVUUAAAAAACQDRkXAAAAAADQl3SAnFICqqHpNOFbAgAAAAAAhisZFwAAAAAA0LDMinOHnMaShowLAAAAAAAgGzIuAAAAAACgUZXMMi4qGY0lERkXAAAAAABANmRcAAAAAABAX9IBckoJqIam04RvCQAAAAAAGK5kXAAAAAAAQKPUuBh0Mi4AAAAAAIBsyLgAAAAAAIBGVSqhErMuclHJaCyJyLgAAAAAAACyIeMCAAAAAAD6kg6QU0pANTSdJnxLAAAAAADAcDWsMy7mzJkTrr322nDbbbeF22+/vfz5xBNPlP923HHHheOPP36xfTz33HPhm9/8Zrj88svL544fPz5svPHG4eCDDw4f/vCH85qrrIkV9Vra/op0/dWTji3t+6RJttlq87/Hol5P1ld11OhkfdVa54VcVSotWR4Tk24XRbrtIqWU77HSUs308yitStLtIt/3maOcl1fSfama7pg4Ur4P53jsyfU9Jj/GZrrMqqPGJOurrXVult95Ukt57Kkm/M5fb0vXF81zHEup1rYgWV+t82cn62vcpGWz3L8fvv3qZH2tu/l2yfpikMVzxjmdN65kNJZEhnXg4pZbbgm77rprv58fAx077bRTeOmll8rfJ02aFGbOnBluuOGGsv3qV78Kl112WRgzJt0XPAAAAAAAYNhd59u4pZdeOuywww7hqKOOCr/85S/Diiuu2NDzpk+fHnbbbbcyaLHhhhuGf/zjH2XQYvbs2eF73/teGD16dPjTn/4UjjjiiEF/DwAAAAAADBPVSn6tyQzrjIutt946vPzyy13uO/rooxt67qmnnhqeffbZcmqo3//+92GttdYq74/ZFYcddliYMWNG+OIXvxjOPPPMMnix/vrrD8p7AAAAAAAAmiTjoqWl//PRnXPOOeXP/fbbryNo0dnhhx9eTh1Vq9XCeeedN6BxAgAAAADQJCoZtiYzrAMX/fXAAw90FPHeZZddFvmYGLSIGR3Rn//85yU6PgAAAAAAGKlGZODinnvu6bi9ySab9Pi49n+77777eu1v/vz55dRSnRsAAAAAAM2nUqlk15rNiAxcPP300x23V1lllR4f1/5vMRAxa9asHh930kknhalTp3a01VZbLfGIAQAAAABgZBiRgYuZM2d23J4wYUKPj+v8b52f090xxxwTpk+f3tGmTZuWcLQAAAAAAGSjWsmvNZlRQz2AZjB27NiyAQAAAAAAAzMiMy4mT57ccXvOnDk9Pq7zv3V+DgAAAAAAI1Qlw9ZkRmTgYuWVV+64/dRTT/X4uPZ/mzJlSpg0adISGRsAAAAAAIxkIzJwsckmm3Tcvueee3p8XPu/vfa1r10i4wIAAAAAIHOVSn6tyYzIwMX6668fVl999fL2H//4x0U+Zvbs2eH6668vb7/rXe9aouMDAAAAAICRakQGLiqVSjjooIPK2xdccEF47LHHFnrM97///TBr1qzQ0tISDjzwwCEYJQAAAAAA2YkZDtWMWkXGRXZeeeWV8OKLL3a0er3eUVi78/0xCNHZ5z//+bDiiiuWj3v3u98dbrvttvL+BQsWhB/84AfhK1/5Svn7Rz/60TJDAwAAAAAAGHyjwjC32Wabhccff3yh+0855ZSytTv44IPD2Wef3fH71KlTw+WXXx522mmncN9994UtttgiTJ48OcybNy+0trZ2TBF12mmnLaF3AgAAAABA7nIrK1HJaCypjMipotq98Y1vDPfee2/47Gc/G9Zbb70yYDFx4sSw1VZbhbPOOiv84Q9/CGPHjh3qYQIAAAAAkIsYKBjqYtyVzi00nWGfcbGo+hR9scIKK4RvfetbZQMAAAAAAIbWsA9cAAAAAADAEp3HKKe5jKqh6TThWwIAAAAAAIYrGRcAAAAAANAo1bkHnYwLAAAAAAAgGzIuAAAAAACgUTIuBp2MCwAAAAAAIBsyLgAAAAAAoC/pADmlBFRD0xG4GESzX5kWKgsmDLif6c8/FFJpGTUm5KhtweyQq7b56cZWqbaEHBX1Wrq+inR9jRS5frYU9XqW20VRrzb9flSqZrqPJ+yr3rYgWV+trfOS9VWtplv4Lam3i4SqCb8T1BKuy2pLwnG1zm36z/Cc1WqtyfqqJ9yXWufPStZXpZLueFFPuLyqLaOT9VUUeX4fiCqVlizfZ9LtIuG2X8n4MynXbayopfwOlefnSNLPt4SLP+V3zpTvMfV3/pTfe+bNeinkqJLwu3Wu52daRo9L1tfDt18dUlp38+2S9gdLksAFAAAAAAA0qFKplC0XlYzGkkqel60CAAAAAAAjkowLAAAAAABoVMxwyCnLoZLRWBKRcQEAAAAAAGRDxgUAAAAAAPQlHSCnlIBqaDpN+JYAAAAAAIDhSsYFAAAAAAA0So2LQSfjAgAAAAAAyIaMCwAAAAAAaJSMi0En4wIAAAAAAEagiy++OGy77bZh6aWXDhMnTgxveMMbwje/+c3Q2to6pOMSuAAAAAAAgAZVqvm1/jjiiCPCvvvuG2688cbwpje9Key8887hiSeeCP/93/8dtt9++zB37twwVAQuAAAAAABgBLn00kvDd77znTBp0qRw8803hz/96U/h17/+dXjooYfC6173unDDDTeEr3zlK0M2PoELAAAAAADoa42LnFofff3rXy9/Hn300WHzzTfvuH+55ZYLZ5xxRnn7e9/7Xpg+fXoYCgIXAAAAAAAwQjz11FPhH//4R3n7gAMOWOjft9pqq7DaaquF+fPnh9///vdDMEKBCwAAAAAA6IPcsi0qfVp7//znP8ufyyyzTFhrrbUW+Zgtttiiy2OXtFFD8qoAAAAAAEAyM2bM6PL72LFjy9bdo48+Wv5cffXVe+wrZlx0fuySZqooAAAAAABoUJHhf+3BhqlTp3a0k046KSzKzJkzy58TJ04MPYlFuxcVDFlSZFwAAAAAAMAwN23atDBlypSO3xeVbTFcCFwAAAAAAECDilALRVHLajxRDFp0Dlz0ZPLkyeXP2bNn9/iYWbNmdfQ5FEwVBQAAAAAAI8Saa67ZkaHRk/Z/a3/skibjAgAAAAAAGlTUa2XLRdHHsWy22Wblz5deeqksvr3WWmst9Jhbb721/Ln55puHoSDjAgAAAAAARohVV101bLnlluXt888/f6F/v+GGG8qMi1gjY9dddx2CEQpcAAAAAABAw4p6vSPrIo9W7/Pa++IXv1j+PPnkk8Ptt9/ecX/MwvjkJz9Z3v7Upz4Vpk6dOiRbhqmiAAAAAACgUZlNFRX6MZb3vve94dOf/nQ4/fTTw1ve8pawww47hIkTJ4arrroqvPrqq+Htb397OPHEE8NQEbig36rVFkuvj1Ie0CqZLv+sDtrDRFHJc13WWueGZldvW5Csr1qtNaRUqTT/bI5FUcvy2NP361R6Vq3me0xMeryu5rld1FO+x4R9tYwaMyI+d3Pdxur9uBqtx74SHvuTLq+W0SNiGxsJ22uuyz/l3yKVhN+FK9Vqtu+zXluQ5/IPef4tklKu+1FqtYTbWErVIt02Nn/OK1nuR+MmLZft9vrw7Vcn62vdzbfLblwzZ81O0s9I9p3vfKcMUHz/+98Pf/vb30Jra2tYZ511wtFHHx0++9nPhjFj0v3t0lcCFwAAAAAA0KCiqJctF8UAxrLvvvuWLTfNfzknAAAAAAAwbMi4AAAAAACABrUXxc5FkdFYUpFxAQAAAAAAZEPGBQAAAAAANEjGxeCTcQEAAAAAAGRDxgUAAAAAADSoXtTKlot6RmNJRcYFAAAAAACQDRkXAAAAAADQoKJeL+tc5DSeZiPjAgAAAAAAyIaMCwAAAAAA6FPGRT5ZDkVGY0lFxgUAAAAAAJANGRcAAAAAANCgoqiVLRdFRmNJRcYFAAAAAACQDRkXAAAAAADQl4yLej5ZDoWMCwAAAAAAgMEj4wIAAAAAABoUsy2yyrio5zOWVNS4AAAAAAAAsiHjAgAAAAAA+lLjIqO6EkVGY0lFxgUAAAAAAJANGRcAAAAAANAgNS4Gn4wLAAAAAAAgGzIuAAAAAACgQfV6Eer1elbjaTYyLgAAAAAAgGzIuAAAAAAAgAYVRa1suSgyGksqAheDqNa2INTaBr6Ii6KetHBMKpVqS8hVyvc5Et7jSFheWW+vmX641BNuF9WEy38kbK85H/tTamtrDbl+fo8E1Uz38UolXUJwvdaa5edIym0s52NFW+vckKOky3/0uGR91WoLstxec/0MSf0dqhJamv87f67bRcp5IPKZsWMhRUbTiXRWDwsy/Ru13vR/b0WjRo9P1lc94edISkkPFwk7a2kZk6yv+bNfSdbXmPFTQq4evv3qoR4CI4zABQAAAAAA9CFYm9MFHkVGY0lFjQsAAAAAACAbMi4AAAAAAKBBMi4Gn4wLAAAAAACg+TIuiqIIjzzySHjsscfCyy+/HObOnRvGjx8flllmmbDmmmuGddZZJ1QqlVQvBwAAAAAAS15mNS5CTmPJIXDx0EMPhUsuuST88Y9/DP/4xz/CnDlzenzsxIkTw5Zbbhl22mmn8L73vS+st956A3lpAAAAAABY4oqiXrZcFBmNZcgCF7VaLVx00UXhe9/7Xrjpppu6ZFz0ZtasWeGaa64p2zHHHBPe/OY3h8MPPzzsu+++oaWlpX+jBwAAAAAARmbgIgYmzj777HDCCSeEJ554ouO+dmussUbYaKONyqmhll122TBlypQwffr08NJLL5VTR913331h2rRpHY+/+eabyxaDGMcdd1w4+OCDQ7Wq5AYAAAAAAJlnXGQ0PVMxUjMurrvuuvCpT30q3HvvvR3BilVXXTXsueeeYdtttw1vectbwoorrrjYfp599tnw97//vezvN7/5TRnIiEGQQw89NJx22mnh+9//fth6660H/q4AAAAAAIDmDVzE4EQUMyL22muv8PGPfzxsv/32fX6xGNyI9S1ii4GKq6++OvzgBz8o62Tcc889YbvttgttbW19fxcAAAAAALAExGyLrDIu6vmMJZWG5maqVCrhgx/8YPjXv/5V1rfoT9BiUWKgIvYX+z3kkEOS9AkAAAAAADR5xsWdd94ZNtlkk0EbxDrrrBN++tOfhs997nOD9hoAAAAAADBQ9aJWtlzUMxrLEs24GMygRWcbb7zxEnkdAAAAAABgGGdcAAAAAAAAalxkk3EBAAAAAACwJMi4AAAAAACABhX1etlyUWQ0luwCF21tbeHmm28O9913X3jllVfCvHnzGnresccem2oIAAAAAADASA9cLFiwIHz9618P3/ve98qARV8JXAAAAAAAMFwURa1suSgyGksWgYvW1tawyy67hGuuuSYURdHn51cqlYG8PAAAAAAA0GQGFLg4/fTTw9VXX13eHjduXDjwwAPD1ltvHVZcccUwduzYVGMEAAAAAIAsFPVa2XJRZDSWLAIX5557bvlzmWWWCddff33YaKONUo0LAAAAAAAYgQYUuHjooYfK6Z4OP/xwQQsAAAAAAJpeUa9nleVQ1Ouh2VQH8uQ4PVS08cYbpxoPAAAAAAAwgg0o42LttdcOt912W5g+fXq6EQEAAAAAQKaKola2XBQZjSWLjIv99tsvFEURrrzyynQjAgAAAAAARqwBZVx85CMfCT/84Q/Dr371q3DVVVeFHXbYId3ImkAM6hTFwOcXSzpfWsvoZF1Vqi0hV7mOrd62oOnfY65SzztYT9hfNdN1Wa+1ZtlXym2/JeExMefjRa5XXtQSvsdcjxcp+8r5uJ/ymJjiu1NHXxnNOZvu0qHBe4/1Wtp9sp5wnt2U77OW6fE15fJKvS5zPFakVqnkeexvbZ2XrK+U33pqlXQHspZRY5L1VYS021ilyPOzt6gl/H7RhHOiDyf1EfC9M+l3lZDn51st4edu6u/8E6auFHI0Z/ozYbiL23ZOf28UGY0llQF925g8eXK4/PLLw8orrxx23333cOqpp4aZM2emGx0AAAAAADCiDCjjIlp//fXD3XffHXbcccfw3//93+GLX/xi2GCDDcKyyy4bqtXe4yKVSqXM1AAAAAAAgOEgZsumzJgdqHpGY8kmcPHUU0+F//qv/wq33357+XtbW1u47777GppGKQYuchBrdJx11lnh5ptvDs8991w5rpVWWim89a1vDR/96EfDNttsM9RDBAAAAACAEWFAgYuXX365PKn/6KOPloGIdp1v5yyO8xOf+ET40Y9+1HHf+PHjy5/xPcV2/vnnh89+9rPhW9/61hCOFAAAAACAHMRaZznVlSgyrW05ZDUu/vd//zf8+9//Lm9vsskm4dxzzw2PPfZYmDdvXke6TG+tlrCgVH+cffbZHUGLvffeOzz44INhzpw5ZfvXv/4V9thjj/LfTjvttHDJJZcM6VgBAAAAAGAkGFDGxaWXXlr+3GijjcJNN90UJkyYEIaTc845p/y57rrrhl/+8pdh1Kj/vzhinY6LL744bLjhhmVw5qKLLgrve9/7hnC0AAAAAAAMtXq9VrZc1DMaSxYZFzG7ItaDiHUghlvQInrmmWfKn294wxu6BC3ajR49Omy66abl7VmzZi3x8QEAAAAAwEgzoIyLKVOmlNNCrbzyymE4WnvttcMDDzwQ7rzzzrKoePfgRWtra7jjjjvK21tsscUQjRIAAAAAgFwUZSmEWlbjaTYDyrjYeOONy59PPfVUGI5iYe7o4YcfDvvvv3/5s10MaOy7777lNFHrrLNOWaAbAAAAAADIOHBx0EEHhaIoyvoPw9F73vOesvD2mDFjwq9+9auw3nrrlVNexRZrW1xzzTVlcOOWW24ps0t6Mn/+/DBjxowuDQAAAACA5lMUtexasxlw4OKd73xn+Pvf/x5OPPHEMBwdccQR4Te/+U14zWteU/4+d+7cskULFiwoa1tMnz691z5OOumkMHXq1I622mqrLZGxAwAAAABAsxlQ4CKKJ/332WefcPzxx4dddtklXHHFFeGll14Kw8GcOXPC+9///rDbbruF1VdfPfz5z38OL7zwQtni7de+9rXhF7/4RXjTm94U7rrrrh77OeaYY8rgRnubNm3aEn0fAAAAAAAsGfWyxkVerdkMqDh3S0tLx+04ZVQ82R9boyqVSlkUe6gcddRR5TRXG2ywQbj++uvDuHHjOv4tZpJstdVWYdNNNw0PPvhgOOyww8rHLMrYsWPLBgAAAABAc4uFuXMqzl3PaCxZZFzEYEV76/57o22ozJw5M5x55pnl7RiU6By0aDd+/PjwqU99qrx9ww03hOeff36JjxMAAAAAAEaSAWVcvOMd7yizJoajmEXRnu2xzjrr9Pi4WLC73aOPPtpRCwMAAAAAgJGnqNfKlosio7FkEbi45pprwnBVrf7/ZJPHH3+8x8c999xzHbcnT5486OMCAAAAAICRbMDFuYerDTfcsJwKKvrxj3+8yFobtVqtYzqppZdeuqyFAQAAAADAyNVe4yKn1myGNHDx4osvDtlrx6DFoYceWt6+/fbbw3ve855w9913d1Rhv+uuu8Kuu+4a/va3v5WPOeKII7oUIwcAAAAAADILXHz1q1/t93NfeumlsOOOO4ah9I1vfCPsvPPO5e0//vGP4fWvf32YMGFC2d7whjeEP//5z+W/7b///uFLX/rSkI4VAAAAAIB8alzk1JrNgAIXxx57bPjZz37W5+e9+uqrZdAiZjgMpZh18fvf/z5cfPHFYY899girrrpqKIqi/LfVVlst7LXXXuHyyy8P559/vmwLAAAAAADIvTh39LGPfSyssMIK5bRKjZg+fXp45zvfGe68885QqVTCUItj2HvvvcsGAAAAAAC9qdeLstxATuNpNgPKuFhrrbXKotb77rtvuOWWWxb7+JkzZ5ZTM912221lwCBOwQQAAAAAAJAkcBHrQiy//PJhzpw54d3vfnd48MEHe3zsrFmzwi677BJuvvnmjiyHc845ZyAvDwAAAAAAS1S9qIV6PaNWqHHRxXrrrVfWgJg4cWJ4+eWXy2yKZ599dqEV2R7Y+Nvf/lYGLd773veWdSOq1QHFTQAAAAAAgCYz4BoXW265ZbjooovK4taPP/54mVVx3XXXhcmTJ5f/Pnfu3PCe97wnXH/99WXQYrfddgsXXnjhiCh2Hd9vpTLw4EylJc8AT9uCucn6ahk1JqRUqabbvop6nhHLlOOKkdlUqgmXfa3WmqyvFPviYEm5/Isi3fyK9dqCZH1VKi1Z7t9Jl33iY0WR8GqJlO9zJEi5vCopl33q9Zjwszfl9t/Sku7YU0t4HGsJeS6vlMeKtrZ0n7tRrS3d8h8Jx4uUyyvXC8Rymge6uxHw52lSKb9z5vr31oiR5+EiqXpbyFbS7wQJj7FJ+0r4XaWS8edIjn+H/8fExP3RedtOuX0PVJHRWLL6iIrBirPOOisURRHuuuuuMojR2toa5s2bV96++uqry8fttNNO4Ve/+lUYNWrA8RIAAAAAAKAJJYsgHHzwweHpp58OX/rSl8K1114bDjjggLKuxV/+8pfy39/5zneGSy+9NIwePTrVSwIAAAAAwBLVXlsiF/WMxpJK0tSHY445pgxefP/73w+/+c1vOu7fdtttw29/+9swZkza6YAAAAAAAIDmknzOptNPP70s0P3rX/+6rPGw9dZbhyuuuCKMGzcu9UsBAAAAAMASr1GTU5ZDkdFYlmjg4pxzzulTp3FaqDhFVK1WC/vuu2+4+OKLe3zsQQcd1Ke+AQAAAACA5tVQ4OKQQw4psyf649Of/nSP/xb7FLgAAAAAAGC4iBkOOWU5FBmNZYlPFVUUxeCOBAAAAAAAGPEaClz87Gc/G/ELCgAAAAAA6vUi1Ov1rMYzIgMXBx988OCPBAAAAAAAGPEanioKAAAAAABGOjUuBl91CbwGAAAAAABAQ2RcAAAAAABAg+r1WtlyUc9oLEs04+Luu+8e/JGEEO64444l8joAAAAAAMAwDlxsvvnm4cMf/nB45JFHBmUQ9913X9hrr73CFltsMSj9AwAAAABAyoyLnNqIDFzUarVw9tlnhw033DDst99+4ZprrhnwC8c+L7/88rD33nuHN7zhDeGSSy4JRVEMuF8AAAAAAKDJa1xce+214bDDDgv33HNPuPjii8u22mqrhT333DNss8024S1veUtYYYUVFtvPs88+G26++ebw17/+NVx44YXhhRdeKO+PAYvXve514fvf//7A3xEAAAAAAAySoqiVLRdFRmNZooGLrbfeuqw/EbMuTjjhhPDEE0+U7Tvf+U7ZohjIiBkZyyyzTFh22WXD5MmTw4wZM8LLL79ctvvvvz88+eSTHX22Z1esscYa4dhjjw0HH3xwqFYbSgABAAAAAACaVEOBiygGFT70oQ+Fgw46KFxwwQXhjDPOCDfddFPHv0+bNq1svek8FdTb3va2Motj3333DS0tLf0dPwAAAAAALDH1oh7q9XpW4xmxgYuOJ4waFT7wgQ+U7cEHHwy/+c1vwp/+9Kdw6623htmzZ/f4vJiBseWWW4add945vO997wvrrLPOQMcOAAAAAACM9MBFZ+uvv344+uijyxYjTI8++mh47LHHyqmh5s+fH8aOHVtOG7XWWmuFNddcM1QqlXQjBwAAAACAJaxer5UtF/WMxpJF4KL7VFIxi0ImBQAAAAAAzaqo10ORUbCgyGjaqlRUwwYAAAAAAJov4wIAAAAAAEbGVFH55ATUM8r+SCWfpQsAAAAAAIx4Mi4AAAAAAKBBsb5FkVHGRdGEGRcCFyNMrdYacpR656pUW7IcW65pW0WRroBPylpASbeLfD5LBvV9puyrrS3l8SJdX6OKdO+x2jImWV9trXNDSrWEyz/lsaea8PiaUq7H6mqm48pZkXAfT7kf5aqe8IO3bUHa41hb24KmP/a0LpiXrK9apssr5bEn9Xf+llHpPsdrtXTLP9vviQmPr/WE22vK95jy78CyvxHwHWpESPi3YKViPTbN98TWPL9bz5v1YtL+WufPTtbXgjmvJOurZfS4JP20LZiTpB/yJHABAAAAAAANKur1pBcRpRhPs8n4GmQAAAAAAGCkkXEBAAAAAAB9mE6znlGNi3oTTi2cz9IFAAAAAABGPBkXAAAAAADQh2LxRVFtyuL1uRC4AAAAAAAA+uz3v/99uOWWW8Jtt91Wtmeeeaa8f9q0aWHVVVcNQxK4OOGEE8qf++23X1h//fUbft4jjzwSzjvvvPL2scceO5AhAAAAAADAElOv17OqK1Gv14fstQ844IAwffr05P0OKHBx/PHHh0qlEjbddNM+BS4efvjhjucKXAAAAAAAwPCz5557hvXWWy9svvnmZXvNa16TpF9TRQEAAAAAQIPqRS3U65WsxjNUfvrTnw5Kv9WhTF2pVvMpYAIAAAAAAAy9Icm4eOqpp8qfkydPHoqXBwAAAACAfinqtVBklHFRZFRvY9gGLp588snwwx/+sLwd574CAAAAAAAGZsaMGV1+Hzt2bNmaOnDxne98p2yL8tGPfjQcccQRvT6/KIowe/bs8NJLL5W/x8Lcu+66a1/HCwAAAAAAQ6ZWFGXLRe3/xrLaaqt1uf+4444Lxx9/fGjqwMWrr74aHnvssTLgEIMQ7eLt559/vs8vvNFGG4Ujjzyyz88DAAAAAAC6mjZtWpgyZUrH771lW3zhC18Il112WeirH//4x2GrrbYK2QQullpqqbDGGmt0ue/xxx8vAxnLLbdcmDBhQq/Pj4W4J02aFNZaa62w4447hg996EOLfQ4AAAAAAOSkHoqy5aL+f2OJQYvOgYvePP300+GBBx7o82vNmjUrLAkNBy4+85nPlK17MCI666yzwu67755+dAAAAAAAQFLnnntu2ZqyOPfqq69eZlzInAAAAAAAYCSoFfWy5aKW0ViyCFzEmhcAAAAAAABZBC4AAAAAAGAkKTKrcVFkNJZUBC4AAAAAAIA+O/HEE8MVV1yx0P2xJvaYMWPK25tvvnk444wzhiZw8cILL4S//OUv4Z577gmvvPJKmDdv3mKfE+tj/OQnP0k1BAAAAAAAGFS1oihbLmpDOJZHHnkk3HzzzQvd/89//rPj9rhx4/rc74ADF7NmzQqf//znw9lnnx1aW1v7/HyBCwAAAAAAGH7OPvvssqU2oMBFDFTstNNO4aabbgpFP6I6MeMCAAAAAACGi1pRL1suahmNJYvAxQ9+8IPw97//vQxATJo0KRx22GHhne98Z1h11VXD2LFj040SAAAAAAAYEQYUuLjgggvKn1OnTi0DGBtssEGqcQEAAAAAQHbqoShbLuoZjSWLwMX9999fZlt8/OMfF7QYRPVa32uH9KSo15L1VR31n6rwOaq3LUjXV8JlViRM22qdPyvkaNTo8cn6amudm6yvarUlpFSppOuvKGp5bq/1PMdVrVaT9VWppBvXSJFyXY6EcTG0agm/D6TUMmp0lu+xLfHySvm9J4S0n+M5flamNBK+D+S7VeQr7fexpGdakqkk/s6f8jhWq2U6hUfC8w2VSsoNI52WhOcuipD2OFYNY7L8u3IkfFamPF6kfI9FwnMNOUu1/FMf92miwMWCBf/542bTTTdNNR4AAAAAAMhWrSjKlotaRmNJZUDh8FjLIpo/f36q8QAAAAAAACPYgAIX73rXu8qft956a6rxAAAAAABA9jUucmrNZkCBi09/+tNh3Lhx4ec//3l49tln040KAAAAAACynSqqnlErQrMZUOBivfXWCz/84Q/D7Nmzw0477RQeeeSRdCMDAAAAAABGnIaKc59zzjm9/vvee+8dLrzwwvDa17427LbbbuGtb31rWG655UK1uvi4yEEHHdT4aAEAAAAAYAgVmU3PVGQ0liUauDjkkENCpVLp9THx31tbW8Oll15atkbE5whcAAAAAAAAfQpcREWD82Q1+jgAAAAAABieNS7yOQ9ey2gsSzRw8bOf/WzwRwIAAAAAAIx4DQUuDj744BG/oAAAAAAAoBbqoRZ6L62wpMfTbBZfPRsAAAAAACC3GhcAAAAAADDS1YuibLmoZzSWVGRcAAAAAAAAzZFx8cQTT/TredVqNUyePDlMmTIlVCr5zAUGAAAAAAC9qYWibLmoZTSWLAIXa6655oACD6NGjQobb7xx2G677cJHP/rRsMEGGwxkOAAAAAAAwEifKqooin631tbWcOedd4Zvf/vbYZNNNglf/vKX07wrAAAAAAAYxBoXObVmM6CMi4MPPrj8+eSTT4arrrqqvN3S0lJmUay99tph4sSJYfbs2eHf//53uPfee0OtViszNHbYYYewwgorhJdeeincdttt4YUXXij/7aSTTgptbW3h5JNPTvPuAAAAAACAkRO4+NnPfhauu+66sNdee4UxY8aEL3zhC+Hwww8Pyy+//EKPjcGJ008/PZxy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7Wtf23E7Th8FAAAAAABkmnHxm9/8Jlx33XWhUqmUmQnXX399Wch6s8026/V5O+64Yxno+Nvf/haGyjLLLNMleNGTzpkj8X0CAAAAADBy1Yt6dq3ZDChwcf7555c/X//614dvfvObDT8vPj564IEHwlB617veVf68//77e3zMfffd13F7rbXWWiLjAgAAAACAkWpAgYtbbrmlzELYf//9+/S8FVZYofz5wgsvhKH0wQ9+sPwZa25ceumlC/17LNp96qmnlrdjdsbmm2++xMcIAAAAAEA+6hnUtKh1anE8zWZAgYv2wMPaa6/dp+eNHj26/LlgwYIwlLbeeuuw9957l7cPPfTQ8Otf/zq0tbWVvz/xxBNlQOauu+4qf4/Fx2OxbgAAAAAAYPCMGsiTx40bVwYf+hqAaA94LL300mGonX322eH5558va3XEIMbYsWPDhAkTwiuvvNLxmOOOOy4cfPDBQzpOAAAAAACGXr3+n5aLekZjSWVAKQQrrbTSYmtELMpNN92UTc2IiRMnhquvvjqcddZZ4R3veEf5+6xZs8qpofbbb79w4403huOPP36ohwkAAAAAACPCqIFOtfSvf/0rXHzxxeGEE04o610szosvvlhOyRQfu80224QcxCmg4lRRsTW7er2WrK9KJV1fRbUljAS1Wrrp0WptrSFHsTZMKkXC7bVezTf0nPR9Juwr5bja2tJt+5VMjxcpl33OqgmXf62W736ZykjZLkaClNt+yuNrSpXE06Km3P5Hwr6U8j3WEn7uhrETR8R6TPp9LOQp5XaR699vqb/zV6sJt9lann9z5ToldkvLmJClWtq/w1syPS4m/buySLe9VirptteWUWOy/AzJ9e9dFlYvKmXLRT2jsaQyoD3+Ax/4QPnzoYceKmtALE6cUio+Z86cOWXg4pBDDhnIywMAAAAAAE2mOtCMi3e/+92hKIqyDsTHPvax8PDDDy/0uBiouOSSS8Kb3/zmcOWVV5ZBixjA2HDDDQfy8gAAAAAAsETVivxasxnQVFHRueeeG972treVdS5+/OMfly0W7W63/PLLh1dffbUjlTEGOTbddNNwxhlnDPSlAQAAAACAJjPgyeGmTp1aFtt+//vfXwYlYps7d25HvYuXXnop1Gq1jn/bZ599wnXXXRcmTJiQYvwAAAAAALDExGv0c2vNJklVm8mTJ4df/vKX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KaBMr776ahg5cmQ48MADw+abbx5WX331UFNTk9/uuuuu4Wc/+1n4/PPPv7IcfSWko4+DVasf1AdCsc4X9aNQvOur+spOJM5xQRo/+tGPYmSheenfv39WU1PT/P/vfe97WX19fZuPnzhxYrb66qs379+7d++surq6+f/77LNPVldX5+WCdnryySeztddeu7kt1dbW5u2zZXt97bXXWn3s5MmTs0GDBjXv17Nnz6xbt27N/992222zzz//3GsCZTjzzDMXa3fdu3fP+vTps9h9a6yxRvbcc8/pK2EF0MfBqtUPOl+EYp0v6keheNdX9ZWdi4yLRG688cY8Oh8dccQR+aQjX3zxRR59v/XWW0OvXr3CAw88EM4///xWHz9r1qyw//77hxkzZuS/vnn55Zfzx86bNy9cd911+S9xxo0bF4YPH56qytAlPPvss2G//fbLI+4HH3xw3rYWLlyYt8/Yvl566aXw7//+73kWxZc1NDSEAw44IEyePDmss8464YknnsgfM3/+/DB27NjQp0+f8Nprr4Wjjz56pTw3WNXsuOOO4corrwzPP/983gYXLFiQ/7ot9ne33XZb/uu26dOnh2HDhuX94pfpKyEdfRysWv2gPhCKdb6oH4XiXV/VV3ZCKzty0hnEKF9TdH677bbLGhsbl9jnF7/4Rb49ZlC89957S2y/8MIL8+09evTI3n///SW2X3rppfn2qqqq7J133umw5wKdybx587Kvfe1reds566yz2v340aNHN0f0W/vl25133tm8ffz48YlqDV3XuHHjmtvUmDFjltiur4R09HGwavWD+kAo1vmifhSKd31VX9n5yLhI4JVXXsmj81Gcn6KycsnDesopp4T+/fvnUfkxY8Yssf32229vjiZuvPHGS2w/66yz8rH1Gxsbwx133JGi2tDp/frXvw7vv/9+GDhwYLjiiiva/fj4y7cojmu6yy67LLG9ZXttasPAstt5552b1z/88MMltusrIR19HKxa/aA+EIp1vqgfheJdX9VXdj4CFwlMmTKleX3LLbdsdZ+qqqqw6aab5uuPP/74YtveeeedMHXq1Hx96NChrT4+Bi3iJN2tPR5oXVOnddhhh4Xu3bu36zDF4aBi2vDS2mVFRUXYd999tUtIOAFbk0022WSxbfpKSEcfB6tWP6gPhGKdL+pHoXjXV/WVnZPARWIxI+Krtr355puL3d/y/1tttVWbj2/a9tZbbyWoKXRudXV1YeLEifn69ttvnwcHTz311LDBBhuE2trasPbaa+fzVzzyyCOtPv7tt98OpVKp7Hb5ySefhM8//7xDngt09rYa55GJ8zkdc8wx+X1f//rX8/bZkr4S0tHHwarVD+oDoVjni/pRKN71VX1l5yRwkcCgQYOa178clGiyaNGi8H//93/Nk8XESZ6aTJs2rXl9vfXWa/PvNG2LE7jNnTs3RdWh04ongLHdRTH9NwYY/ud//id89tln+WRO8fbhhx8O+++/f55qmGVxmMSwzO3yy48Bli7+qi1mLcXbOORaHBIxTrq26667hgkTJoRu3botV5vUV0Lb9HGwavWD+kAo1vmifhSKd31VX9k5CVwksN122+XR+CjOfB/HWfuyn//85/lFlCYt1+fMmdO83rNnzzb/TsttLR8DLCme+DW55JJLQk1NTbjnnnvyoF/cFlMQY0pwNHr06HDNNdcs9njtEjpWHEs49p3xxLBJnE/m2muvDRtuuOES+2uTkI72BKtWP6jNQrHOF7VJKN71Ve2yc+qygYtbb701/4XLsi6PPfZYc1nV1dXhpz/9aXPKYIzIv/rqq3kUMA4fc+WVV4YLLrgg7wibtDbBDHR1Kdtl0zBPTes33XRTOPTQQ5vbYTwhHDt2bNhmm23y/1966aWtdorQlaVsk639yi32kfHkME7ANmrUqPD666+HHXfcsblPBYDOSj8IK5fzRSge11f5MlfPEznjjDPCueeem6+PGzcuHyMxpveus8464fzzz8/TneJtk9VWW615vU+fPotN8tSWlttaPgZYUss28o1vfCMMGzZsiX1iALGp3c6YMSO88sor2iWsBGuttVY455xz8kBHDHhcfPHFeWp+S/pKSEd7glWrH9RmoVjni9okFO/6qnbZOVWHLurII4/MMyOWVb9+/Za4L2ZWxM4uphG+/PLLebpSbFgHHnhgGD58eLjiiivy/TbaaKN8sqcm6667bvP6Rx99FPr27dvq34zbori9d+/ey1x36ArtsuUY+Jtvvnmbj9lyyy2b12M68E477dRquxw8ePBS2+WXHwOdQUf0lUsTsy1222238Ic//CH86le/Wuxv6yshHX0cFFNb/aA+ENJbnvNF/Sh0rGW5vqqv7Jy6bOAiRuu+PPFnCnEytbi0ZuLEifntt7/97cXuj5NAtZx8Zosttmj18U0T07TsOKEzSdkuBwwYkH8ZbRlYaE3LSdbiL9yaxHYYf2ETU4hj2xs6dOhS22Ucpzj+TehMOqqvLOck8t13313sfn0lpKOPg+JqrR/UB0J6y3O+qB+Fjtfe66v6ys7JUFErSBy/e/z48fn6scceu9i2TTfdtHkCtrbGA583b154+umn8/W99967w+sLnUFTW4lzz7Tlrbfeal7feOONm9d79uzZ3Em21S7jl9iYutjybwHL5/333291SER9JaSjj4NVqx/UB0Kxzhf1o1C866v6ys5J4GIFaGxsDN///vfzybpj+u8+++yz2PYYtW9qbHGy4DhR25ddf/31+QSmVVVV4aijjloR1YZV3gknnND8i7UHH3xwie0xmyJOCBzFX9tst912i20/7rjj8tvf//734cUXX1zi8ffcc0/zyeWXA5LAkn1hy1+stWbChAnhpZdeytf32GOPxbbpKyEtfRysOv2gPhCKd76oH4ViXV/VV3ZSGUm899572Y9//OPslVdeyRYsWJDf19jYmD3zzDPZnnvuGb+hZv3798/eeuutVh8/c+bMbODAgfl+W265ZTZx4sT8/rq6uuyGG27Iamtr822nn366Vwza4dBDD83bzuqrr57de++9WX19fX7/lClTsn/5l3/Jt8Xl1ltvXeKxcd+tt946377eeutl48ePb27bd999d9a3b99829ChQ70m8BUmTZqUbbPNNtkvf/nLvM8slUrN26ZOnZpddtllWa9evfI2NWDAgOzjjz/WV0IH0sfBqtUPOl+EYp0v6keheNdX9ZWdT0X8Z2UHTzqD119/PWy77baLzWofMyTq6+vz/8ehoB544IElftHd0iuvvJJHC2fMmNGcHrxw4cLmMmIa40MPPbTCxxuHVVkcZu2f//mf80kOo9h+YmrvF1980bzPRRddFEaMGNHq42MG1JAhQ5ozoeJj4y9vYtuMYruPv46LbR5oW2xDLYdji5Oo9e3bNyxYsCBvp03iPvfdd99ifWpL+kpIRx8Hq1Y/qA+EYp0v6keheNdX9ZWdi8BFIjNnzgzXXHNNeOqpp/I0w+nTp+eBh8033zwcfPDBeSpT7PzKGavt8ssvDw8//HD44IMPQvfu3fMJZmIa4oknnphPFgy0Tww03HzzzeHXv/51Ppn2nDlzwlprrRV23333cNZZZy02oVNr4v4xRfj+++8PkyZNytthHD/xyCOPzB8fTzyBpYvpvDH4HvvJOPTatGnT8r4yDoG45pprhm222SYcdNBB4V//9V9Djx49llqWvhLS0cfBqtUP6gOhWOeL+lEo3vVVfWXnIXABAAAAAAAUhp/vAwAAAAAAhSFwAQAAAAAAFIbABQAAAAAAUBgCFwAAAAAAQGEIXAAAAAAAAIUhcAEAAAAAABSGwAUAAAAAAFAYAhcAAAAAAEBhCFwAAAAAAACFIXABAAAAAAAUhsAFAACUafLkyaGioiJfjj/++EIdt0GDBuX1irersiIfYwAAYMWoXkF/BwAAaIdrr702zJw5M/Tv3z8MHz58uY/d66+/Hh588MF8fdiwYeEf/uEfvB4AAEAhCVwAAEBBAxdTpkwJG220UbLAxciRI/P1mJUhcAEAABSVwAUAAHQCcYglAACAzsAcFwAAAAAAQGEIXAAAAAAAAIUhcAEAAAn95S9/CVdffXX43ve+F77xjW+E3r17h9ra2rDWWmuFf/zHfwyXXHJJmD59epuPj/NPVFRU5PNbRPE2/v/Ly4gRI1p9XLxt6dZbb83vP+GEE5rvi+utldnS8ccf33z/Vw1D1fQ34hLXl+bFF18MRx11VNhggw1C9+7dw3rrrRf23XffcPfdd4dl8Yc//CGceuqpYYsttsgnMo9lxrIPOeSQcN9994Usy5apXAAAYOUxxwUAACRy++23h+OOO67VbX/961/z5emnnw5XXnlluPPOO8N+++3XpY59DLZcfPHFoVQqNd83bdq0fBk3bly45557wqWXXlpWWTNnzgzHHHNMePjhh5fY9uGHH+bL/fffnweLYgBjjTXWSPpcAACAjiNwAQAAicyfPz/POthmm23yC+abb755GDBgQL4tXkgfP358eOyxx8Ls2bPzjIDnnnsubLfddouV8atf/SovJ2YRxEDHmmuumd/3ZbHscuy5557hgQceCE8++WT4+c9/nt931lln5fevSNdcc00YOXJk8/9jRsrQoUNDnz59wttvvx1uvvnmcO+99y4W1GhLPH677rpreOutt/L/x8yWww47LM+6iNkt77//fvjNb34T/vjHP+YZGXvttVd44YUX8mwMAACg+AQuAAAgkd133z0fKurrX/96q9vPOeecPHhx0EEH5cGJ888/P/9/S3vvvXd+O3z48Py2Z8+eYdiwYctcpw033DBfYoZCkxgsWZ4y2ysGEn784x/n61VVVWHs2LHh0EMPXeLY7L///nmWxFc57bTTmoMWMYvjwgsvzMttKR7buFx11VXhjTfeyIfoigsAAFB85rgAAIBEvvnNb7YZtGgSf/1/9tln5+sTJkwIH330Uac//tddd11YuHBhvv7DH/5wiaBF1Ldv33DXXXflGRhLE7MoYuAjOumkk8JFF120RNAiqqysDKNGjcozM5rqUFdXl+gZAQAAHUngAgAAVrDddtuteT0OYdTZNWVRxGBCDFy0ZZ111glHH330Usu67bbbmtdjRsVXOfbYY/PbWbNm5RODAwAAxWeoKAAASOyZZ57J51h46aWX8mGS5syZE+rr61vdN8590Zl99tlnYcqUKc3zcqy77rpL3f873/lO+MUvftHm9jhnRRTnq4jDRTUNGdWWlhktcd849wgAAFBsAhcAAJDI3Llz84yB3/72t2U/Jk403ZlNmzatef2rhtEqZ5/Jkyfnt3HoqTjBd3t8/vnn7dofAABYOQQuAAAgkcMPPzz87ne/y9d79eoV9ttvv7DtttvmWQZxku3q6r99/X7zzTfDT37yk3y9sbGx0wdzmsRj8FXicVualpOMt9eiRYuW+bEAAMCKI3ABAAAJPPvss81Bi6233jo8/vjjYeDAga3uW1NT06mO+dKCL717925enz9//leWNW/evKVuj+XF4MWAAQPCjBkz2llTAABgVWBybgAASCAGKppceumlbQYtokmTJhX+mHfr1q3sTIXp06e3ua3lnBbvvvvuV/7dr9pn/fXXz29j8KJlNgcAANB5CFwAAEACn3zySdnzNDz66KNfWV5l5d++qmdZlqB2/7+8cstcbbXVWp3gujXPPfdcm9vWWmutMGjQoHz9z3/+82JzXrRmwoQJS93+T//0T/ltqVQK48aNW+q+AADAqkngAgAAEmg5N8PSsgaef/75sgIXTUMsfdXQSeVqOWRTOWV+85vfbF4fP358m/u98847zUNktaVpEu0YbPiv//qvNvf79NNPwx133LHUso499tjm9f/4j//IJ+kGAAA6F4ELAABIYIcddmheHzlyZKsX1P/4xz+GQw89tKyMh4033ji/jfM4TJ06dbnr11Re9Oqrr37l/t/97nebJxO//vrrWw3GxEyMQw45JDQ0NCy1rB/84Aehe/fu+frVV18dHnjggSX2mTNnTj65+ezZs5da1o477hgOO+yw5uN50EEHhb/+9a9t7h+PdZx/5Nxzz11quQAAQHGYnBsAABI4+OCDw4YbbpgHGSZOnBg222yzcPLJJ+fDRsVJqf/3f/83jB07NtTX14fjjjsu3HbbbUstb6+99goPPfRQc8bC97///bDeeus1D/kUy/2qIalaihOGr7322nlWw5gxY8Iaa6wRdt5559CzZ8/mffbdd9/m9ThHR8xuuPnmm8OsWbPygMHpp58eBg8eHOrq6sLLL7+cP4f43GLA4a677mrzb3/ta1/L5/04++yz8yBHPFZxGTp0aOjTp094++2387/zwQcf5Pfff//9S30uN910U/jLX/4S3njjjXxukTgUVQygxOez5ppr5sc4Ps8Y2IjZIh9++GHYZJNNwqhRo8o+XgAAwMpTkaUaNBcAADq5yZMnN2cuxODDrbfeutj2V155Jb/439Zk1VVVVeFnP/tZ2GmnncKQIUPy+y666KIwYsSIJfaNwzl961vfyueFaM2XHxcv3k+ZMiVstNFGeT3buuAfgylt+fKpQQxY7LPPPuHFF19sdf8ePXqEG2+8MTQ2NoYTTjghv++WW24Jxx9/fJt1vvjii9vMOImZFPH4bLrppm0e4yZxYu4zzjgjD8KUc0oT58Z46qmnvnI/AABg5TNUFAAAJLL99tvnv/I/55xz8oyLODxSnFsiXog/7bTTwksvvRR+9KMflT1nxgsvvBB++tOf5gGMfv36LTbB9rI46aSTwhNPPJFnJ8TskKbhm9oS/2bMFLn22mvzYEvfvn3zx8TshRg0eO2118IxxxxT9t+PQ2jFibyPPPLIPHuktrY2rLPOOnlwJGaj3H333aGmpqassuJxvf3228Obb74ZzjvvvDwjJGZbxOGtYhZJDODsvffeeXAnBl4ELQAAYNUh4wIAAAAAACgMGRcAAAAAAEBhCFwAAAAAAACFIXABAAAAAAAUhsAFAAAAAABQGAIXAAAAAABAYQhcAAAAAAAAhSFwAQAAAAAAFIbABQAAAAAAUBgCFwAAAAAAQGEIXAAAAAAAAIUhcAEAAAAAABSGwAUAAAAAAFAYAhcAAAAAAEBhCFwAAAAAAAChKP4fBoRjG6OX4pQAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "display(fig)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "18ad941f-537f-49ae-a500-5c499058d324", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.13.1" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/driver/check/.ipynb_checkpoints/input_check-checkpoint.ipynb b/driver/check/.ipynb_checkpoints/input_check-checkpoint.ipynb deleted file mode 100644 index ecc4f0b59d..0000000000 --- a/driver/check/.ipynb_checkpoints/input_check-checkpoint.ipynb +++ /dev/null @@ -1,402 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "2ad48f61-e598-4a15-89f8-a0483fe2c9fe", - "metadata": {}, - "outputs": [], - "source": [ - "import xarray\n", - "import pygmt\n", - "import pandas\n", - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "dc10108f-956d-47bf-a02c-f42282da2ef1", - "metadata": {}, - "outputs": [], - "source": [ - "ds = xarray.open_dataset(\"../data/inputs/UKMO/cosp_input.um_global.nc\", decode_timedelta=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "02b11a5e-09bc-4ce9-9424-70dc5f125412", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "xarray.Dataset {\n", - "dimensions:\n", - "\tlat = 36 ;\n", - "\tlon = 48 ;\n", - "\tlevel = 54 ;\n", - "\tbnds = 2 ;\n", - "\thydro = 9 ;\n", - "\n", - "variables:\n", - "\tint32 landmask(lat, lon) ;\n", - "\t\tlandmask:standard_name = land_binary_mask ;\n", - "\t\tlandmask:units = 1 ;\n", - "\t\tlandmask:um_stash_source = m01s00i030 ;\n", - "\t\tlandmask:source = Data from Met Office Unified Model ;\n", - "\t\tlandmask:um_version = 11.6 ;\n", - "\t\tlandmask:grid_mapping = latitude_longitude ;\n", - "\tint32 latitude_longitude() ;\n", - "\t\tlatitude_longitude:grid_mapping_name = latitude_longitude ;\n", - "\t\tlatitude_longitude:longitude_of_prime_meridian = 0.0 ;\n", - "\t\tlatitude_longitude:earth_radius = 6371229.0 ;\n", - "\tfloat64 cca(level, lat, lon) ;\n", - "\t\tcca:um_stash_source = m01s02i317 ;\n", - "\t\tcca:source = Data from Met Office Unified Model ;\n", - "\t\tcca:um_version = 11.6 ;\n", - "\t\tcca:grid_mapping = latitude_longitude ;\n", - "\tfloat64 level_height_bnds(level, bnds) ;\n", - "\tfloat64 sigma_bnds(level, bnds) ;\n", - "\tfloat64 dem_s(level, lat, lon) ;\n", - "\t\tdem_s:standard_name = stratiform_cloud_longwave_emissivity ;\n", - "\t\tdem_s:units = 1 ;\n", - "\t\tdem_s:um_stash_source = m01s02i376 ;\n", - "\t\tdem_s:source = Data from Met Office Unified Model ;\n", - "\t\tdem_s:um_version = 11.6 ;\n", - "\t\tdem_s:grid_mapping = latitude_longitude ;\n", - "\tfloat64 dem_c(level, lat, lon) ;\n", - "\t\tdem_c:standard_name = convective_cloud_longwave_emissivity ;\n", - "\t\tdem_c:units = 1 ;\n", - "\t\tdem_c:um_stash_source = m01s02i378 ;\n", - "\t\tdem_c:source = Data from Met Office Unified Model ;\n", - "\t\tdem_c:um_version = 11.6 ;\n", - "\t\tdem_c:grid_mapping = latitude_longitude ;\n", - "\tfloat64 dtau_s(level, lat, lon) ;\n", - "\t\tdtau_s:standard_name = atmosphere_optical_thickness_due_to_stratiform_cloud ;\n", - "\t\tdtau_s:units = 1 ;\n", - "\t\tdtau_s:um_stash_source = m01s02i375 ;\n", - "\t\tdtau_s:source = Data from Met Office Unified Model ;\n", - "\t\tdtau_s:um_version = 11.6 ;\n", - "\t\tdtau_s:grid_mapping = latitude_longitude ;\n", - "\tfloat64 dtau_c(level, lat, lon) ;\n", - "\t\tdtau_c:standard_name = atmosphere_optical_thickness_due_to_convective_cloud ;\n", - "\t\tdtau_c:units = 1 ;\n", - "\t\tdtau_c:um_stash_source = m01s02i377 ;\n", - "\t\tdtau_c:source = Data from Met Office Unified Model ;\n", - "\t\tdtau_c:um_version = 11.6 ;\n", - "\t\tdtau_c:grid_mapping = latitude_longitude ;\n", - "\tfloat64 fl_lsrain(level, lat, lon) ;\n", - "\t\tfl_lsrain:um_stash_source = m01s02i390 ;\n", - "\t\tfl_lsrain:source = Data from Met Office Unified Model ;\n", - "\t\tfl_lsrain:um_version = 11.6 ;\n", - "\t\tfl_lsrain:grid_mapping = latitude_longitude ;\n", - "\tfloat64 fl_lssnow(level, lat, lon) ;\n", - "\t\tfl_lssnow:standard_name = large_scale_snowfall_flux ;\n", - "\t\tfl_lssnow:units = kg m-2 s-1 ;\n", - "\t\tfl_lssnow:um_stash_source = m01s04i223 ;\n", - "\t\tfl_lssnow:source = Data from Met Office Unified Model ;\n", - "\t\tfl_lssnow:um_version = 11.6 ;\n", - "\t\tfl_lssnow:grid_mapping = latitude_longitude ;\n", - "\tfloat64 fl_ccrain(level, lat, lon) ;\n", - "\t\tfl_ccrain:um_stash_source = m01s02i389 ;\n", - "\t\tfl_ccrain:source = Data from Met Office Unified Model ;\n", - "\t\tfl_ccrain:um_version = 11.6 ;\n", - "\t\tfl_ccrain:grid_mapping = latitude_longitude ;\n", - "\tfloat64 height(level, lat, lon) ;\n", - "\t\theight:standard_name = height_above_reference_ellipsoid ;\n", - "\t\theight:units = m ;\n", - "\t\theight:um_stash_source = m01s15i101 ;\n", - "\t\theight:source = Data from Met Office Unified Model ;\n", - "\t\theight:um_version = 11.6 ;\n", - "\t\theight:grid_mapping = latitude_longitude ;\n", - "\tfloat64 height_half(level, lat, lon) ;\n", - "\t\theight_half:standard_name = height_above_reference_ellipsoid ;\n", - "\t\theight_half:units = m ;\n", - "\t\theight_half:um_stash_source = m01s15i102 ;\n", - "\t\theight_half:source = Data from Met Office Unified Model ;\n", - "\t\theight_half:um_version = 11.6 ;\n", - "\t\theight_half:grid_mapping = latitude_longitude ;\n", - "\tfloat64 level_height_0_bnds(level, bnds) ;\n", - "\tfloat64 sigma_0_bnds(level, bnds) ;\n", - "\tfloat64 mr_ccice(level, lat, lon) ;\n", - "\t\tmr_ccice:um_stash_source = m01s02i319 ;\n", - "\t\tmr_ccice:source = Data from Met Office Unified Model ;\n", - "\t\tmr_ccice:um_version = 11.6 ;\n", - "\t\tmr_ccice:grid_mapping = latitude_longitude ;\n", - "\tfloat64 mr_ccliq(level, lat, lon) ;\n", - "\t\tmr_ccliq:um_stash_source = m01s02i318 ;\n", - "\t\tmr_ccliq:source = Data from Met Office Unified Model ;\n", - "\t\tmr_ccliq:um_version = 11.6 ;\n", - "\t\tmr_ccliq:grid_mapping = latitude_longitude ;\n", - "\tfloat64 mr_lsice(level, lat, lon) ;\n", - "\t\tmr_lsice:units = 1 ;\n", - "\t\tmr_lsice:grid_mapping = latitude_longitude ;\n", - "\tfloat64 mr_lsliq(level, lat, lon) ;\n", - "\t\tmr_lsliq:units = 1 ;\n", - "\t\tmr_lsliq:grid_mapping = latitude_longitude ;\n", - "\tfloat64 mr_ozone(level, lat, lon) ;\n", - "\t\tmr_ozone:standard_name = mass_fraction_of_ozone_in_air ;\n", - "\t\tmr_ozone:units = 1 ;\n", - "\t\tmr_ozone:um_stash_source = m01s02i260 ;\n", - "\t\tmr_ozone:source = Data from Met Office Unified Model ;\n", - "\t\tmr_ozone:um_version = 11.6 ;\n", - "\t\tmr_ozone:grid_mapping = latitude_longitude ;\n", - "\tfloat64 pfull(level, lat, lon) ;\n", - "\t\tpfull:standard_name = air_pressure ;\n", - "\t\tpfull:units = Pa ;\n", - "\t\tpfull:um_stash_source = m01s00i408 ;\n", - "\t\tpfull:source = Data from Met Office Unified Model ;\n", - "\t\tpfull:um_version = 11.6 ;\n", - "\t\tpfull:grid_mapping = latitude_longitude ;\n", - "\tfloat64 phalf(level, lat, lon) ;\n", - "\t\tphalf:standard_name = air_pressure ;\n", - "\t\tphalf:units = Pa ;\n", - "\t\tphalf:um_stash_source = m01s00i407 ;\n", - "\t\tphalf:source = Data from Met Office Unified Model ;\n", - "\t\tphalf:um_version = 11.6 ;\n", - "\t\tphalf:grid_mapping = latitude_longitude ;\n", - "\tfloat64 psfc(lat, lon) ;\n", - "\t\tpsfc:standard_name = surface_air_pressure ;\n", - "\t\tpsfc:units = Pa ;\n", - "\t\tpsfc:um_stash_source = m01s00i409 ;\n", - "\t\tpsfc:source = Data from Met Office Unified Model ;\n", - "\t\tpsfc:um_version = 11.6 ;\n", - "\t\tpsfc:grid_mapping = latitude_longitude ;\n", - "\tfloat64 qv(level, lat, lon) ;\n", - "\t\tqv:standard_name = specific_humidity ;\n", - "\t\tqv:units = kg kg-1 ;\n", - "\t\tqv:um_stash_source = m01s00i010 ;\n", - "\t\tqv:source = Data from Met Office Unified Model ;\n", - "\t\tqv:um_version = 11.6 ;\n", - "\t\tqv:grid_mapping = latitude_longitude ;\n", - "\tfloat64 Reff(hydro, level, lat, lon) ;\n", - "\t\tReff:long_name = effective_radius_of_hydrometeor ;\n", - "\t\tReff:units = m ;\n", - "\t\tReff:grid_mapping = latitude_longitude ;\n", - "\tfloat64 rh(level, lat, lon) ;\n", - "\t\trh:standard_name = relative_humidity ;\n", - "\t\trh:units = % ;\n", - "\t\trh:um_stash_source = m01s30i113 ;\n", - "\t\trh:source = Data from Met Office Unified Model ;\n", - "\t\trh:um_version = 11.6 ;\n", - "\t\trh:grid_mapping = latitude_longitude ;\n", - "\tfloat64 skt(lat, lon) ;\n", - "\t\tskt:standard_name = surface_temperature ;\n", - "\t\tskt:units = K ;\n", - "\t\tskt:um_stash_source = m01s00i024 ;\n", - "\t\tskt:source = Data from Met Office Unified Model ;\n", - "\t\tskt:um_version = 11.6 ;\n", - "\t\tskt:grid_mapping = latitude_longitude ;\n", - "\tfloat64 sunlit(lat, lon) ;\n", - "\t\tsunlit:um_stash_source = m01s02i330 ;\n", - "\t\tsunlit:source = Data from Met Office Unified Model ;\n", - "\t\tsunlit:um_version = 11.6 ;\n", - "\t\tsunlit:grid_mapping = latitude_longitude ;\n", - "\tfloat64 T_abs(level, lat, lon) ;\n", - "\t\tT_abs:standard_name = air_temperature ;\n", - "\t\tT_abs:units = K ;\n", - "\t\tT_abs:um_stash_source = m01s30i111 ;\n", - "\t\tT_abs:source = Data from Met Office Unified Model ;\n", - "\t\tT_abs:um_version = 11.6 ;\n", - "\t\tT_abs:grid_mapping = latitude_longitude ;\n", - "\tfloat64 tca(level, lat, lon) ;\n", - "\t\ttca:units = 1 ;\n", - "\t\ttca:grid_mapping = latitude_longitude ;\n", - "\tfloat64 u_wind(lat, lon) ;\n", - "\t\tu_wind:um_stash_source = m01s30i001 ;\n", - "\t\tu_wind:source = Data from Met Office Unified Model ;\n", - "\t\tu_wind:um_version = 11.6 ;\n", - "\t\tu_wind:grid_mapping = latitude_longitude ;\n", - "\tfloat64 level_height_1_bnds(bnds) ;\n", - "\tfloat64 sigma_1_bnds(bnds) ;\n", - "\tfloat64 v_wind(lat, lon) ;\n", - "\t\tv_wind:um_stash_source = m01s30i002 ;\n", - "\t\tv_wind:source = Data from Met Office Unified Model ;\n", - "\t\tv_wind:um_version = 11.6 ;\n", - "\t\tv_wind:grid_mapping = latitude_longitude ;\n", - "\tfloat64 emsfc_lw() ;\n", - "\t\temsfc_lw:long_name = Surface emissivity at 10.5 micron (fraction) ;\n", - "\t\temsfc_lw:units = 1 ;\n", - "\tfloat32 lat(lat) ;\n", - "\t\tlat:units = degrees ;\n", - "\t\tlat:long_name = lat ;\n", - "\tfloat32 lon(lon) ;\n", - "\t\tlon:units = degrees ;\n", - "\t\tlon:long_name = lon ;\n", - "\tfloat64 forecast_period() ;\n", - "\t\tforecast_period:units = hours ;\n", - "\t\tforecast_period:standard_name = forecast_period ;\n", - "\tobject forecast_reference_time() ;\n", - "\t\tforecast_reference_time:standard_name = forecast_reference_time ;\n", - "\tobject time() ;\n", - "\t\ttime:standard_name = time ;\n", - "\tint32 level(level) ;\n", - "\t\tlevel:axis = Z ;\n", - "\t\tlevel:units = 1 ;\n", - "\t\tlevel:long_name = level ;\n", - "\t\tlevel:positive = up ;\n", - "\tfloat64 level_height(level) ;\n", - "\t\tlevel_height:bounds = level_height_bnds ;\n", - "\t\tlevel_height:units = m ;\n", - "\t\tlevel_height:long_name = level_height ;\n", - "\t\tlevel_height:positive = up ;\n", - "\t\tlevel_height:standard_name = atmosphere_hybrid_height_coordinate ;\n", - "\t\tlevel_height:axis = Z ;\n", - "\t\tlevel_height:formula_terms = a: level_height b: sigma orog: surface_altitude ;\n", - "\tfloat64 sigma(level) ;\n", - "\t\tsigma:bounds = sigma_bnds ;\n", - "\t\tsigma:units = 1 ;\n", - "\t\tsigma:long_name = sigma ;\n", - "\tfloat64 surface_altitude(lat, lon) ;\n", - "\t\tsurface_altitude:units = m ;\n", - "\t\tsurface_altitude:standard_name = surface_altitude ;\n", - "\t\tsurface_altitude:um_stash_source = m01s00i033 ;\n", - "\t\tsurface_altitude:source = Data from Met Office Unified Model ;\n", - "\t\tsurface_altitude:um_version = 11.6 ;\n", - "\tfloat64 level_height_0(level) ;\n", - "\t\tlevel_height_0:bounds = level_height_0_bnds ;\n", - "\t\tlevel_height_0:units = m ;\n", - "\t\tlevel_height_0:long_name = level_height ;\n", - "\t\tlevel_height_0:positive = up ;\n", - "\t\tlevel_height_0:standard_name = atmosphere_hybrid_height_coordinate ;\n", - "\t\tlevel_height_0:axis = Z ;\n", - "\t\tlevel_height_0:formula_terms = a: level_height_0 b: sigma_0 orog: surface_altitude ;\n", - "\tfloat64 sigma_0(level) ;\n", - "\t\tsigma_0:bounds = sigma_0_bnds ;\n", - "\t\tsigma_0:units = 1 ;\n", - "\t\tsigma_0:long_name = sigma ;\n", - "\tint32 hydro(hydro) ;\n", - "\t\thydro:units = 1 ;\n", - "\t\thydro:long_name = hydrometeor_index ;\n", - "\tint32 level_0() ;\n", - "\t\tlevel_0:units = 1 ;\n", - "\t\tlevel_0:long_name = level ;\n", - "\t\tlevel_0:positive = up ;\n", - "\tfloat64 level_height_1() ;\n", - "\t\tlevel_height_1:bounds = level_height_1_bnds ;\n", - "\t\tlevel_height_1:units = m ;\n", - "\t\tlevel_height_1:long_name = level_height ;\n", - "\t\tlevel_height_1:positive = up ;\n", - "\t\tlevel_height_1:standard_name = atmosphere_hybrid_height_coordinate ;\n", - "\t\tlevel_height_1:axis = Z ;\n", - "\t\tlevel_height_1:formula_terms = a: level_height_1 b: sigma_1 orog: surface_altitude ;\n", - "\tfloat64 sigma_1() ;\n", - "\t\tsigma_1:bounds = sigma_1_bnds ;\n", - "\t\tsigma_1:units = 1 ;\n", - "\t\tsigma_1:long_name = sigma ;\n", - "\n", - "// global attributes:\n", - "\t:Conventions = CF-1.5 ;\n", - "}" - ] - } - ], - "source": [ - "ds.info()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "3bab77fc-adea-4019-aa7f-2f644f1c0fe1", - "metadata": {}, - "outputs": [], - "source": [ - "Re = ds[\"Reff\"].values" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "f59cc93c-1af3-4d7a-8975-916deb11111e", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(9, 54, 36, 48)\n" - ] - } - ], - "source": [ - "print(Re.shape)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "79232327-c8ef-47b1-9187-2e25040becd6", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ 2555.67200062, 2579.45250599, 2612.77552208, 2655.67127004,\n", - " 2708.17875217, 2770.34556388, 2842.2278931 , 2923.89076484,\n", - " 3015.40755162, 3116.86064765, 3228.34110315, 3349.9476308 ,\n", - " 3481.78939363, 3623.98259556, 3776.65271298, 3939.93387565,\n", - " 4113.96950232, 4298.91040074, 4494.91666141, 4702.15767454,\n", - " 4920.81019898, 5151.06028593, 5393.10329876, 5647.1419457 ,\n", - " 5913.38757075, 6192.06284309, 6483.39507758, 6787.62359741,\n", - " 7104.9943558 , 7435.76263219, 7780.19305938, 8138.55753557,\n", - " 8511.13730095, 8898.22368594, 9300.11745156, 9717.11858314,\n", - " 10149.55686776, 10597.74965445, 11062.05278729, 11542.81645459,\n", - " 12040.41520099, 12555.24096946, 13087.7113953 , 13638.27861956,\n", - " 14207.42265373, 14795.69285374, 15403.65395338, 16031.99387819,\n", - " 16681.44646124, 17352.87798226, 18046.2905 , 18756.7035 ,\n", - " 19483.887 , 20228.776 ])" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "zlev=ds[\"height\"].values\n", - "zlev[:,1,1]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a9b7fe64-2571-40d8-b91e-81d0850cfe25", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b8f57645-805a-421b-97db-73a413e636f2", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.13.1" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/driver/src/cosp2_io.f90.bak b/driver/src/cosp2_io.f90.bak deleted file mode 100644 index 2948dc2629..0000000000 --- a/driver/src/cosp2_io.f90.bak +++ /dev/null @@ -1,2762 +0,0 @@ -module mod_cosp_io - use cosp_kinds, only: wp - use mod_cosp, only: cosp_outputs - use netcdf - USE MOD_COSP_CONFIG, ONLY: Nlvgrid, LIDAR_NCAT, SR_BINS, PARASOL_NREFL, cloudsat_DBZE_BINS, & - numMODISReffIceBins, numMODISReffLiqBins, ntau, tau_binBounds, tau_binCenters, & - tau_binEdges,npres, pres_binBounds, pres_binCenters, pres_binEdges, nhgt, & - hgt_binBounds, hgt_binCenters, hgt_binEdges, vgrid_z, & - reffICE_binCenters, reffLIQ_binCenters, cloudsat_binCenters, PARASOL_SZA, & - calipso_binCenters, grLidar532_binCenters, atlid_binCenters, & - CFODD_NDBZE, CFODD_HISTDBZE, CFODD_HISTDBZEcenters, & - CFODD_NICOD, CFODD_HISTICOD, CFODD_HISTICODcenters - implicit none - -contains - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE write_cosp2_output - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - subroutine write_cosp2_output(Npoints, Ncolumns, Nlevels, Ninst_rttov, lev, lon, lat, cospOUT, outFileName) - integer,intent(in) :: Npoints, Ncolumns, Nlevels, Ninst_rttov - real(wp),dimension(Npoints),intent(in) :: lon,lat - real(wp),dimension(Nlevels),intent(in) :: lev - type(cosp_outputs),intent(in) :: cospOUT - character(len=256),intent(in) :: outFileName - - integer :: fileID,status,ij,i,ii - integer,dimension(50) :: dimID - integer,dimension(250) :: varID - integer,dimension(Npoints) :: loc - integer,dimension(Ncolumns) :: cosp_scol - integer,dimension(2) :: bnds - character(len=8) :: & - fmt, & ! format descriptor for flexible RTTOV output - i_str - - loc=(/(ij,ij=1,Npoints)/) - cosp_scol=(/(ij,ij=1,Ncolumns)/) - bnds=(/(ij,ij=1,2)/) - fmt = '(I3.3)' ! an integer of width 3 with zeros at the left - - ! --------------------------------------------------------------------------------------- - ! Create output file. - ! --------------------------------------------------------------------------------------- - status = nf90_create(path=trim(outFileName),cmode = nf90_clobber,ncid=fileID) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - ! --------------------------------------------------------------------------------------- - ! Define GLOBAL attributes. - ! --------------------------------------------------------------------------------------- - status = nf90_put_att(fileID,NF90_GLOBAL,"Conventions","CF-1.6") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - ! --------------------------------------------------------------------------------------- - ! Define dimensions. - ! --------------------------------------------------------------------------------------- - status = nf90_def_dim(fileID,"loc",Npoints,dimID(1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"cosp_scol",Ncolumns,dimID(2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"lev",Nlevels,dimID(3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"levStat",Nlvgrid,dimID(4)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"tau7",ntau,dimID(5)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"bnds",2,dimID(6)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"pres7",npres,dimID(7)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"hgt16",nhgt,dimID(8)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"SR_BINS",SR_BINS,dimID(12)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"PARASOL_NREFL",PARASOL_NREFL,dimID(13)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"cloudsat_DBZE_BINS",cloudsat_DBZE_BINS,dimID(14)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"RELIQ_MODIS",numMODISReffLiqBins,dimID(15)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"REICE_MODIS",numMODISReffIceBins,dimID(16)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"CFODD_NDBZE",CFODD_NDBZE,dimID(17)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_dim(fileID,"CFODD_NICOD",CFODD_NICOD,dimID(18)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - ! Define instrument channel indices for multiple RTTOV instruments - if (allocated(cospOUT%rttov_outputs)) then - do i=1,Ninst_rttov - write (i_str,fmt) i ! converting integer to string i_str using a 'internal file' - status = nf90_def_dim(fileID,"RTTOV_CHAN_INST"//trim(i_str),cospOUT % rttov_outputs(i) % nchan_out,dimID(20+i)) ! Start at 100 for RTTOV output channel dimensions - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - end do - end if - - ! --------------------------------------------------------------------------------------- - ! Define variables - ! --------------------------------------------------------------------------------------- - ! Longitude - status = nf90_def_var(fileID,"longitude", nf90_float, (/dimID(1)/),varID(1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(1),"long_name","longitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(1),"units", "degrees_east") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(1),"standard_name", "longitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Latitude - status = nf90_def_var(fileID,"latitude", nf90_float, (/dimID(1)/),varID(2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(2),"long_name","latitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(2),"units", "degrees_north") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(2),"standard_name", "latitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Joint-histogram axis - ! Tau - status = nf90_def_var(fileID,"tau7", nf90_float, (/dimID(5)/),varID(3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(3),"long_name","cloud_optical_depth_bin_centers") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(3),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(3),"standard_name", "atmosphere_optical_thickness_due_to_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Tau edges - status = nf90_def_var(fileID,"tau7_bnds", nf90_float, (/dimID(6),dimID(5)/),varID(4)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(4),"long_name","cloud_optical_depth_bin_edges") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(4),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(4),"standard_name", "atmosphere_optical_thickness_due_to_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Pressure - status = nf90_def_var(fileID,"pres7", nf90_float, (/dimID(7)/),varID(5)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(5),"long_name","air_pressure_bin_centers") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(5),"units", "Pa") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(5),"standard_name", "air_pressure") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Pressure Edges - status = nf90_def_var(fileID,"pres7_bnds", nf90_float, (/dimID(6),dimID(7)/),varID(6)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(6),"long_name","air_pressure_bin_edges") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(6),"units", "Pa") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(6),"standard_name", "air_pressure") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Height - status = nf90_def_var(fileID,"hgt16", nf90_float, (/dimID(8)/),varID(7)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(7),"long_name","altitude_bin_centers") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(7),"units", "m") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(7),"standard_name", "altitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Height Edges - status = nf90_def_var(fileID,"hgt16_bnds", nf90_float, (/dimID(6),dimID(8)/),varID(8)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(8),"long_name","altitude_bin_edges") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(8),"units", "m") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(8),"standard_name", "altitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Levels - status = nf90_def_var(fileID,"lev", nf90_float, (/dimID(3)/),varID(84)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(84),"long_name","level indices") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(84),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Levels for statistical diagnostics (lidar and radar) - status = nf90_def_var(fileID,"levStat", nf90_float, (/dimID(4)/),varID(85)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(85),"long_name","level indices") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(85),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - ! Subcolumms - status = nf90_def_var(fileID,"cosp_scol", nf90_float, (/dimID(2)/),varID(86)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(86),"long_name","subcolumn indices") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(86),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Bnds - status = nf90_def_var(fileID,"bnds", nf90_float, (/dimID(6)/),varID(82)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(82),"long_name","bounds") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(82),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! loc - status = nf90_def_var(fileID,"loc", nf90_float, (/dimID(1)/),varID(83)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(83),"long_name","loc") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(83),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - ! CALIPSO simulator output - if (associated(cospOUT%calipso_betaperp_tot)) then - status = nf90_def_var(fileID,"atb532_perp",nf90_float, (/dimID(1),dimID(2),dimID(3)/),varID(9)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(9),"long_name","CALIPSO Attenuated Total Perpendicular Backscatter (532nm)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(9),"units", "m-1 sr-1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(9),"standard_name", "volume_attenuated_backwards_scattering_function_in_air") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_beta_tot)) then - status = nf90_def_var(fileID,"atb532",nf90_float, (/dimID(1),dimID(2),dimID(3)/),varID(10)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(10),"long_name","CALIPSO Attenuated Total Backscatter (532nm)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(10),"units", "m-1 sr-1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(10),"standard_name", "volume_attenuated_backwards_scattering_function_in_air") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_lidarcldphase)) then - ! Ice - status = nf90_def_var(fileID,"clcalipsoice",nf90_float, (/dimID(1),dimID(4)/),varID(58)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(58),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(58),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(58),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Liquid - status = nf90_def_var(fileID,"clcalipsoliq",nf90_float, (/dimID(1),dimID(4)/),varID(59)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(59),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(59),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(59),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Undefined - status = nf90_def_var(fileID,"clcalipsoun",nf90_float, (/dimID(1),dimID(4)/),varID(60)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(60),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(60),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(60),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cldlayerphase)) then - ! Ice - status = nf90_def_var(fileID,"cllcalipsoice",nf90_float, (/dimID(1)/),varID(61)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(61),"long_name","CALIPSO Ice Low Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(61),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(61),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"clmcalipsoice",nf90_float, (/dimID(1)/),varID(62)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(62),"long_name","CALIPSO Ice Mid Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(62),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(62),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"clhcalipsoice",nf90_float, (/dimID(1)/),varID(63)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(63),"long_name","CALIPSO Ice High Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(63),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(63),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"cltcalipsoice",nf90_float, (/dimID(1)/),varID(64)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(64),"long_name","CALIPSO Ice Total Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(64),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(64),"standard_name", "cloud_area_fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Liquid - status = nf90_def_var(fileID,"cllcalipsoliq",nf90_float, (/dimID(1)/),varID(65)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(65),"long_name","CALIPSO Liquid Low Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(65),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(65),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"clmcalipsoliq",nf90_float, (/dimID(1)/),varID(66)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(66),"long_name","CALIPSO Liquid Mid Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(66),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(66),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"clhcalipsoliq",nf90_float, (/dimID(1)/),varID(67)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(67),"long_name","CALIPSO Liquid High Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(67),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(67),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"cltcalipsoliq",nf90_float, (/dimID(1)/),varID(68)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(68),"long_name","CALIPSO Liquid Total Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(68),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(68),"standard_name", "cloud_area_fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Undetermined - status = nf90_def_var(fileID,"cllcalipsoun",nf90_float, (/dimID(1)/),varID(69)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(69),"long_name","CALIPSO Undefined-Phase Low Level Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(69),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(69),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"clmcalipsoun",nf90_float, (/dimID(1)/),varID(70)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(70),"long_name","CALIPSO Undefined-Phase Mid Level Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(70),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(70),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"clhcalipsoun",nf90_float, (/dimID(1)/),varID(71)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(71),"long_name","CALIPSO Undefined-Phase High Level Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(71),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(71),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"cltcalipsoun",nf90_float, (/dimID(1)/),varID(72)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(72),"long_name","CALIPSO Undefined-Phase Total Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(72),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(72),"standard_name", "cloud_area_fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_lidarcldtmp)) then - status = nf90_def_var(fileID,"clcalipsotmp",nf90_float, (/dimID(1),dimID(4)/),varID(77)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(77),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(77),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(77),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"clcalipsotmpice",nf90_float, (/dimID(1),dimID(4)/),varID(78)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(78),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(78),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(78),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"clcalipsotmpliq",nf90_float, (/dimID(1),dimID(4)/),varID(79)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(79),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(79),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(79),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"clcalipsotmpun",nf90_float, (/dimID(1),dimID(4)/),varID(80)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(80),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(80),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(80),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cfad_sr)) then - status = nf90_def_var(fileID,"cfadLidarsr532",nf90_float, (/dimID(1),dimID(12),dimID(4)/),varID(15)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(15),"long_name","CALIPSO Scattering Ratio CFAD") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(15),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(15),"standard_name", "histogram_of_backscattering_ratio_over_height_above_reference_ellipsoid") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_lidarcld)) then - status = nf90_def_var(fileID,"clcalipso",nf90_float, (/dimID(1),dimID(4)/),varID(16)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(16),"long_name","CALIPSO Cloud Area Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(16),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(16),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cldlayer)) then - ! Low-level - status = nf90_def_var(fileID,"cllcalipso",nf90_float, (/dimID(1)/),varID(73)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(73),"long_name","CALIPSO Low Level Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(73),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(73),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Mid-level - status = nf90_def_var(fileID,"clmcalipso",nf90_float, (/dimID(1)/),varID(74)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(74),"long_name","CALIPSO Mid Level Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(74),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(74),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! High-level - status = nf90_def_var(fileID,"clhcalipso",nf90_float, (/dimID(1)/),varID(75)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(75),"long_name","CALIPSO High Level Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(75),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(75),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Total - status = nf90_def_var(fileID,"cltcalipso",nf90_float, (/dimID(1)/),varID(76)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(76),"long_name","CALIPSO Total Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(76),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(76),"standard_name", "cloud_area_fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_beta_mol)) then - status = nf90_def_var(fileID,"lidarBetaMol532",nf90_float, (/dimID(1),dimID(3)/),varID(18)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(18),"long_name","CALIPSO Molecular Backscatter Coefficient (532nm)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(18),"units", "m-1 sr-1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(18),"standard_name", "volume_attenuated_backwards_scattering_function_in_air_assuming_no_aerosol_or_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_srbval) .or. associated(cospOUT%calipso_cfad_sr)) then - status = nf90_def_var(fileID,"SR_BINS",nf90_float, (/dimID(12)/),varID(81)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(81),"long_name","CALIPSO Backscattering Ratio (SR) Bin Centers") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(81),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(81),"standard_name", "backscattering_ratio") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"SR_EDGES",nf90_float, (/dimID(6),dimID(12)/),varID(19)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(19),"long_name","CALIPSO Backscattering Ratio (SR) Bin Bounds") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(19),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(19),"standard_name", "backscattering_ratio") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - !OPAQ diagnostics - if (associated(cospOUT%calipso_cldtype)) then - ! Opaque cloud cover - status = nf90_def_var(fileID,"clopaquecalipso",nf90_float, (/dimID(1)/),varID(91)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(91),"long_name","CALIPSO Opaque Cloud Cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(91),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(91),"standard_name", "opaque_cloud_cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Thin cloud cover - status = nf90_def_var(fileID,"clthincalipso",nf90_float, (/dimID(1)/),varID(92)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(92),"long_name","CALIPSO Thin Cloud Cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(92),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(92),"standard_name", "thin_cloud_cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! z_opaque altitude - status = nf90_def_var(fileID,"clzopaquecalipso",nf90_float, (/dimID(1)/),varID(93)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(93),"long_name","CALIPSO z_opaque Altitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(93),"units", "m") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(93),"standard_name", "z_opaque") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - !3D cloud fractions - if (associated(cospOUT%calipso_lidarcldtype)) then - ! Opaque profiles cloud fraction - status = nf90_def_var(fileID,"clcalipsoopaque",nf90_float, (/dimID(1),dimID(4)/),varID(94)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(94),"long_name","CALIPSO Opaque Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(94),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(94),"standard_name", "opaque_cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Non-Opaque profiles cloud fraction - status = nf90_def_var(fileID,"clcalipsothin",nf90_float, (/dimID(1),dimID(4)/),varID(95)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(95),"long_name","CALIPSO Thin Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(95),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(95),"standard_name", "thin_cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! z_opaque fraction - status = nf90_def_var(fileID,"clcalipsozopaque",nf90_float, (/dimID(1),dimID(4)/),varID(96)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(96),"long_name","CALIPSO z_opaque Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(96),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(96),"standard_name", "z_opaque_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Lidar opacity fraction - status = nf90_def_var(fileID,"clcalipsoopacity",nf90_float, (/dimID(1),dimID(4)/),varID(97)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(97),"long_name","CALIPSO opacity Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(97),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(97),"standard_name", "opacity_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cldtypetemp)) then - ! Opaque cloud temperature - status = nf90_def_var(fileID,"clopaquetemp",nf90_float, (/dimID(1)/),varID(98)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(98),"long_name","CALIPSO Opaque Cloud Temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(98),"units", "K") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(98),"standard_name", "opaque_cloud_temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Thin cloud temperature - status = nf90_def_var(fileID,"clthintemp",nf90_float, (/dimID(1)/),varID(99)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(99),"long_name","CALIPSO Thin Cloud Temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(99),"units", "K") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(99),"standard_name", "thin_cloud_temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! z_opaque temperature - status = nf90_def_var(fileID,"clzopaquetemp",nf90_float, (/dimID(1)/),varID(100)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(100),"long_name","CALIPSO z_opaque Temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(100),"units", "K") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(100),"standard_name", "z_opaque_temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cldtypemeanz)) then - ! Opaque cloud altitude - status = nf90_def_var(fileID,"clopaquemeanz",nf90_float, (/dimID(1)/),varID(101)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(101),"long_name","CALIPSO Opaque Cloud Altitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(101),"units", "m") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(101),"standard_name", "opaque_cloud_altitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Thin cloud altitude - status = nf90_def_var(fileID,"clthinmeanz",nf90_float, (/dimID(1)/),varID(102)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(102),"long_name","CALIPSO Thin Cloud Altitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(102),"units", "m") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(102),"standard_name", "thin_cloud_altitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cldthinemis)) then - ! Thin cloud emissivity - status = nf90_def_var(fileID,"clthinemis",nf90_float, (/dimID(1)/),varID(103)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(103),"long_name","CALIPSO Thin Cloud Emissivity") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(103),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(103),"standard_name", "thin_cloud_emissivity") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cldtypemeanzse)) then - ! Opaque cloud altitude with respect to Surface Elevation - status = nf90_def_var(fileID,"clopaquemeanzse",nf90_float, (/dimID(1)/),varID(104)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(104),"long_name","CALIPSO Opaque Cloud Altitude with respect to SE") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(104),"units", "m") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(104),"standard_name", "opaque_cloud_altitude_se") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Thin cloud altitude with respect to Surface Elevation - status = nf90_def_var(fileID,"clthinmeanzse",nf90_float, (/dimID(1)/),varID(105)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(105),"long_name","CALIPSO Thin Cloud Altitude with respect to SE") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(105),"units", "m") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(105),"standard_name", "thin_cloud_altitude_se") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! z_opaque altitude with respect to Surface Elevation - status = nf90_def_var(fileID,"clzopaquecalipsose",nf90_float, (/dimID(1)/),varID(106)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(106),"long_name","CALIPSO z_opaque Altitude with respect to SE") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(106),"units", "m") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(106),"standard_name", "z_opaque_se") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - !GROUND LIDAR simulator output - if (associated(cospOUT%grLidar532_cldlayer)) then - ! Low-level cloud cover - status = nf90_def_var(fileID,"cllgrLidar532",nf90_float, (/dimID(1)/),varID(107)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(107),"long_name","GROUND LIDAR Low Level Cloud Cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(107),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(107),"standard_name", "grLidar532_low_cloud_cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Mid-level cloud cover - status = nf90_def_var(fileID,"clmgrLidar532",nf90_float, (/dimID(1)/),varID(108)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(108),"long_name","GROUND LIDAR Mid Level Cloud Cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(108),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(108),"standard_name", "grLidar532_mid_cloud_cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! High-level cloud cover - status = nf90_def_var(fileID,"clhgrLidar532",nf90_float, (/dimID(1)/),varID(109)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(109),"long_name","GROUND LIDAR High Level Cloud Cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(109),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(109),"standard_name", "grLidar532_high_cloud_cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Total cloud cover - status = nf90_def_var(fileID,"cltgrLidar532",nf90_float, (/dimID(1)/),varID(110)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(110),"long_name","GROUND LIDAR Total Cloud Cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(110),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(110),"standard_name", "grLidar532_total_cloud_cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - !3D cloud fraction - if (associated(cospOUT%grLidar532_lidarcld)) then - status = nf90_def_var(fileID,"clgrLidar532",nf90_float, (/dimID(1),dimID(4)/),varID(111)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(111),"long_name","GROUND LIDAR Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(111),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(111),"standard_name", "grLidar532_cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - !Molecular backscatter - if (associated(cospOUT%grLidar532_beta_mol)) then - status = nf90_def_var(fileID,"lidarBetaMol532gr",nf90_float, (/dimID(1),dimID(3)/),varID(112)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(112),"long_name","GROUND LIDAR Molecular Backscatter Coefficient (532nm)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(112),"units", "m-1 sr-1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(112),"standard_name", "grLidar532_volume_attenuated_backwards_scattering_function_in_air_assuming_no_aerosol_or_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - !Height-Intensity histogram (SR) - if (associated(cospOUT%grLidar532_cfad_sr)) then - status = nf90_def_var(fileID,"cfadLidarsr532gr",nf90_float, (/dimID(1),dimID(12),dimID(4)/),varID(113)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(113),"long_name","GROUND LIDAR Scattering Ratio CFAD") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(113),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(113),"standard_name", "grLidar532_histogram_of_backscattering_ratio_over_height_above_reference_ellipsoid") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%grLidar532_beta_tot)) then - status = nf90_def_var(fileID,"atb532gr",nf90_float, (/dimID(1),dimID(2),dimID(3)/),varID(114)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(114),"long_name","GROUND LIDAR Attenuated Total Backscatter (532nm)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(114),"units", "m-1 sr-1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(114),"standard_name", "volume_attenuated_backwards_scattering_function_in_air") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - if (associated(cospOUT%grLidar532_srbval) .or. associated(cospOUT%grLidar532_cfad_sr)) then - status = nf90_def_var(fileID,"SR_BINS_GR",nf90_float, (/dimID(12)/),varID(115)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(115),"long_name","GROUND LIDAR Backscattering Ratio (SR) Bin Centers") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(115),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(115),"standard_name", "backscattering_ratio") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"SR_EDGES_GR",nf90_float, (/dimID(6),dimID(12)/),varID(116)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(116),"long_name","GROUND LIDAR Backscattering Ratio (SR) Bin Bounds") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(116),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(116),"standard_name", "backscattering_ratio") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - !ATLID simulator output - if (associated(cospOUT%atlid_cldlayer)) then - ! Low-level cloud cover - status = nf90_def_var(fileID,"cllatlid",nf90_float, (/dimID(1)/),varID(117)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(117),"long_name","ATLID Low Level Cloud Cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(117),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(117),"standard_name", "atlid_low_cloud_cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Mid-level cloud cover - status = nf90_def_var(fileID,"clmatlid",nf90_float, (/dimID(1)/),varID(118)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(118),"long_name","ATLID Mid Level Cloud Cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(118),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(118),"standard_name", "atlid_mid_cloud_cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! High-level cloud cover - status = nf90_def_var(fileID,"clhatlid",nf90_float, (/dimID(1)/),varID(119)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(119),"long_name","ATLID High Level Cloud Cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(119),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(119),"standard_name", "atlid_high_cloud_cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Total cloud cover - status = nf90_def_var(fileID,"cltatlid",nf90_float, (/dimID(1)/),varID(120)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(120),"long_name","ATLID Total Cloud Cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(120),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(120),"standard_name", "atlid_total_cloud_cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - !3D cloud fraction - if (associated(cospOUT%atlid_lidarcld)) then - status = nf90_def_var(fileID,"clatlid",nf90_float, (/dimID(1),dimID(4)/),varID(121)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(121),"long_name","ATLID Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(121),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(121),"standard_name", "atlid_cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - !Molecular backscatter - if (associated(cospOUT%atlid_beta_mol)) then - status = nf90_def_var(fileID,"lidarBetaMol355",nf90_float, (/dimID(1),dimID(3)/),varID(122)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(122),"long_name","ATLID Molecular Backscatter Coefficient (355nm)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(122),"units", "m-1 sr-1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(122),"standard_name", "atlid_volume_attenuated_backwards_scattering_function_in_air_assuming_no_aerosol_or_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - !Height-Intensity histogram (SR) - if (associated(cospOUT%atlid_cfad_sr)) then - status = nf90_def_var(fileID,"cfadLidarsr355",nf90_float, (/dimID(1),dimID(12),dimID(4)/),varID(123)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(123),"long_name","ATLID Scattering Ratio CFAD") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(123),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(123),"standard_name", "atlid_histogram_of_backscattering_ratio_over_height_above_reference_ellipsoid") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%atlid_beta_tot)) then - status = nf90_def_var(fileID,"atb355",nf90_float, (/dimID(1),dimID(2),dimID(3)/),varID(124)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(124),"long_name","ATLID Attenuated Total Backscatter (355nm)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(124),"units", "m-1 sr-1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(124),"standard_name", "volume_attenuated_backwards_scattering_function_in_air") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - if (associated(cospOUT%atlid_srbval) .or. associated(cospOUT%atlid_cfad_sr)) then - status = nf90_def_var(fileID,"SR_BINS_ATLID",nf90_float, (/dimID(12)/),varID(125)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(125),"long_name","ATLID Backscattering Ratio (SR) Bin Centers") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(125),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(125),"standard_name", "backscattering_ratio") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"SR_EDGES_ATLID",nf90_float, (/dimID(6),dimID(12)/),varID(126)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(126),"long_name","ATLID Backscattering Ratio (SR) Bin Bounds") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(126),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(126),"standard_name", "backscattering_ratio") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! PARASOL simulator output - if (associated(cospOUT%parasolPix_refl)) then - status = nf90_def_var(fileID,"parasolPix_refl",nf90_float, (/dimID(1),dimID(2),dimID(13)/),varID(20)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(20),"long_name","PARASOL Subcolumn Reflectance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(20),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(20),"standard_name", "toa_bidirectional_reflectance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%parasolGrid_refl)) then - status = nf90_def_var(fileID,"parasolGrid_refl",nf90_float, (/dimID(1),dimID(13)/),varID(21)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(21),"long_name","PARASOL Reflectance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(21),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(21),"standard_name", "toa_bidirectional_reflectance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%parasolPix_refl) .or.associated(cospOUT%parasolGrid_refl)) then - status = nf90_def_var(fileID,"PARASOL_NREFL",nf90_float, (/dimID(13)/),varID(87)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(87),"long_name","PARASOL Solar Zenith Angle") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(87),"units", "degree") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(87),"standard_name", "solar_zenith_angle") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! Cloudsat simulator output - if (associated(cospOUT%cloudsat_Ze_tot)) then - status = nf90_def_var(fileID,"dbze94",nf90_float, (/dimID(1),dimID(2),dimID(3)/),varID(22)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(22),"long_name","CloudSat Radar Reflectivity") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(22),"units", "dBZ") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(22),"standard_name", "equivalent_reflectivity_factor") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%cloudsat_cfad_ze)) then - status = nf90_def_var(fileID,"cfadDbze94",nf90_float, (/dimID(1),dimID(14),dimID(4)/),varID(23)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(23),"long_name","CloudSat Radar reflectivity CFAD") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(23),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(23),"standard_name", "histogram_of_equivalent_reflectivity_factor_over_height_above_reference_ellipsoid") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"cloudsat_DBZE_BINS",nf90_float, (/dimID(14)/),varID(88)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(88),"long_name","CloudSat simulator equivalent radar reflectivity factor") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(88),"units", "dBZ") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(88),"standard_name", "equivalent_reflectivity_factor") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%cloudsat_precip_cover)) then - status = nf90_def_var(fileID,"ptcloudsatflag0",nf90_float, (/dimID(1)/),varID(127)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(127),"long_name","Cloudsat precipitation cover for flag0") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(127),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"ptcloudsatflag1",nf90_float, (/dimID(1)/),varID(128)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(128),"long_name","Cloudsat precipitation cover for flag1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(128),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"ptcloudsatflag2",nf90_float, (/dimID(1)/),varID(129)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(129),"long_name","Cloudsat precipitation cover for flag2") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(129),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"ptcloudsatflag3",nf90_float, (/dimID(1)/),varID(130)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(130),"long_name","Cloudsat precipitation cover for flag3") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(130),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"ptcloudsatflag4",nf90_float, (/dimID(1)/),varID(131)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(131),"long_name","Cloudsat precipitation cover for flag4") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(131),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"ptcloudsatflag5",nf90_float, (/dimID(1)/),varID(132)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(132),"long_name","Cloudsat precipitation cover for flag5") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(132),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"ptcloudsatflag6",nf90_float, (/dimID(1)/),varID(133)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(133),"long_name","Cloudsat precipitation cover for flag6") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(133),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"ptcloudsatflag7",nf90_float, (/dimID(1)/),varID(134)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(134),"long_name","Cloudsat precipitation cover for flag7") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(134),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"ptcloudsatflag8",nf90_float, (/dimID(1)/),varID(135)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(135),"long_name","Cloudsat precipitation cover for flag8") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(135),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"ptcloudsatflag9",nf90_float, (/dimID(1)/),varID(136)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(136),"long_name","Cloudsat precipitation cover for flag9") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(136),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%cloudsat_pia)) then - status = nf90_def_var(fileID,"cloudsatpia",nf90_float, (/dimID(1)/),varID(137)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(137),"long_name","Cloudsat path integrated attenuation") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(137),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! ISCCP simulator outputs - if (associated(cospOUT%isccp_totalcldarea)) then - status = nf90_def_var(fileID,"cltisccp",nf90_float, (/dimID(1)/),varID(24)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(24),"long_name","ISCCP Total Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(24),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(24),"standard_name", "cloud_area_fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_meantb)) then - status = nf90_def_var(fileID,"meantbisccp",nf90_float, (/dimID(1)/),varID(25)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(25),"long_name","ISCCP all-sky 10.5 micron brightness temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(25),"units", "K") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(25),"standard_name", "toa_brightness_temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_meantbclr)) then - status = nf90_def_var(fileID,"meantbclrisccp",nf90_float, (/dimID(1)/),varID(26)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(26),"long_name","ISCCP clear-sky 10.5 micron brightness temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(26),"units", "K") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(26),"standard_name", "toa_brightness_temperature_assuming_clear_sky") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_meanptop)) then - status = nf90_def_var(fileID,"pctisccp",nf90_float, (/dimID(1)/),varID(27)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(27),"long_name","ISCCP Mean Cloud Top Pressure") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(27),"units", "hPa") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(27),"standard_name", "air_pressure_at_cloud_top") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_meantaucld)) then - status = nf90_def_var(fileID,"tauisccp",nf90_float, (/dimID(1)/),varID(28)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(28),"long_name","ISCCP Mean Optical Depth") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(28),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(28),"standard_name", "atmosphere_optical_thickness_due_to_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_meanalbedocld)) then - status = nf90_def_var(fileID,"albisccp",nf90_float, (/dimID(1)/),varID(29)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(29),"long_name","ISCCP Mean Cloud Albedo") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(29),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(29),"standard_name", "cloud_albedo") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_boxtau)) then - status = nf90_def_var(fileID,"boxtauisccp",nf90_float, (/dimID(1),dimID(2)/),varID(30)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(30),"long_name","ISCCP Subcolumn Optical Depth") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(30),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(30),"standard_name", "atmosphere_optical_thickness_due_to_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_boxptop)) then - status = nf90_def_var(fileID,"boxptopisccp",nf90_float, (/dimID(1),dimID(2)/),varID(31)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(31),"long_name","ISCCP Subcolumn Cloud Top Pressure") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(31),"units", "Pa") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(31),"standard_name", "air_pressure_at_cloud_top") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_fq)) then - status = nf90_def_var(fileID,"clisccp",nf90_float, (/dimID(1),dimID(5),dimID(7)/),varID(32)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(32),"long_name","ISCCP joint-PDF of cloud top pressure and optical depth") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(32),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(32),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! MISR simulator output - if (associated(cospOUT%misr_fq)) then - status = nf90_def_var(fileID,"clMISR",nf90_float, (/dimID(1),dimID(5),dimID(8)/),varID(33)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(33),"long_name","MISR joint-PDF of cloud top pressure and optical depth") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(33),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(33),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%misr_meanztop)) then - status = nf90_def_var(fileID,"misr_meanztop",nf90_float, (/dimID(1)/),varID(34)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(34),"long_name","MISR Mean Cloud Top Height") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(34),"units", "m") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(34),"standard_name", "cloud_top_altitude") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%misr_cldarea)) then - status = nf90_def_var(fileID,"misr_cldarea",nf90_float, (/dimID(1)/),varID(35)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(35),"long_name","MISR cloud cover") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(35),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(35),"standard_name", "cloud_area_fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! MODIS simulator output - if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) then - status = nf90_def_var(fileID,"cltmodis",nf90_float, (/dimID(1)/),varID(36)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(36),"long_name","MODIS Total Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(36),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(36),"standard_name", "cloud_area_fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) then - status = nf90_def_var(fileID,"clwmodis",nf90_float, (/dimID(1)/),varID(37)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(37),"long_name","MODIS Liquid Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(37),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(37),"standard_name", "cloud_area_fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) then - status = nf90_def_var(fileID,"climodis",nf90_float, (/dimID(1)/),varID(38)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(38),"long_name","MODIS Ice Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(38),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(38),"standard_name", "cloud_area_fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) then - status = nf90_def_var(fileID,"clhmodis",nf90_float, (/dimID(1)/),varID(39)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(39),"long_name","MODIS High Level Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(39),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(39),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) then - status = nf90_def_var(fileID,"clmmodis",nf90_float, (/dimID(1)/),varID(40)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(40),"long_name","MODIS Mid Level Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(40),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(40),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) then - status = nf90_def_var(fileID,"cllmodis",nf90_float, (/dimID(1)/),varID(41)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(41),"long_name","MODIS Low Level Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(41),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(41),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) then - status = nf90_def_var(fileID,"tautmodis",nf90_float, (/dimID(1)/),varID(42)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(42),"long_name","MODIS Total Cloud Optical Thickness") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(42),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(42),"standard_name", "atmosphere_optical_thickness_due_to_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) then - status = nf90_def_var(fileID,"tauwmodis",nf90_float, (/dimID(1)/),varID(43)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(43),"long_name","MODIS Liquid Cloud Optical Thickness") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(43),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(43),"standard_name", "atmosphere_optical_thickness_due_to_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) then - status = nf90_def_var(fileID,"tauimodis",nf90_float, (/dimID(1)/),varID(44)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(44),"long_name","MODIS Ice Cloud Optical Thickness") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(44),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(44),"standard_name", "atmosphere_optical_thickness_due_to_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_Total_logMean)) then - status = nf90_def_var(fileID,"tautlogmodis",nf90_float, (/dimID(1)/),varID(45)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(45),"long_name","MODIS Total Cloud Optical Thickness (Log10 Mean)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(45),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(45),"standard_name", "atmosphere_optical_thickness_due_to_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_Water_logMean)) then - status = nf90_def_var(fileID,"tauwlogmodis",nf90_float, (/dimID(1)/),varID(46)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(46),"long_name","MODIS Liquid Cloud Optical Thickness (Log10 Mean)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(46),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(46),"standard_name", "atmosphere_optical_thickness_due_to_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_Ice_logMean)) then - status = nf90_def_var(fileID,"tauilogmodis",nf90_float, (/dimID(1)/),varID(47)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(47),"long_name","MODIS Ice Cloud Optical Thickness (Log10 Mean)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(47),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(47),"standard_name", "atmosphere_optical_thickness_due_to_cloud") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) then - status = nf90_def_var(fileID,"reffclwmodis",nf90_float, (/dimID(1)/),varID(48)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(48),"long_name","MODIS Liquid Cloud Particle Size") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(48),"units", "m") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(48),"standard_name", "effective_radius_of_cloud_liquid_water_particle") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) then - status = nf90_def_var(fileID,"reffclimodis",nf90_float, (/dimID(1)/),varID(49)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(49),"long_name","MODIS Ice Cloud Particle Size") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(49),"units", "m") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(49),"standard_name", "effective_radius_of_cloud_liquid_water_particle") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) then - status = nf90_def_var(fileID,"pctmodis",nf90_float, (/dimID(1)/),varID(50)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(50),"long_name","MODIS Cloud Top Pressure") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(50),"units", "hPa") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(50),"standard_name", "air_pressure_at_cloud_top") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) then - status = nf90_def_var(fileID,"lwpmodis",nf90_float, (/dimID(1)/),varID(51)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(51),"long_name","MODIS Cloud Liquid Water Path") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(51),"units", "kg m-2") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(51),"standard_name", "atmosphere_cloud_liquid_water_content") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Ice_Water_Path_Mean)) then - status = nf90_def_var(fileID,"iwpmodis",nf90_float, (/dimID(1)/),varID(52)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(52),"long_name","MODIS Cloud Ice Water Path") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(52),"units", "kg m-2") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(52),"standard_name", "atmosphere_mass_content_of_cloud_ice") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) then - status = nf90_def_var(fileID,"clmodis",nf90_float, (/dimID(1),dimID(5),dimID(7)/),varID(53)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(53),"long_name","MODIS joint-PDF of cloud top pressure and optical depth") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(53),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(53),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) then - status = nf90_def_var(fileID,"clmodis_liq",nf90_float, (/dimID(1),dimID(5),dimID(7)/),varID(148)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(148),"long_name","MODIS joint-PDF of liquid cloud top pressure and optical depth") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(148),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(148),"standard_name", "cloud_area_fraction_in_atmosphere_layer_liq") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) then - status = nf90_def_var(fileID,"clmodis_ice",nf90_float, (/dimID(1),dimID(5),dimID(7)/),varID(149)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(149),"long_name","MODIS joint-PDF of ice cloud top pressure and optical depth") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(149),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(149),"standard_name", "cloud_area_fraction_in_atmosphere_layer_ice") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) then - status = nf90_def_var(fileID,"modis_Optical_Thickness_vs_ReffICE",nf90_float, (/dimID(1),dimID(5),dimID(16)/),varID(54)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(54),"long_name","MODIS Joint-PDF of optical-depth and ice particle size") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(54),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"REICE_MODIS",nf90_float, (/dimID(16)/),varID(89)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(89),"long_name","MODIS Joint-PDF ice particle size bin centers") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(89),"units", "meters") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) then - status = nf90_def_var(fileID,"modis_Optical_Thickness_vs_ReffLIQ",nf90_float, (/dimID(1),dimID(5),dimID(15)/),varID(55)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(55),"long_name","MODIS Joint-PDF of optical-depth and liquid particle size") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(55),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"RELIQ_MODIS",nf90_float, (/dimID(15)/),varID(90)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(90),"long_name","MODIS Joint-PDF liquid particle size bin centers") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(90),"units", "meters") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! Joint simulator products. - if (associated(cospOUT%lidar_only_freq_cloud)) then - status = nf90_def_var(fileID,"clcalipso2",nf90_float, (/dimID(1),dimID(4)/),varID(56)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(56),"long_name","CALIPSO Cloud Fraction Undetected by CloudSat") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(56),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(56),"standard_name", "cloud_area_fraction_in_atmosphere_layer") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%radar_lidar_tcc)) then - status = nf90_def_var(fileID,"cltlidarradar",nf90_float, (/dimID(1)/),varID(57)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(57),"long_name","CALIPSO and CloudSat Total Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(57),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(57),"standard_name", "cloud_area_fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%cloudsat_tcc)) then - status = nf90_def_var(fileID,"cloudsat_tcc",nf90_float, (/dimID(1)/),varID(138)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(138),"long_name","CloudSat Total Cloud Fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(138),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(138),"standard_name", "cloud_area_fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%cloudsat_tcc2)) then - status = nf90_def_var(fileID,"cloudsat_tcc2",nf90_float, (/dimID(1)/),varID(139)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(139),"long_name","CloudSat Total Cloud Fraction (no 1km)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(139),"units", "%") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(139),"standard_name", "cloud_area_fraction") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - ! warm-rain occurrence frequency diagnostics - if (associated(cospOUT%wr_occfreq_ntotal)) then - status = nf90_def_var(fileID,"npdfcld",nf90_float, (/dimID(1)/),varID(140)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(140),"long_name","# of Non-Precipitating Clouds") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(140),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(140),"standard_name", "number_of_slwc_nonprecip") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"npdfdrz",nf90_float, (/dimID(1)/),varID(141)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(141),"long_name","# of Drizzling Clouds") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(141),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(141),"standard_name", "number_of_slwc_drizzle") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"npdfrain",nf90_float, (/dimID(1)/),varID(142)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(142),"long_name","# of Precipitating Clouds") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(142),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(142),"standard_name", "number_of_slwc_precip") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - ! Contoured Frequency by Optical Depth Diagram (CFODD) - if (associated(cospOUT%cfodd_ntotal)) then - status = nf90_def_var(fileID,"ncfodd1",nf90_float, (/dimID(1),dimID(17),dimID(18)/),varID(143)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(143),"long_name","# of CFODD (05 < Reff < 12 micron)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(143),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(143),"standard_name", "cfodd_reff_small") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"ncfodd2",nf90_float, (/dimID(1),dimID(17),dimID(18)/),varID(144)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(144),"long_name","# of CFODD (12 < Reff < 18 micron)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(144),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(144),"standard_name", "cfodd_reff_medium") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"ncfodd3",nf90_float, (/dimID(1),dimID(17),dimID(18)/),varID(145)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(145),"long_name","# of CFODD (18 < Reff < 35 micron)") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(145),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(145),"standard_name", "cfodd_reff_large") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - !! axes for CFODD - status = nf90_def_var(fileID,"CFODD_NDBZE",nf90_float,(/dimID(17)/),varID(146)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(146),"long_name","CloudSat+MODIS dBZe vs ICOD joint PDF X-axis") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(146),"units", "dBZ") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(146),"standard_name", "cloudsat_quivalent_reflectivity_factor") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_def_var(fileID,"CFODD_NICOD",nf90_float,(/dimID(18)/),varID(147)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(147),"long_name","CloudSat+MODIS dBZe vs ICOD joint PDF Y-axis") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(147),"units", "none") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(147),"standard_name", "modis_in-cloud_optical_depth") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - - ! --------------------------------------------------------------------------------------- - ! RTTOV - JKS - ! --------------------------------------------------------------------------------------- - - ! Define instrument channel indices for multiple RTTOV instruments - ii = 165 ! RTTOV variable indices start at 165 - if (allocated(cospOUT%rttov_outputs)) then - do i=1,Ninst_rttov - write (i_str,fmt) i ! converting integer to string i_str using a 'internal file' - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) then - ii = ii + 1 - status = nf90_def_var(fileID,"RTTOV_CHAN_INST"//trim(i_str),nf90_float, (/dimID(20+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Channel Indices") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "1") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_ichan") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%bt_total)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_bt_total_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV All-sky Brightness Temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "Degrees Kelvin") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_allsky_bt") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_bt_clear_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Clear-sky Brightness Temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "Degrees Kelvin") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_clearsky_bt") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%rad_total)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_rad_total_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV All-sky Radiance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_allsky_rad") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_rad_clear_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Clear-sky Radiance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_clearsky_rad") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_rad_cloudy_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Cloudy-sky Radiance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_cloudysky_rad") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%refl_total)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_refl_total_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV All-sky Reflectance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "unitless") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "bleh") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_refl_clear_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","RTTOV Clear-sky Reflectance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "unitless") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "rttov_allsky_refl") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_bt_clear_pc_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","PC-RTTOV Clear-sky Brightness Temperature") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "Degrees Kelvin") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "pcrttov_clearsky_bt") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) then - ii = ii + 1 - status = nf90_def_var(fileID,"rttov_rad_clear_pc_inst"//trim(i_str),nf90_float, (/dimID(1),dimID(20+i)/),varID(ii)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"long_name","PC-RTTOV Clear-sky Radiance") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"units", "mW/cm-1/sr/m2") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_att(fileID,varID(ii),"standard_name", "pcrttov_clearsky_rad") - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - end do - end if - - ! --------------------------------------------------------------------------------------- - ! Exit define mode - ! --------------------------------------------------------------------------------------- - status = nf90_enddef(fileID) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - ! --------------------------------------------------------------------------------------- - ! Populate outputs - ! --------------------------------------------------------------------------------------- - ! Geo - status = nf90_put_var(fileID,varID(1),lon) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(2),lat) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Joint-histogram axis variables - status = nf90_put_var(fileID,varID(3),tau_binCenters) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(4),tau_binEdges) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(5),pres_binCenters) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(6),pres_binEdges) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(7),hgt_binCenters) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(8),hgt_binEdges) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(84),lev) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(85),vgrid_z) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(86),cosp_scol) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(82),bnds) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(83),loc) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - ! CALIPSO simulator output - if (associated(cospOUT%calipso_betaperp_tot)) then - status = nf90_put_var(fileID,varID(9),cospOUT%calipso_betaperp_tot) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_beta_tot)) then - status = nf90_put_var(fileID,varID(10),cospOUT%calipso_beta_tot) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_lidarcldphase)) then - status = nf90_put_var(fileID,varID(58),cospOUT%calipso_lidarcldphase(:,:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(59),cospOUT%calipso_lidarcldphase(:,:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(60),cospOUT%calipso_lidarcldphase(:,:,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cldlayerphase)) then - ! Ice - status = nf90_put_var(fileID,varID(61),cospOUT%calipso_cldlayerphase(:,1,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(62),cospOUT%calipso_cldlayerphase(:,2,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(63),cospOUT%calipso_cldlayerphase(:,3,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(64),cospOUT%calipso_cldlayerphase(:,4,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Liquid - status = nf90_put_var(fileID,varID(65),cospOUT%calipso_cldlayerphase(:,1,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(66),cospOUT%calipso_cldlayerphase(:,2,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(67),cospOUT%calipso_cldlayerphase(:,3,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(68),cospOUT%calipso_cldlayerphase(:,4,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - ! Undetermined - status = nf90_put_var(fileID,varID(69),cospOUT%calipso_cldlayerphase(:,1,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(70),cospOUT%calipso_cldlayerphase(:,2,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(71),cospOUT%calipso_cldlayerphase(:,3,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(72),cospOUT%calipso_cldlayerphase(:,4,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_lidarcldtmp)) then - status = nf90_put_var(fileID,varID(77),cospOUT%calipso_lidarcldtmp(:,:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(78),cospOUT%calipso_lidarcldtmp(:,:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(79),cospOUT%calipso_lidarcldtmp(:,:,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(80),cospOUT%calipso_lidarcldtmp(:,:,4)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cfad_sr)) then - status = nf90_put_var(fileID,varID(15),cospOUT%calipso_cfad_sr) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_lidarcld)) then - status = nf90_put_var(fileID,varID(16),cospOUT%calipso_lidarcld) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cldlayer)) then - status = nf90_put_var(fileID,varID(73),cospOUT%calipso_cldlayer(:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(74),cospOUT%calipso_cldlayer(:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(75),cospOUT%calipso_cldlayer(:,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(76),cospOUT%calipso_cldlayer(:,4)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_beta_mol)) then - status = nf90_put_var(fileID,varID(18),cospOUT%calipso_beta_mol) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_srbval)) then - status = nf90_put_var(fileID,varID(19),reshape([cospOUT%calipso_srbval(1:SR_BINS),cospOUT%calipso_srbval(2:SR_BINS+1)],(/2,SR_BINS/))) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_srbval) .or. associated(cospOUT%calipso_cfad_sr)) then - status = nf90_put_var(fileID,varID(81),calipso_binCenters) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - !OPAQ diagnostics - if (associated(cospOUT%calipso_cldtype)) then - status = nf90_put_var(fileID,varID(91),cospOUT%calipso_cldtype(:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(92),cospOUT%calipso_cldtype(:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(93),cospOUT%calipso_cldtype(:,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_lidarcldtype)) then - status = nf90_put_var(fileID,varID(94),cospOUT%calipso_lidarcldtype(:,:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(95),cospOUT%calipso_lidarcldtype(:,:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(96),cospOUT%calipso_lidarcldtype(:,:,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(97),cospOUT%calipso_lidarcldtype(:,:,4)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cldtypetemp)) then - status = nf90_put_var(fileID,varID(98),cospOUT%calipso_cldtypetemp(:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(99),cospOUT%calipso_cldtypetemp(:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(100),cospOUT%calipso_cldtypetemp(:,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cldtypemeanz)) then - status = nf90_put_var(fileID,varID(101),cospOUT%calipso_cldtypemeanz(:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(102),cospOUT%calipso_cldtypemeanz(:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cldthinemis)) then - status = nf90_put_var(fileID,varID(103),cospOUT%calipso_cldthinemis) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%calipso_cldtypemeanzse)) then - status = nf90_put_var(fileID,varID(104),cospOUT%calipso_cldtypemeanzse(:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(105),cospOUT%calipso_cldtypemeanzse(:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(106),cospOUT%calipso_cldtypemeanzse(:,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! GROUND LIDAR simulator output - if (associated(cospOUT%grLidar532_cldlayer)) then - status = nf90_put_var(fileID,varID(107),cospOUT%grLidar532_cldlayer(:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(108),cospOUT%grLidar532_cldlayer(:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(109),cospOUT%grLidar532_cldlayer(:,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(110),cospOUT%grLidar532_cldlayer(:,4)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%grLidar532_lidarcld)) then - status = nf90_put_var(fileID,varID(111),cospOUT%grLidar532_lidarcld) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%grLidar532_beta_mol)) then - status = nf90_put_var(fileID,varID(112),cospOUT%grLidar532_beta_mol) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%grLidar532_cfad_sr)) then - status = nf90_put_var(fileID,varID(113),cospOUT%grLidar532_cfad_sr) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%grLidar532_beta_tot)) then - status = nf90_put_var(fileID,varID(114),cospOUT%grLidar532_beta_tot) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - if (associated(cospOUT%grLidar532_srbval)) then - status = nf90_put_var(fileID,varID(116),reshape([cospOUT%grLidar532_srbval(1:SR_BINS),cospOUT%grLidar532_srbval(2:SR_BINS+1)],(/2,SR_BINS/))) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%grLidar532_srbval) .or. associated(cospOUT%grLidar532_cfad_sr)) then - status = nf90_put_var(fileID,varID(115),grLidar532_binCenters) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! ATLID simulator output - if (associated(cospOUT%atlid_cldlayer)) then - status = nf90_put_var(fileID,varID(117),cospOUT%atlid_cldlayer(:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(118),cospOUT%atlid_cldlayer(:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(119),cospOUT%atlid_cldlayer(:,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(120),cospOUT%atlid_cldlayer(:,4)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%atlid_lidarcld)) then - status = nf90_put_var(fileID,varID(121),cospOUT%atlid_lidarcld) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%atlid_beta_mol)) then - status = nf90_put_var(fileID,varID(122),cospOUT%atlid_beta_mol) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%atlid_cfad_sr)) then - status = nf90_put_var(fileID,varID(123),cospOUT%atlid_cfad_sr) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%atlid_beta_tot)) then - status = nf90_put_var(fileID,varID(124),cospOUT%atlid_beta_tot) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - if (associated(cospOUT%atlid_srbval)) then - status = nf90_put_var(fileID,varID(126),reshape([cospOUT%atlid_srbval(1:SR_BINS),cospOUT%atlid_srbval(2:SR_BINS+1)],(/2,SR_BINS/))) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%atlid_srbval) .or. associated(cospOUT%atlid_cfad_sr)) then - status = nf90_put_var(fileID,varID(125),atlid_binCenters) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! PARASOL simulator output - if (associated(cospOUT%parasolPix_refl)) then - status = nf90_put_var(fileID,varID(20),cospOUT%parasolPix_refl) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%parasolGrid_refl)) then - status = nf90_put_var(fileID,varID(21),cospOUT%parasolGrid_refl) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%parasolPix_refl) .or.associated(cospOUT%parasolGrid_refl)) then - status = nf90_put_var(fileID,varID(87),PARASOL_SZA) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! Cloudsat simulator output - if (associated(cospOUT%cloudsat_Ze_tot)) then - status = nf90_put_var(fileID,varID(22),cospOUT%cloudsat_Ze_tot) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%cloudsat_cfad_ze)) then - status = nf90_put_var(fileID,varID(23),cospOUT%cloudsat_cfad_ze) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(88),cloudsat_binCenters) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%cloudsat_precip_cover)) then - status = nf90_put_var(fileID,varID(127),cospOUT%cloudsat_precip_cover(:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(128),cospOUT%cloudsat_precip_cover(:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(129),cospOUT%cloudsat_precip_cover(:,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(130),cospOUT%cloudsat_precip_cover(:,4)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(131),cospOUT%cloudsat_precip_cover(:,5)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(132),cospOUT%cloudsat_precip_cover(:,6)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(133),cospOUT%cloudsat_precip_cover(:,7)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(134),cospOUT%cloudsat_precip_cover(:,8)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(135),cospOUT%cloudsat_precip_cover(:,9)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(136),cospOUT%cloudsat_precip_cover(:,10)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%cloudsat_pia)) then - status = nf90_put_var(fileID,varID(137),cospOUT%cloudsat_pia) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - if (associated(cospOUT%isccp_totalcldarea)) then - status = nf90_put_var(fileID,varID(24),cospOUT%isccp_totalcldarea) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_meantb)) then - status = nf90_put_var(fileID,varID(25),cospOUT%isccp_meantb) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_meantbclr)) then - status = nf90_put_var(fileID,varID(26),cospOUT%isccp_meantbclr) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_meanptop)) then - status = nf90_put_var(fileID,varID(27),cospOUT%isccp_meanptop) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_meantaucld)) then - status = nf90_put_var(fileID,varID(28),cospOUT%isccp_meantaucld) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_meanalbedocld)) then - status = nf90_put_var(fileID,varID(29),cospOUT%isccp_meanalbedocld) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_boxtau)) then - status = nf90_put_var(fileID,varID(30),cospOUT%isccp_boxtau) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_boxptop)) then - status = nf90_put_var(fileID,varID(31),cospOUT%isccp_boxptop) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%isccp_fq)) then - status = nf90_put_var(fileID,varID(32),cospOUT%isccp_fq) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - ! MISR simulator output - if (associated(cospOUT%misr_fq)) then - status = nf90_put_var(fileID,varID(33),cospOUT%misr_fq) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%misr_meanztop)) then - status = nf90_put_var(fileID,varID(34),cospOUT%misr_meanztop) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%misr_cldarea)) then - status = nf90_put_var(fileID,varID(35),cospOUT%misr_cldarea) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - ! MODIS simulator output - if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) then - status = nf90_put_var(fileID,varID(36),cospOUT%modis_Cloud_Fraction_Total_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) then - status = nf90_put_var(fileID,varID(37),cospOUT%modis_Cloud_Fraction_Water_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) then - status = nf90_put_var(fileID,varID(38),cospOUT%modis_Cloud_Fraction_Ice_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) then - status = nf90_put_var(fileID,varID(39),cospOUT%modis_Cloud_Fraction_High_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) then - status = nf90_put_var(fileID,varID(40),cospOUT%modis_Cloud_Fraction_Mid_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) then - status = nf90_put_var(fileID,varID(41),cospOUT%modis_Cloud_Fraction_Low_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) then - status = nf90_put_var(fileID,varID(42),cospOUT%modis_Optical_Thickness_Total_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) then - status = nf90_put_var(fileID,varID(43),cospOUT%modis_Optical_Thickness_Water_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) then - status = nf90_put_var(fileID,varID(44),cospOUT%modis_Optical_Thickness_Ice_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) then - status = nf90_put_var(fileID,varID(45),cospOUT%modis_Optical_Thickness_Total_LogMean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) then - status = nf90_put_var(fileID,varID(46),cospOUT%modis_Optical_Thickness_Water_LogMean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) then - status = nf90_put_var(fileID,varID(47),cospOUT%modis_Optical_Thickness_Ice_LogMean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) then - status = nf90_put_var(fileID,varID(48),cospOUT%modis_Cloud_Particle_Size_Water_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) then - status = nf90_put_var(fileID,varID(49),cospOUT%modis_Cloud_Particle_Size_Ice_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) then - status = nf90_put_var(fileID,varID(50),cospOUT%modis_Cloud_Top_Pressure_Total_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) then - status = nf90_put_var(fileID,varID(51),cospOUT%modis_Liquid_Water_Path_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Ice_Water_Path_Mean)) then - status = nf90_put_var(fileID,varID(52),cospOUT%modis_Ice_Water_Path_Mean) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) then - status = nf90_put_var(fileID,varID(53),cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) then - status = nf90_put_var(fileID,varID(148),cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) then - status = nf90_put_var(fileID,varID(149),cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) then - status = nf90_put_var(fileID,varID(54),cospOUT%modis_Optical_Thickness_vs_ReffICE) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(89),reffICE_binCenters) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) then - status = nf90_put_var(fileID,varID(55),cospOUT%modis_Optical_Thickness_vs_ReffLIQ) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(90),reffLIQ_binCenters) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - if (associated(cospOUT%lidar_only_freq_cloud)) then - status = nf90_put_var(fileID,varID(56),cospOUT%lidar_only_freq_cloud) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%radar_lidar_tcc)) then - status = nf90_put_var(fileID,varID(57),cospOUT%radar_lidar_tcc) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%cloudsat_tcc)) then - status = nf90_put_var(fileID,varID(138),cospOUT%cloudsat_tcc) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%cloudsat_tcc2)) then - status = nf90_put_var(fileID,varID(139),cospOUT%cloudsat_tcc2) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! Cloudsat+MODIS Joint simulators output - !! warm-rain occurrence frequency diagnostics - if (associated(cospOUT%wr_occfreq_ntotal)) then - status = nf90_put_var(fileID,varID(140),cospOUT%wr_occfreq_ntotal(:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(141),cospOUT%wr_occfreq_ntotal(:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(142),cospOUT%wr_occfreq_ntotal(:,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - !! Contoured Frequency by Optical Depth Diagram (CFODD) - if (associated(cospOUT%cfodd_ntotal)) then - status = nf90_put_var(fileID,varID(143),cospOUT%cfodd_ntotal(:,:,:,1)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(144),cospOUT%cfodd_ntotal(:,:,:,2)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(145),cospOUT%cfodd_ntotal(:,:,:,3)) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(146),CFODD_HISTDBZEcenters) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - status = nf90_put_var(fileID,varID(147),CFODD_HISTICODcenters) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - - ! Define instrument channel indices for multiple RTTOV instruments - ii = 165 ! RTTOV variable indices start at 166 - if (allocated(cospOUT%rttov_outputs)) then - do i=1,Ninst_rttov - write (i_str,fmt) i ! converting integer to string i_str using a 'internal file' - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) then - ii = ii + 1 - status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%channel_indices) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%bt_total)) then - ii = ii + 1 - status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%bt_total) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) then - ii = ii + 1 - status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%bt_clear) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%rad_total)) then - ii = ii + 1 - status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%rad_total) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) then - ii = ii + 1 - status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%rad_clear) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) then - ii = ii + 1 - status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%rad_cloudy) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%refl_total)) then - ii = ii + 1 - status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%refl_total) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) then - ii = ii + 1 - status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%refl_clear) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) then - ii = ii + 1 - status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%bt_total_pc) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) then - ii = ii + 1 - status = nf90_put_var(fileID,varID(ii),cospOUT%rttov_outputs(i)%rad_total_pc) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - endif - end do - end if - - ! Close file - status = nf90_close(fileID) - if (status .ne. nf90_NoERR) print*,trim(nf90_strerror(status)) - - end subroutine write_cosp2_output - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE nc_read_input_file - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - SUBROUTINE NC_READ_INPUT_FILE(fname,Npnts,Nl,Nhydro,lon,lat,p,ph,z,zh,T,qv,rh,tca,cca, & - mr_lsliq,mr_lsice,mr_ccliq,mr_ccice,fl_lsrain,fl_lssnow, & - fl_lsgrpl,fl_ccrain,fl_ccsnow,Reff,dtau_s,dtau_c,dem_s, & - dem_c,skt,psfc,landmask,mr_ozone,u_wind,v_wind,sunlit, & - emsfc_lw,mode,Nlon,Nlat,surfelev,year,month,day, & - hour,minute,seconds) - - ! Arguments - character(len=512),intent(in) :: fname ! File name - integer,intent(in) :: Npnts,Nl,Nhydro - real(wp),dimension(Npnts),intent(out) :: lon,lat - real(wp),dimension(Npnts,Nl),target,intent(out) :: p,ph,z,zh,T,qv,rh,tca,cca, & - mr_lsliq,mr_lsice,mr_ccliq,mr_ccice,fl_lsrain,fl_lssnow,fl_lsgrpl, & - fl_ccrain,fl_ccsnow,dtau_s,dtau_c,dem_s,dem_c,mr_ozone - real(wp),dimension(Npnts,Nl,Nhydro),intent(out) :: Reff - real(wp),dimension(Npnts),intent(out) :: skt,psfc,landmask,u_wind,v_wind,sunlit,surfelev, & - year,month,day,hour,minute,seconds - real(wp),intent(out) :: emsfc_lw - integer,intent(out) :: mode,Nlon,Nlat - - ! Local variables - integer,parameter :: NMAX_DIM=5 - integer :: Npoints,Nlevels,i,j,k,vrank,vdimid(NMAX_DIM),ncid,vid,ndims,nvars,ngatts, & - recdim,dimsize(NMAX_DIM),errst,Na,Nb,Nc,Nd,Ne - integer,dimension(:),allocatable :: plon,plat - logical :: Llat,Llon,Lpoint - real(wp),dimension(Npnts) :: ll - real(wp),allocatable :: x1(:),x2(:,:),x3(:,:,:),x4(:,:,:,:),x5(:,:,:,:,:) ! Temporary arrays - character(len=128) :: vname - character(len=256) :: dimname(NMAX_DIM) ! 256 hardcoded, instead of MAXNCNAM. This works for NetCDF 3 and 4. - character(len=64) :: routine_name='NC_READ_INPUT_FILE' - character(len=128) :: errmsg,straux - - mode = 0 - Nlon = 0 - Nlat = 0 - - Npoints = Npnts - Nlevels = Nl - - ! Open file - errst = nf90_open(fname, nf90_nowrite, ncid) - if (errst /= 0) then - errmsg="Couldn't open "//trim(fname) - call cosp_error(routine_name,errmsg) - endif - - ! Get information about dimensions. Curtain mode or lat/lon mode? - Llat =.false. - Llon =.false. - Lpoint=.false. - errst = nf90_inquire(ncid, ndims, nvars, ngatts, recdim) - if (errst /= 0) then - errmsg="Error in nf90_inquire" - call cosp_error(routine_name,errmsg,errcode=errst) - endif - do i = 1,ndims - errst = nf90_Inquire_Dimension(ncid,i,name=dimname(i),len=dimsize(i)) - if (errst /= 0) then - write(straux, *) i - errmsg="Error in nf90_Inquire_Dimension, i: "//trim(straux) - call cosp_error(routine_name,errmsg) - endif - if ((trim(dimname(i)).eq.'level').and.(Nlevels > dimsize(i))) then - errmsg='Number of levels selected is greater than in input file '//trim(fname) - call cosp_error(routine_name,errmsg) - endif - if (trim(dimname(i)).eq.'point') then - Lpoint = .true. - if (Npnts > dimsize(i)) then - errmsg='Number of points selected is greater than in input file '//trim(fname) - call cosp_error(routine_name,errmsg) - endif - endif - if (trim(dimname(i)).eq.'lon') then - Llon = .true. - Nlon = dimsize(i) - endif - if (trim(dimname(i)).eq.'lat') then - Llat = .true. - Nlat = dimsize(i) - endif - enddo - - ! Get lon and lat - if (Llon.and.Llat) then ! 2D mode - if ((Npnts) > Nlon*Nlat) Npoints=Nlon*Nlat - lon = -1.0E30 - lat = -1.0E30 - mode = 2 ! Don't know yet if (lon,lat) or (lat,lon) at this point - else if (Lpoint) then ! 1D mode - Nlon = Npoints - Nlat = Npoints - mode = 1 - else - errmsg= trim(fname)//' file contains wrong dimensions' - call cosp_error(routine_name,errmsg) - endif - errst = nf90_inq_varid(ncid, 'lon', vid) - if (errst /= 0) then - errmsg="Error in nf90_inq_varid, var: lon" - call cosp_error(routine_name,errmsg,errcode=errst) - endif - errst = nf90_get_var(ncid, vid, lon, start = (/1/), count = (/Nlon/)) - if (errst /= 0) then - errmsg="Error in nf90_get_var, var: lon" - call cosp_error(routine_name,errmsg,errcode=errst) - endif - errst = nf90_inq_varid(ncid, 'lat', vid) - if (errst /= 0) then - errmsg="Error in nf90_inq_varid, var: lat" - call cosp_error(routine_name,errmsg,errcode=errst) - endif - errst = nf90_get_var(ncid, vid, lat, start = (/1/), count = (/Nlat/)) - if (errst /= 0) then - errmsg="Error in nf90_get_var, var: lat" - call cosp_error(routine_name,errmsg,errcode=errst) - endif - - ! Get all variables - do vid = 1,nvars - vdimid=0 - errst = nf90_Inquire_Variable(ncid, vid, name=vname, ndims=vrank, dimids=vdimid) - if (errst /= 0) then - write(straux, *) vid - errmsg='Error in nf90_Inquire_Variable, vid '//trim(straux) - call cosp_error(routine_name,errmsg,errcode=errst) - endif - ! Read in into temporary array of correct shape - if (vrank == 1) then - Na = dimsize(vdimid(1)) - allocate(x1(Na)) - errst = nf90_get_var(ncid, vid, x1, start=(/1/), count=(/Na/)) - endif - if (vrank == 2) then - Na = dimsize(vdimid(1)) - Nb = dimsize(vdimid(2)) - allocate(x2(Na,Nb)) - errst = nf90_get_var(ncid, vid, x2, start=(/1,1/), count=(/Na,Nb/)) - endif - if (vrank == 3) then - Na = dimsize(vdimid(1)) - Nb = dimsize(vdimid(2)) - Nc = dimsize(vdimid(3)) - allocate(x3(Na,Nb,Nc)) - errst = nf90_get_var(ncid, vid, x3, start=(/1,1,1/), count=(/Na,Nb,Nc/)) - if ((mode == 2).or.(mode == 3)) then - if ((Na == Nlon).and.(Nb == Nlat)) then - mode = 2 - else if ((Na == Nlat).and.(Nb == Nlon)) then - mode = 3 - else - errmsg='Wrong mode for variable '//trim(vname) - call cosp_error(routine_name,errmsg) - endif - endif - endif - if (vrank == 4) then - Na = dimsize(vdimid(1)) - Nb = dimsize(vdimid(2)) - Nc = dimsize(vdimid(3)) - Nd = dimsize(vdimid(4)) - allocate(x4(Na,Nb,Nc,Nd)) - errst = nf90_get_var(ncid, vid, x4, start=(/1,1,1,1/), count=(/Na,Nb,Nc,Nd/)) - endif - if (vrank == 5) then - Na = dimsize(vdimid(1)) - Nb = dimsize(vdimid(2)) - Nc = dimsize(vdimid(3)) - Nd = dimsize(vdimid(4)) - Ne = dimsize(vdimid(5)) - allocate(x5(Na,Nb,Nc,Nd,Ne)) - errst = nf90_get_var(ncid, vid, x5, start=(/1,1,1,1,1/), count=(/Na,Nb,Nc,Nd,Ne/)) - endif - if (errst /= 0) then - write(straux, *) vid - errmsg='Error in nf90_get_var, vid '//trim(straux) - call cosp_error(routine_name,errmsg,errcode=errst) - endif - ! Map to the right input argument - select case (trim(vname)) - case ('pfull') - if (Lpoint) then - p(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=p) - endif - case ('phalf') - if (Lpoint) then - ph(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=ph) - endif - case ('height') - if (Lpoint) then - z(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=z) - endif - case ('height_half') - if (Lpoint) then - zh(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=zh) - endif - case ('T_abs') - if (Lpoint) then - T(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=T) - endif - case ('qv') - if (Lpoint) then - qv(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=qv) - endif - case ('rh') - if (Lpoint) then - rh(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=rh) - endif - case ('tca') - if (Lpoint) then - tca(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=tca) - endif - tca = tca - case ('cca') - if (Lpoint) then - cca(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=cca) - endif - cca = cca - case ('mr_lsliq') - if (Lpoint) then - mr_lsliq(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_lsliq) - endif - case ('mr_lsice') - if (Lpoint) then - mr_lsice(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_lsice) - endif - case ('mr_ccliq') - if (Lpoint) then - mr_ccliq(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_ccliq) - endif - case ('mr_ccice') - if (Lpoint) then - mr_ccice(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_ccice) - endif - case ('fl_lsrain') - if (Lpoint) then - fl_lsrain(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=fl_lsrain) - endif - case ('fl_lssnow') - if (Lpoint) then - fl_lssnow(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=fl_lssnow) - endif - case ('fl_lsgrpl') - if (Lpoint) then - fl_lsgrpl(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=fl_lsgrpl) - endif - case ('fl_ccrain') - if (Lpoint) then - fl_ccrain(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=fl_ccrain) - endif - case ('fl_ccsnow') - if (Lpoint) then - fl_ccsnow(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=fl_ccsnow) - endif - case ('dtau_s') - if (Lpoint) then - dtau_s(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=dtau_s) - endif - case ('dtau_c') - if (Lpoint) then - dtau_c(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=dtau_c) - endif - case ('dem_s') - if (Lpoint) then - dem_s(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=dem_s) - endif - case ('dem_c') - if (Lpoint) then - dem_c(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=dem_c) - endif - case ('Reff') - if (Lpoint) then - Reff(1:Npoints,:,:) = x3(1:Npoints,1:Nlevels,:) - else - call map_ll_to_point(Na,Nb,Npoints,x4=x4,y3=Reff) - endif - case ('skt') - if (Lpoint) then - skt(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=skt) - endif - case ('psfc') - if (Lpoint) then - psfc(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=psfc) - endif - case ('orography') - if (Lpoint) then - surfelev(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=surfelev) - endif - case ('landmask') - if (Lpoint) then - landmask(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=landmask) - endif - case ('mr_ozone') - if (Lpoint) then - mr_ozone(1:Npoints,:) = x2(1:Npoints,1:Nlevels) - else - call map_ll_to_point(Na,Nb,Npoints,x3=x3,y2=mr_ozone) - endif - case ('u_wind') - if (Lpoint) then - u_wind(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=u_wind) - endif - case ('v_wind') - if (Lpoint) then - v_wind(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=v_wind) - endif - case ('sunlit') - if (Lpoint) then - sunlit(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=sunlit) - endif - case ('year') - if (Lpoint) then - year(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=year) - endif - case ('month') - if (Lpoint) then - month(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=month) - endif - case ('day') - if (Lpoint) then - day(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=day) - endif - case ('hour') - if (Lpoint) then - hour(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=hour) - endif - case ('minute') - if (Lpoint) then - minute(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=minute) - endif - case ('second') - if (Lpoint) then - seconds(1:Npoints) = x1(1:Npoints) - else - call map_ll_to_point(Na,Nb,Npoints,x2=x2,y1=seconds) - endif - end select - ! Free memory - if (vrank == 1) deallocate(x1) - if (vrank == 2) deallocate(x2) - if (vrank == 3) deallocate(x3) - if (vrank == 4) deallocate(x4) - if (vrank == 5) deallocate(x5) - enddo - - ! SFC emissivity - errst = nf90_inq_varid(ncid, 'emsfc_lw', vid) - if (errst /= 0) then - if (errst == nf90_enotvar) then ! Does not exist, use 1.0 - emsfc_lw = 1.0 - print *, ' ********* COSP Warning: emsfc_lw does not exist in input file. Set to 1.0.' - else ! Other error, stop - errmsg='Error in nf90_inq_varid, var: emsfc_lw' - call cosp_error(routine_name,errmsg,errcode=errst) - endif - else - errst = nf90_get_var(ncid, vid, emsfc_lw) - if (errst /= 0) then - errmsg='Error in nf90_get_var, var: emsfc_lw' - call cosp_error(routine_name,errmsg,errcode=errst) - endif - endif - - - ! Fill in the lat/lon vectors with the right values for 2D modes - ! This might be helpful if the inputs are 2D (gridded) and - ! you want outputs in 1D mode - allocate(plon(Npoints),plat(Npoints)) - if (mode == 2) then !(lon,lat) - ll = lat - do j=1,Nb - do i=1,Na - k = (j-1)*Na + i - plon(k) = i - plat(k) = j - enddo - enddo - lon(1:Npoints) = lon(plon(1:Npoints)) - lat(1:Npoints) = ll(plat(1:Npoints)) - else if (mode == 3) then !(lat,lon) - ll = lon - do j=1,Nb - do i=1,Na - k = (j-1)*Na + i - lon(k) = ll(j) - lat(k) = lat(i) - enddo - enddo - lon(1:Npoints) = ll(plon(1:Npoints)) - lat(1:Npoints) = lat(plat(1:Npoints)) - endif - deallocate(plon,plat) - - ! Close file - errst = nf90_close(ncid) - if (errst /= 0) then - errmsg='Error in nf90_close' - call cosp_error(routine_name,errmsg,errcode=errst) - endif - END SUBROUTINE NC_READ_INPUT_FILE - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE map_ll_to_point - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - SUBROUTINE MAP_LL_TO_POINT(Nx,Ny,Np,x2,x3,x4,x5,y1,y2,y3,y4) - ! Input arguments - integer,intent(in) :: Nx,Ny,Np - real(wp),intent(in),optional :: x2(:,:),x3(:,:,:), & - x4(:,:,:,:),x5(:,:,:,:,:) - real(wp),intent(out),optional :: y1(:),y2(:,:),y3(:,:,:), & - y4(:,:,:,:) - ! Local variables - integer :: px(Nx*Ny),py(Nx*Ny) - integer :: i,j,k,l,m - integer :: Ni,Nj,Nk,Nl,Nm - integer :: Mi,Mj,Mk,Ml - character(len=128) :: proname='MAP_LL_TO_POINT' - - px=0 - py=0 - if (Nx*Ny < Np) then - print *, ' -- '//trim(proname)//': Nx*Ny < Np' - stop - endif - do j=1,Ny - do i=1,Nx - k = (j-1)*Nx+i - px(k) = i - py(k) = j - enddo - enddo - - if (present(x2).and.present(y1)) then - Ni = size(x2,1) - Nj = size(x2,2) - Mi = size(y1,1) - if (Ni*Nj < Mi) then - print *, ' -- '//trim(proname)//': Nlon*Nlat < Npoints (opt 1)' - stop - endif - do j=1,Np - y1(j) = x2(px(j),py(j)) - enddo - else if (present(x3).and.present(y2)) then - Ni = size(x3,1) - Nj = size(x3,2) - Nk = size(x3,3) - Mi = size(y2,1) - Mj = size(y2,2) - if (Ni*Nj < Mi) then - print *, ' -- '//trim(proname)//': Nlon*Nlat < Npoints (opt 2)' - stop - endif - if (Nk /= Mj) then - print *, ' -- '//trim(proname)//': Nk /= Mj (opt 2)' - stop - endif - do k=1,Nk - do j=1,Np - y2(j,k) = x3(px(j),py(j),k) - enddo - enddo - else if (present(x4).and.present(y3)) then - Ni = size(x4,1) - Nj = size(x4,2) - Nk = size(x4,3) - Nl = size(x4,4) - Mi = size(y3,1) - Mj = size(y3,2) - Mk = size(y3,3) - if (Ni*Nj < Mi) then - print *, ' -- '//trim(proname)//': Nlon*Nlat < Npoints (opt 3)' - stop - endif - if (Nk /= Mj) then - print *, ' -- '//trim(proname)//': Nk /= Mj (opt 3)' - stop - endif - if (Nl /= Mk) then - print *, ' -- '//trim(proname)//': Nl /= Mk (opt 3)' - stop - endif - do l=1,Nl - do k=1,Nk - do j=1,Np - y3(j,k,l) = x4(px(j),py(j),k,l) - enddo - enddo - enddo - else if (present(x5).and.present(y4)) then - Ni = size(x5,1) - Nj = size(x5,2) - Nk = size(x5,3) - Nl = size(x5,4) - Nm = size(x5,5) - Mi = size(y4,1) - Mj = size(y4,2) - Mk = size(y4,3) - Ml = size(y4,4) - if (Ni*Nj < Mi) then - print *, ' -- '//trim(proname)//': Nlon*Nlat < Npoints (opt 4)' - stop - endif - if (Nk /= Mj) then - print *, ' -- '//trim(proname)//': Nk /= Mj (opt 4)' - stop - endif - if (Nl /= Mk) then - print *, ' -- '//trim(proname)//': Nl /= Mk (opt 4)' - stop - endif - if (Nm /= Ml) then - print *, ' -- '//trim(proname)//': Nm /= Ml (opt 4)' - stop - endif - do m=1,Nm - do l=1,Nl - do k=1,Nk - do j=1,Np - y4(j,k,l,m) = x5(px(j),py(j),k,l,m) - enddo - enddo - enddo - enddo - else - print *, ' -- '//trim(proname)//': wrong option' - stop - endif - END SUBROUTINE MAP_LL_TO_POINT - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Subrotuine cosp_error - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - SUBROUTINE COSP_ERROR(routine_name,message,errcode) - character(len = *), intent(in) :: routine_name - character(len = *), intent(in) :: message - integer,optional :: errcode - - write(6, *) " ********** Failure in ", trim(routine_name) - write(6, *) " ********** ", trim(message) - if (present(errcode)) write(6, *) " ********** errcode: ", errcode - flush(6) - stop - END SUBROUTINE COSP_ERROR - end module mod_cosp_io diff --git a/driver/src/cosp2_test.f90.bak b/driver/src/cosp2_test.f90.bak deleted file mode 100644 index 47ead0012f..0000000000 --- a/driver/src/cosp2_test.f90.bak +++ /dev/null @@ -1,2076 +0,0 @@ -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -! Copyright (c) 2016, Regents of the University of Colorado -! All rights reserved. -! -! Redistribution and use in source and binary forms, with or without modification, are -! permitted provided that the following conditions are met: -! -! 1. Redistributions of source code must retain the above copyright notice, this list of -! conditions and the following disclaimer. -! -! 2. Redistributions in binary form must reproduce the above copyright notice, this list -! of conditions and the following disclaimer in the documentation and/or other -! materials provided with the distribution. -! -! 3. Neither the name of the copyright holder nor the names of its contributors may be -! used to endorse or promote products derived from this software without specific prior -! written permission. -! -! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL -! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT -! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -! -! History -! March 2016 - D. Swales - Original version -! April 2018 - R. Guzman - Added OPAQ diagnostics and Ground LIDar (GLID) simulator -! April 2018 - R. Guzman - Added ATLID simulator -! Nov 2018 - T. Michibata - Added CloudSat+MODIS Warmrain Diagnostics -! June 2025 - J.K. Shaw - Added COSP-RTTOV integration and swathing -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -program cosp2_test - use cosp_kinds, only: wp - USE MOD_COSP_CONFIG, ONLY: R_UNDEF,PARASOL_NREFL,LIDAR_NCAT,LIDAR_NTYPE,SR_BINS, & - N_HYDRO,numMISRHgtBins, & - cloudsat_DBZE_BINS,LIDAR_NTEMP,calipso_histBsct, & - CFODD_NDBZE, CFODD_NICOD, & - CFODD_BNDRE, CFODD_NCLASS, & - CFODD_DBZE_MIN, CFODD_DBZE_MAX, & - CFODD_ICOD_MIN, CFODD_ICOD_MAX, & - CFODD_DBZE_WIDTH, CFODD_ICOD_WIDTH, & - WR_NREGIME, & - numMODISTauBins,numMODISPresBins, & - numMODISReffIceBins,numMODISReffLiqBins, & - numISCCPTauBins,numISCCPPresBins,numMISRTauBins, & - ntau,modis_histTau,tau_binBounds, & - modis_histTauEdges,tau_binEdges, & - modis_histTauCenters,tau_binCenters,ntauV1p4, & - tau_binBoundsV1p4,tau_binEdgesV1p4, tau_binCentersV1p4, & - grLidar532_histBsct,atlid_histBsct,vgrid_zu,vgrid_zl, & - Nlvgrid_local => Nlvgrid, & - vgrid_z,cloudsat_preclvl - use cosp_phys_constants, only: amw,amd,amO3,amCO2,amCH4,amN2O,amCO - use mod_cosp_io, only: nc_read_input_file,write_cosp2_output - USE mod_quickbeam_optics,only: size_distribution,hydro_class_init,quickbeam_optics, & - quickbeam_optics_init,gases - use mod_cosp, only: cosp_init, & - cosp_outputs,swath_inputs,cosp_simulator - USE mod_rng, ONLY: rng_state, init_rng - USE mod_scops, ONLY: scops - USE mod_prec_scops, ONLY: prec_scops - USE MOD_COSP_UTILS, ONLY: cosp_precip_mxratio - use cosp_optics, ONLY: cosp_simulator_optics,lidar_optics,modis_optics, & - modis_optics_partition - use mod_cosp_stats, ONLY: COSP_CHANGE_VERTICAL_GRID,cosp_optical_inputs, & - cosp_column_inputs,radar_cfg,cosp_cleanUp - use MOD_COSP_RTTOV_UTIL, only: rttov_cfg - - implicit none - - ! Input/Output driver file control - character(len=256) :: cosp_input_namelist - character(len=64) :: cosp_output_namelist = 'cosp2_output_nl.txt' - - ! Test data - integer :: & - Nlon,Nlat,geomode - real(wp) :: & - emsfc_lw - real(wp),dimension(:),allocatable,target :: & - lon, & ! Longitude (deg) - lat, & ! Latitude (deg) - skt, & ! Skin temperature (K) - psfc, & ! Surface Pressure (Pa) - surfelev, & ! Surface Elevation (m) - landmask, & ! Land/sea mask (0/1) - u_wind, & ! U-component of wind (m/s) - v_wind, & ! V-component of wind (m/s) - sunlit ! Sunlit flag - real(wp),dimension(:),allocatable :: & - year, & ! Year (CE) - month, & ! Month [1,12] - day, & ! Day [1,31] - hour, & ! Hour [0,24] - minute, & ! Minute [0,60] - seconds ! Second [0,60] - real(wp),dimension(:,:),allocatable,target :: & - p, & ! Model pressure levels (pa) - ph, & ! Model pressure @ half levels (pa) - zlev, & ! Model level height (m) - zlev_half, & ! Model level height @ half-levels (m) - T, & ! Temperature (K) - sh, & ! Specific humidity (kg/kg) - rh, & ! Relative humidity (1) - tca, & ! Total cloud fraction (1) - cca, & ! Convective cloud fraction (1) - mr_lsliq, & ! Mass mixing ratio for stratiform cloud liquid (kg/kg) - mr_lsice, & ! Mass mixing ratio for stratiform cloud ice (kg/kg) - mr_ccliq, & ! Mass mixing ratio for convective cloud liquid (kg/kg) - mr_ccice, & ! Mass mixing ratio for convective cloud ice (kg/kg) - mr_ozone, & ! Mass mixing ratio for ozone (kg/kg) - fl_lsrain, & ! Precipitation flux (rain) for stratiform cloud (kg/m^2/s) - fl_lssnow, & ! Precipitation flux (snow) for stratiform cloud (kg/m^2/s) - fl_lsgrpl, & ! Precipitation flux (groupel) for stratiform cloud (kg/m^2/s) - fl_ccrain, & ! Precipitation flux (rain) for convective cloud (kg/m^2/s) - fl_ccsnow, & ! Precipitation flux (snow) for convective cloud (kg/m^2/s) - dtau_s, & ! 0.67micron optical depth (stratiform cloud) (1) - dtau_c, & ! 0.67micron optical depth (convective cloud) (1) - dem_s, & ! 11micron emissivity (stratiform cloud) - dem_c ! 11microm emissivity (convective cloud) - real(wp),dimension(:,:,:),allocatable,target :: & - frac_out, & ! Subcolumn cloud cover (0/1) - Reff ! Subcolumn effective radius - - ! Input namelist fields - integer :: & ! - Npoints, & ! Number of gridpoints - Ncolumns, & ! Number of subcolumns - Nlevels, & ! Number of model vertical levels - Npoints_it, & ! Number of gridpoints to be processed in one - ! iteration - Nlvgrid, & ! Number of vertical levels for statistical outputs - ! (USE_VGRID=.true.) - surface_radar, & ! surface=1/spaceborne=0 - cloudsat_use_gas_abs, & ! Include gaseous absorption (1=yes/0=no) - cloudsat_do_ray, & ! Calculate output Rayleigh (1=yes/0=no) - lidar_ice_type, & ! Ice particle shape in lidar calculations - ! (0=ice-spheres/1=ice-non-spherical) - overlap, & ! Overlap type: 1=max, 2=rand, 3=max/rand - isccp_topheight, & ! ISCCP cloud top height - isccp_topheight_direction ! ISCCP cloud top height direction - real(wp) :: & ! - cloudsat_radar_freq, & ! CloudSat radar frequency (GHz) - cloudsat_k2 ! |K|^2, -1=use frequency dependent default - logical :: & ! - use_vgrid, & ! Use fixed vertical grid for outputs? - csat_vgrid, & ! CloudSat vertical grid? - use_precipitation_fluxes ! True if precipitation fluxes are input to the - ! algorithm - character(len=64) :: & - cloudsat_micro_scheme ! Microphysical scheme used in cloudsat radar simulator - character(len=64) :: & - finput ! Input NetCDF file - character(len=256) :: & - foutput - character(len=512) :: & - dinput ! Directory where the input files are located - character(len=600) :: & - fileIN ! dinput+finput - - ! RTTOV - integer :: rttov_Ninstruments = 0 - character(len=256), dimension(50) :: & ! Arbitrary limit of 50 should be fine. - rttov_instrument_namelists ! Input of paths to RTTOV instrument namelists - character(len=256), allocatable :: & - rttov_instrument_namelists_final(:) ! Array of paths to RTTOV instrument namelists - logical :: rttov_verbose = .false. - - ! Inputs for orbit swathing - integer :: N_SWATHS_ISCCP = 0 ! Number of ISCCP swaths - integer :: N_SWATHS_MISR = 0 ! Number of MISR swaths - integer :: N_SWATHS_MODIS = 0 ! Number of MODIS swaths - integer :: N_SWATHS_PARASOL = 0 ! Number of PARASOL swaths - integer :: N_SWATHS_CSCAL = 0 ! Number of CLOUDSAT+CALIPSO swaths - integer :: N_SWATHS_ATLID = 0 ! Number of ATLID swaths - real(wp),dimension(10),target :: & ! Arbitrary limit of 10 swaths seems reasonable. - SWATH_LOCALTIMES_ISCCP, & ! Local time of ISCCP satellite overpasses (hrs GMT) - SWATH_LOCALTIMES_MISR, & ! Local time of MISR satellite overpasses (hrs GMT) - SWATH_LOCALTIMES_MODIS, & ! Local time of MODIS satellite overpasses (hrs GMT) - SWATH_LOCALTIMES_PARASOL, & ! Local time of PARASOL satellite overpasses (hrs GMT) - SWATH_LOCALTIMES_CSCAL, & ! Local time of CLOUDSAT+CALIPSO satellite overpasses (hrs GMT) - SWATH_LOCALTIMES_ATLID, & ! Local time of ATLID satellite overpasses (hrs GMT) - SWATH_WIDTHS_ISCCP, & ! Width in km of ISCCP satellite overpasses - SWATH_WIDTHS_MISR, & ! Width in km of MISR satellite overpasses - SWATH_WIDTHS_MODIS, & ! Width in km of MODIS satellite overpasses - SWATH_WIDTHS_PARASOL, & ! Width in km of PARASOL satellite overpasses - SWATH_WIDTHS_CSCAL, & ! Width in km of CLOUDSAT+CALIPSO satellite overpasses - SWATH_WIDTHS_ATLID ! Width in km of ATLID satellite overpasses - - namelist/COSP_INPUT/overlap, isccp_topheight, isccp_topheight_direction, npoints, & - npoints_it, ncolumns, nlevels, use_vgrid, Nlvgrid, csat_vgrid, dinput, finput, & - foutput, cloudsat_radar_freq, surface_radar, cloudsat_use_gas_abs,cloudsat_do_ray,& - cloudsat_k2, cloudsat_micro_scheme, lidar_ice_type, use_precipitation_fluxes, & - rttov_Ninstruments, rttov_instrument_namelists, rttov_verbose, & - N_SWATHS_ISCCP, SWATH_LOCALTIMES_ISCCP, SWATH_WIDTHS_ISCCP, N_SWATHS_MISR, & - SWATH_LOCALTIMES_MISR, SWATH_WIDTHS_MISR, N_SWATHS_MODIS, SWATH_LOCALTIMES_MODIS, & - SWATH_WIDTHS_MODIS, N_SWATHS_PARASOL, SWATH_LOCALTIMES_PARASOL, & - SWATH_WIDTHS_PARASOL, N_SWATHS_CSCAL, SWATH_LOCALTIMES_CSCAL, & - SWATH_WIDTHS_CSCAL, N_SWATHS_ATLID, SWATH_LOCALTIMES_ATLID, SWATH_WIDTHS_ATLID - - ! Output namelist - logical :: Lcfaddbze94,Ldbze94,Latb532,LcfadLidarsr532,Lclcalipso,Lclhcalipso, & - Lcllcalipso,Lclmcalipso,Lcltcalipso,LparasolRefl,Lclcalipsoliq, & - Lclcalipsoice,Lclcalipsoun,Lclcalipsotmp,Lclcalipsotmpliq,Lclcalipsotmpice, & - Lclcalipsotmpun,Lclhcalipsoliq,Lcllcalipsoliq,Lclmcalipsoliq,Lcltcalipsoliq,& - Lclhcalipsoice,Lcllcalipsoice,Lclmcalipsoice,Lcltcalipsoice,Lclhcalipsoun, & - Lcllcalipsoun,Lclmcalipsoun,Lcltcalipsoun,Lclopaquecalipso,Lclthincalipso, & - Lclzopaquecalipso,Lclcalipsoopaque,Lclcalipsothin,Lclcalipsozopaque, & - Lclcalipsoopacity,Lclopaquetemp,Lclthintemp,Lclzopaquetemp,Lclopaquemeanz, & - Lclthinmeanz,Lclthinemis,Lclopaquemeanzse,Lclthinmeanzse,Lclzopaquecalipsose,& - LlidarBetaMol532gr,LcfadLidarsr532gr,Latb532gr,LclgrLidar532,LclhgrLidar532,& - LcllgrLidar532,LclmgrLidar532,LcltgrLidar532,LlidarBetaMol355, & - LcfadLidarsr355,Latb355,Lclatlid,Lclhatlid,Lcllatlid,Lclmatlid,Lcltatlid, & - Lalbisccp,Lboxptopisccp,Lboxtauisccp,Lpctisccp,Lclisccp,Ltauisccp,Lcltisccp,& - Lmeantbisccp,Lmeantbclrisccp,LclMISR,Lclcalipso2,Lcltlidarradar, & - Lcloudsat_tcc, Lcloudsat_tcc2,Lfracout, & - LlidarBetaMol532,Lcltmodis,Lclwmodis,Lclimodis,Lclhmodis,Lclmmodis, & - Lcllmodis,Ltautmodis,Ltauwmodis,Ltauimodis,Ltautlogmodis,Ltauwlogmodis, & - Ltauilogmodis,Lreffclwmodis,Lreffclimodis,Lpctmodis,Llwpmodis,Liwpmodis, & - Lclmodis,Lptradarflag0,Lptradarflag1,Lptradarflag2,Lptradarflag3, & - Lptradarflag4,Lptradarflag5,Lptradarflag6,Lptradarflag7,Lptradarflag8, & - Lptradarflag9,Lradarpia, & - Lwr_occfreq,Lcfodd - namelist/COSP_OUTPUT/Lcfaddbze94,Ldbze94,Latb532,LcfadLidarsr532,Lclcalipso, & - Lclhcalipso,Lcllcalipso,Lclmcalipso,Lcltcalipso,LparasolRefl, & - Lclcalipsoliq,Lclcalipsoice,Lclcalipsoun,Lclcalipsotmp, & - Lclcalipsotmpliq,Lclcalipsotmpice,Lclcalipsotmpun,Lclhcalipsoliq, & - Lcllcalipsoliq,Lclmcalipsoliq,Lcltcalipsoliq,Lclhcalipsoice, & - Lcllcalipsoice,Lclmcalipsoice,Lcltcalipsoice,Lclhcalipsoun, & - Lcllcalipsoun,Lclmcalipsoun,Lcltcalipsoun,Lclopaquecalipso, & - Lclthincalipso,Lclzopaquecalipso,Lclcalipsoopaque,Lclcalipsothin, & - Lclcalipsozopaque,Lclcalipsoopacity,Lclopaquetemp,Lclthintemp, & - Lclzopaquetemp,Lclopaquemeanz,Lclthinmeanz,Lclthinemis, & - Lclopaquemeanzse,Lclthinmeanzse,Lclzopaquecalipsose, & - LlidarBetaMol532gr,LcfadLidarsr532gr,Latb532gr,LclgrLidar532, & - LclhgrLidar532,LcllgrLidar532,LclmgrLidar532,LcltgrLidar532, & - LlidarBetaMol355,LcfadLidarsr355,Latb355,Lclatlid, & - Lclhatlid,Lcllatlid,Lclmatlid,Lcltatlid,Lalbisccp,Lboxptopisccp, & - Lboxtauisccp,Lpctisccp,Lclisccp,Ltauisccp,Lcltisccp,Lmeantbisccp, & - Lmeantbclrisccp,LclMISR,Lclcalipso2,Lcltlidarradar, & - Lcloudsat_tcc, Lcloudsat_tcc2, Lfracout, & - LlidarBetaMol532,Lcltmodis,Lclwmodis,Lclimodis,Lclhmodis, & - Lclmmodis,Lcllmodis,Ltautmodis,Ltauwmodis,Ltauimodis, & - Ltautlogmodis,Ltauwlogmodis,Ltauilogmodis,Lreffclwmodis, & - Lreffclimodis,Lpctmodis,Llwpmodis,Liwpmodis,Lclmodis, & - Lptradarflag0,Lptradarflag1,Lptradarflag2,Lptradarflag3, & - Lptradarflag4,Lptradarflag5,Lptradarflag6,Lptradarflag7, & - Lptradarflag8,Lptradarflag9,Lradarpia, & - Lwr_occfreq, Lcfodd - ! Local variables - logical :: & - lsingle = .true., & ! True if using MMF_v3_single_moment CLOUDSAT microphysical scheme (default) - ldouble = .false., & ! True if using MMF_v3.5_two_moment CLOUDSAT microphysical scheme - lisccp = .false. ,& ! Local on/off switch for simulators (used by initialization) - lmodis = .false., & ! - lmisr = .false., & ! - lcalipso = .false., & ! - lgrLidar532 = .false., & ! - latlid = .false., & ! - lcloudsat = .false., & ! - lrttov = .false., & ! - lparasol = .false. ! - type(size_distribution) :: & - sd ! Hydrometeor description - type(radar_cfg) :: & - rcfg_cloudsat ! Radar configuration - type(rttov_cfg), dimension(:), allocatable, target :: & - rttov_configs - type(cosp_outputs) :: & - cospOUT ! COSP simulator outputs - type(cosp_optical_inputs) :: & - cospIN ! COSP optical (or derived?) fields needed by simulators - type(cosp_column_inputs) :: & - cospstateIN ! COSP model fields needed by simulators - integer :: iChunk,nChunks,start_idx,end_idx,nPtsPerIt,ij - real(wp),dimension(10) :: driver_time - character(len=256),dimension(100) :: cosp_status - - ! Indices to address arrays of LS and CONV hydrometeors - integer,parameter :: & - I_LSCLIQ = 1, & ! Large-scale (stratiform) liquid - I_LSCICE = 2, & ! Large-scale (stratiform) ice - I_LSRAIN = 3, & ! Large-scale (stratiform) rain - I_LSSNOW = 4, & ! Large-scale (stratiform) snow - I_CVCLIQ = 5, & ! Convective liquid - I_CVCICE = 6, & ! Convective ice - I_CVRAIN = 7, & ! Convective rain - I_CVSNOW = 8, & ! Convective snow - I_LSGRPL = 9 ! Large-scale (stratiform) groupel - - ! Stratiform and convective clouds in frac_out (scops output). - integer, parameter :: & - I_LSC = 1, & ! Large-scale clouds - I_CVC = 2 ! Convective clouds - - ! Microphysical settings for the precipitation flux to mixing ratio conversion - real(wp),parameter,dimension(N_HYDRO) :: & - ! LSL LSI LSR LSS CVL CVI CVR CVS LSG - N_ax = (/-1., -1., 8.e6, 3.e6, -1., -1., 8.e6, 3.e6, 4.e6/),& - N_bx = (/-1., -1., 0.0, 0.0, -1., -1., 0.0, 0.0, 0.0/),& - alpha_x = (/-1., -1., 0.0, 0.0, -1., -1., 0.0, 0.0, 0.0/),& - c_x = (/-1., -1., 842.0, 4.84, -1., -1., 842.0, 4.84, 94.5/),& - d_x = (/-1., -1., 0.8, 0.25, -1., -1., 0.8, 0.25, 0.5/),& - g_x = (/-1., -1., 0.5, 0.5, -1., -1., 0.5, 0.5, 0.5/),& - a_x = (/-1., -1., 524.0, 52.36, -1., -1., 524.0, 52.36, 209.44/),& - b_x = (/-1., -1., 3.0, 3.0, -1., -1., 3.0, 3.0, 3.0/),& - gamma_1 = (/-1., -1., 17.83725, 8.284701, -1., -1., 17.83725, 8.284701, 11.63230/),& - gamma_2 = (/-1., -1., 6.0, 6.0, -1., -1., 6.0, 6.0, 6.0/),& - gamma_3 = (/-1., -1., 2.0, 2.0, -1., -1., 2.0, 2.0, 2.0/),& - gamma_4 = (/-1., -1., 6.0, 6.0, -1., -1., 6.0, 6.0, 6.0/) - - ! Swathing DDT array - type(swath_inputs),dimension(6) :: & - cospswathsIN - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - call cpu_time(driver_time(1)) - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Read in namelists - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Input namelist (cosp setup) - call get_command_argument(1, cosp_input_namelist) - open(10,file=cosp_input_namelist,status='unknown') - read(10,nml=cosp_input) - close(10) - - ! Output namelist (logical flags to turn on/off outputs) - if (command_argument_count() .ge. 2) call get_command_argument(2, cosp_output_namelist) - open(10,file=cosp_output_namelist,status='unknown') - read(10,nml=cosp_output) - close(10) - - ! Shift the namelists read in into a shorter array for cosp_init: - allocate(rttov_instrument_namelists_final(rttov_Ninstruments)) - rttov_instrument_namelists_final(:) = rttov_instrument_namelists(1:rttov_Ninstruments) - - ! Read orbital swathing inputs into structure: - ! Indexing order is ISCCP, MISR, CLOUDSAT-CALIPSO, ATLID, PARASOL, MODIS - cospswathsIN(1) % N_inst_swaths = N_SWATHS_ISCCP - cospswathsIN(1) % inst_localtimes(1:N_SWATHS_ISCCP) = SWATH_LOCALTIMES_ISCCP(1:N_SWATHS_ISCCP) - cospswathsIN(1) % inst_localtime_widths(1:N_SWATHS_ISCCP) = SWATH_WIDTHS_ISCCP(1:N_SWATHS_ISCCP) - cospswathsIN(2) % N_inst_swaths = N_SWATHS_MISR - cospswathsIN(2) % inst_localtimes(1:N_SWATHS_MISR) = SWATH_LOCALTIMES_MISR(1:N_SWATHS_MISR) - cospswathsIN(2) % inst_localtime_widths(1:N_SWATHS_MISR) = SWATH_WIDTHS_MISR(1:N_SWATHS_MISR) - cospswathsIN(3) % N_inst_swaths = N_SWATHS_CSCAL - cospswathsIN(3) % inst_localtimes(1:N_SWATHS_CSCAL) = SWATH_LOCALTIMES_CSCAL(1:N_SWATHS_CSCAL) - cospswathsIN(3) % inst_localtime_widths(1:N_SWATHS_CSCAL) = SWATH_WIDTHS_CSCAL(1:N_SWATHS_CSCAL) - cospswathsIN(4) % N_inst_swaths = N_SWATHS_ATLID - cospswathsIN(4) % inst_localtimes(1:N_SWATHS_ATLID) = SWATH_LOCALTIMES_ATLID(1:N_SWATHS_ATLID) - cospswathsIN(4) % inst_localtime_widths(1:N_SWATHS_ATLID) = SWATH_WIDTHS_ATLID(1:N_SWATHS_ATLID) - cospswathsIN(5) % N_inst_swaths = N_SWATHS_PARASOL - cospswathsIN(5) % inst_localtimes(1:N_SWATHS_PARASOL) = SWATH_LOCALTIMES_PARASOL(1:N_SWATHS_PARASOL) - cospswathsIN(5) % inst_localtime_widths(1:N_SWATHS_PARASOL) = SWATH_WIDTHS_PARASOL(1:N_SWATHS_PARASOL) - cospswathsIN(6) % N_inst_swaths = N_SWATHS_MODIS - cospswathsIN(6) % inst_localtimes(1:N_SWATHS_MODIS) = SWATH_LOCALTIMES_MODIS(1:N_SWATHS_MODIS) - cospswathsIN(6) % inst_localtime_widths(1:N_SWATHS_MODIS) = SWATH_WIDTHS_MODIS(1:N_SWATHS_MODIS) - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Read in sample input data. - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - allocate(lon(Npoints),lat(Npoints),p(Npoints,Nlevels),ph(Npoints,Nlevels), & - zlev(Npoints,Nlevels),zlev_half(Npoints,Nlevels),T(Npoints,Nlevels), & - sh(Npoints,Nlevels),rh(Npoints,Nlevels),tca(Npoints,Nlevels), & - cca(Npoints,Nlevels),mr_lsliq(Npoints,Nlevels),mr_lsice(Npoints,Nlevels), & - mr_ccliq(Npoints,Nlevels),mr_ccice(Npoints,Nlevels), & - fl_lsrain(Npoints,Nlevels),fl_lssnow(Npoints,Nlevels), & - fl_lsgrpl(Npoints,Nlevels),fl_ccrain(Npoints,Nlevels), & - fl_ccsnow(Npoints,Nlevels),Reff(Npoints,Nlevels,N_HYDRO), & - dtau_s(Npoints,Nlevels),dtau_c(Npoints,Nlevels),dem_s(Npoints,Nlevels), & - dem_c(Npoints,Nlevels),skt(Npoints),psfc(Npoints),landmask(Npoints), & - mr_ozone(Npoints,Nlevels),u_wind(Npoints),v_wind(Npoints),sunlit(Npoints), & - frac_out(Npoints,Ncolumns,Nlevels),surfelev(Npoints),year(Npoints), & - month(Npoints),day(Npoints),hour(Npoints),minute(Npoints),seconds(Npoints)) - - ! Set some fields to masked values if the COSP offline driver outputs are inconsistent - year(:) = R_UNDEF - month(:) = R_UNDEF - day(:) = R_UNDEF - hour(:) = R_UNDEF - minute(:) = R_UNDEF - seconds(:) = R_UNDEF - - fileIN = trim(dinput)//trim(finput) - call nc_read_input_file(fileIN,Npoints,Nlevels,N_HYDRO,lon,lat,p,ph,zlev,zlev_half, & - T,sh,rh,tca,cca,mr_lsliq,mr_lsice,mr_ccliq,mr_ccice,fl_lsrain, & - fl_lssnow,fl_lsgrpl,fl_ccrain,fl_ccsnow,Reff,dtau_s,dtau_c, & - dem_s,dem_c,skt,psfc,landmask,mr_ozone,u_wind,v_wind,sunlit, & - emsfc_lw,geomode,Nlon,Nlat,surfelev,year,month,day,hour, & - minute,seconds) - call cpu_time(driver_time(2)) - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Which simulators need to be run? Look at which outputs are requested. - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (Lpctisccp .or. Lclisccp .or. Lboxptopisccp .or. Lboxtauisccp .or. Ltauisccp .or. & - Lcltisccp .or. Lmeantbisccp .or. Lmeantbclrisccp .or. Lalbisccp) Lisccp = .true. - if (LclMISR) Lmisr = .true. - if (Lcltmodis .or. Lclwmodis .or. Lclimodis .or. Lclhmodis .or. Lclmmodis .or. & - Lcllmodis .or. Ltautmodis .or. Ltauwmodis .or. Ltauimodis .or. Ltautlogmodis .or. & - Ltauwlogmodis .or. Ltauilogmodis .or. Lreffclwmodis .or. Lreffclimodis .or. & - Lpctmodis .or. Llwpmodis .or. Liwpmodis .or. Lclmodis) Lmodis = .true. - if (Lclcalipso2 .or. Lclcalipso .or. Lclhcalipso .or. Lcllcalipso .or. Lclmcalipso & - .or. Lcltcalipso .or. Lcltlidarradar .or. Lclcalipsoliq .or. Lclcalipsoice .or. & - Lclcalipsoun .or. Lclcalipsotmp .or. Lclcalipsotmpliq .or. Lclcalipsotmpice .or. & - Lclcalipsotmpun .or. Lcltcalipsoliq .or. Lcltcalipsoice .or. Lcltcalipsoun .or. & - Lclhcalipsoliq .or. Lclhcalipsoice .or. Lclhcalipsoun .or. Lclmcalipsoliq .or. & - Lclmcalipsoice .or. Lclmcalipsoun .or. Lcllcalipsoliq .or. Lcllcalipsoice .or. & - Lcllcalipsoun .or. LlidarBetaMol532 .or. LcfadLidarsr532 .or. Lcltlidarradar .or. & - Lcltlidarradar .or. Lclopaquecalipso .or. Lclthincalipso .or. Lclzopaquecalipso & - .or. Lclcalipsoopaque .or. Lclcalipsothin .or. Lclcalipsozopaque .or. & - Lclcalipsoopacity .or. Lclopaquetemp .or. Lclthintemp .or. Lclzopaquetemp .or. & - Lclopaquemeanz .or. Lclthinmeanz .or. Lclthinemis .or. Lclopaquemeanzse .or. & - Lclthinmeanzse .or. Lclzopaquecalipsose) Lcalipso = .true. - - if (LlidarBetaMol532gr .or. LcfadLidarsr532gr .or. Latb532gr .or. LclgrLidar532 .or. & - LclhgrLidar532 .or. LcllgrLidar532 .or. LclmgrLidar532 .or. LcltgrLidar532) & - LgrLidar532 = .true. - - if (LlidarBetaMol355 .or. LcfadLidarsr355 .or. Latb355 .or. Lclatlid .or. & - Lclhatlid .or. Lcllatlid .or. Lclmatlid .or. Lcltatlid) & - Latlid = .true. - - if (LcfadDbze94 .or. Ldbze94 .or. Lcltlidarradar) Lcloudsat = .true. - - if (LcfadDbze94 .or. Ldbze94 .or. Lcltlidarradar .or. Lptradarflag0 .or. Lptradarflag1 & - .or. Lptradarflag2 .or. Lptradarflag3 .or. Lptradarflag4 .or. Lptradarflag5 .or. & - Lptradarflag6 .or. Lptradarflag7 .or. Lptradarflag8 .or. Lptradarflag9 .or. & - Lradarpia) Lcloudsat = .true. - if (Lparasolrefl) Lparasol = .true. - - if (rttov_Ninstruments .gt. 0) Lrttov = .true. - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! IF IMPLEMTING COSP IN GCM, HERE IS WHERE TO START!!! - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Initialize COSP - !*This only needs to be done the first time that COSP is called.* - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - ! Initialize quickbeam_optics, also if two-moment radar microphysics scheme is wanted... - if (cloudsat_micro_scheme == 'MMF_v3.5_two_moment') then - ldouble = .true. - lsingle = .false. - endif - call quickbeam_optics_init() - - ! Initialize the distributional parameters for hydrometeors in radar simulator - call hydro_class_init(lsingle,ldouble,sd) - - ! Initialize COSP simulator - call COSP_INIT(Lisccp, Lmodis, Lmisr, Lcloudsat, Lcalipso, LgrLidar532, Latlid, & - Lparasol, Lrttov, & - cloudsat_radar_freq, cloudsat_k2, cloudsat_use_gas_abs, & - cloudsat_do_ray, isccp_topheight, isccp_topheight_direction, surface_radar, & - rcfg_cloudsat, use_vgrid, csat_vgrid, Nlvgrid, Nlevels, cloudsat_micro_scheme, & - rttov_Ninstruments, rttov_instrument_namelists_final, rttov_configs, & - debug=rttov_verbose) - call cpu_time(driver_time(3)) - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Construct output derived type. - ! *NOTE* The "construct/destroy" subroutines are local to this module and should be - ! modified for your configuration. E.g. it may be overkill to query each field. - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - call construct_cosp_outputs(Lpctisccp, Lclisccp, Lboxptopisccp, Lboxtauisccp, & - Ltauisccp, Lcltisccp, Lmeantbisccp, Lmeantbclrisccp, Lalbisccp, LclMISR, & - Lcltmodis, Lclwmodis, Lclimodis, Lclhmodis, Lclmmodis, Lcllmodis, Ltautmodis, & - Ltauwmodis, Ltauimodis, Ltautlogmodis, Ltauwlogmodis, Ltauilogmodis, & - Lreffclwmodis, Lreffclimodis, Lpctmodis, Llwpmodis, Liwpmodis, Lclmodis, Latb532, & - Latb532gr, Latb355, LlidarBetaMol532, LlidarBetaMol532gr, LlidarBetaMol355, & - LcfadLidarsr532, LcfadLidarsr532gr, LcfadLidarsr355, Lclcalipso2, & - Lclcalipso, LclgrLidar532, Lclatlid, Lclhcalipso, Lcllcalipso, Lclmcalipso, & - Lcltcalipso, LclhgrLidar532, LcllgrLidar532, LclmgrLidar532, LcltgrLidar532, & - Lclhatlid, Lcllatlid, Lclmatlid, Lcltatlid, Lcltlidarradar, Lcloudsat_tcc, & - Lcloudsat_tcc2, Lclcalipsoliq, & - Lclcalipsoice, Lclcalipsoun, Lclcalipsotmp, Lclcalipsotmpliq, Lclcalipsotmpice, & - Lclcalipsotmpun, Lcltcalipsoliq, Lcltcalipsoice, Lcltcalipsoun, Lclhcalipsoliq, & - Lclhcalipsoice, Lclhcalipsoun, Lclmcalipsoliq, Lclmcalipsoice, Lclmcalipsoun, & - Lcllcalipsoliq, Lcllcalipsoice, Lcllcalipsoun, Lclopaquecalipso, Lclthincalipso, & - Lclzopaquecalipso, Lclcalipsoopaque, Lclcalipsothin, Lclcalipsozopaque, & - Lclcalipsoopacity, Lclopaquetemp, Lclthintemp, Lclzopaquetemp, Lclopaquemeanz, & - Lclthinmeanz, Lclthinemis, Lclopaquemeanzse, Lclthinmeanzse, Lclzopaquecalipsose, & - LcfadDbze94, Ldbze94, Lparasolrefl, & - Lptradarflag0,Lptradarflag1,Lptradarflag2,Lptradarflag3,Lptradarflag4, & - Lptradarflag5,Lptradarflag6,Lptradarflag7,Lptradarflag8,Lptradarflag9,Lradarpia, & - Lwr_occfreq, Lcfodd, & - rttov_Ninstruments,rttov_configs, & - Npoints, Ncolumns, Nlevels, Nlvgrid_local, use_vgrid, cospOUT) - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Break COSP up into pieces and loop over each COSP 'chunk'. - ! nChunks = # Points to Process (nPoints) / # Points per COSP iteration (nPoints_it) - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (MOD(nPoints,nPoints_it) .eq. 0) then - nChunks = Npoints/Npoints_it - else - nChunks = nPoints/nPoints_it+1 - endif - if (nPoints .eq. nPoints_it) nChunks = 1 - do iChunk=1,nChunks - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Determine indices for "chunking" (again, if necessary) - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - if (nChunks .eq. 1) then - start_idx = 1 - end_idx = nPoints - nPtsPerIt = nPoints - else - start_idx = (iChunk-1)*nPoints_it+1 - end_idx = iChunk*nPoints_it - if (end_idx .gt. nPoints) end_idx=nPoints - nPtsPerIt = end_idx-start_idx+1 - endif - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Construct COSP input types - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (iChunk .eq. 1) then - call construct_cospIN(Nptsperit,nColumns,nLevels,rttov_Ninstruments,cospIN,emis_grey=1.0_wp) - ! call construct_cospIN(Nptsperit,nColumns,nLevels,rttov_Ninstruments,cospIN) - call construct_cospstateIN(Nptsperit,nLevels,cospstateIN) - endif - if (iChunk .eq. nChunks) then - call destroy_cospIN(cospIN) - call destroy_cospstateIN(cospstateIN) - call construct_cospIN(Nptsperit,nColumns,nLevels,rttov_Ninstruments,cospIN,emis_grey=1.0_wp) - ! call construct_cospIN(Nptsperit,nColumns,nLevels,rttov_Ninstruments,cospIN) - call construct_cospstateIN(Nptsperit,nLevels,cospstateIN) - endif - call cpu_time(driver_time(4)) - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Populate input types with model fields. - ! Here the 3D sample model fields (temperature,pressure,etc...) are ordered from the - ! surface-2-TOA, whereas COSP expects all fields to be ordered from TOA-2-SFC. So the - ! vertical fields are flipped prior to storing to COSP input type. - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - cospIN%emsfc_lw = emsfc_lw - cospIN%rcfg_cloudsat = rcfg_cloudsat - cospIN%cfg_rttov => rttov_configs - cospIN%cospswathsIN = cospswathsIN ! Swathing information for each non-RTTOV simulator. - - cospstateIN%hgt_matrix = zlev(start_idx:end_idx,Nlevels:1:-1) ! km - cospstateIN%sunlit = sunlit(start_idx:end_idx) ! 0-1 - cospstateIN%skt = skt(start_idx:end_idx) ! K - cospstateIN%surfelev = surfelev(start_idx:end_idx) ! m - cospstateIN%land = landmask(start_idx:end_idx) ! 0-1 (*note* model specific) - cospstateIN%qv = sh(start_idx:end_idx,Nlevels:1:-1) ! kg/kg - cospstateIN%at = T(start_idx:end_idx,Nlevels:1:-1) ! K - cospstateIN%pfull = p(start_idx:end_idx,Nlevels:1:-1) ! Pa - ! Pressure at interface (nlevels+1). Set uppermost interface to 0. - cospstateIN%phalf(:,2:Nlevels+1) = ph(start_idx:end_idx,Nlevels:1:-1) ! Pa - cospstateIN%phalf(:,1) = 0._wp - ! Surface pressure - if (any(psfc(start_idx:end_idx) .lt. 0._wp)) then - print*,'Some of values of the surface pressure field are negative. Replacing all psfc values with the lowest boundary pressure.' - psfc(start_idx:end_idx) = cospstateIN%phalf(start_idx:end_idx,Nlevels+1) - end if - cospstateIN%psfc = psfc(start_idx:end_idx) ! Pa - ! Height of bottom interfaces of model layers (nlevels). - ! cospstateIN%hgt_matrix_half(:,1) contains the bottom of the top layer. - ! cospstateIN%hgt_matrix_half(:,Nlevels) contains the bottom of the surface layer. - cospstateIN%hgt_matrix_half(:,1:Nlevels) = zlev_half(start_idx:end_idx,Nlevels:1:-1) ! km - - ! Assign RTTOV values - ! Keeping these structures since refl and emis could come from model input - ! cospstateIN%emis_in(:,:) = 1._wp - ! cospstateIN%refl_in(:,:) = 1._wp - - ! Well-mixed gases are not provided in COSP offline input, so hardcoding them in. - ! Units are kg/kg over moist air. - ! Note: user_tracegas_input should be true in instrument namelists for the COSP offline driver - cospstateIN%co2(:,:) = 5.241e-04 - cospstateIN%ch4(:,:) = 9.139e-07 - cospstateIN%n2o(:,:) = 4.665e-07 - cospstateIN%co(:,:) = 2.098e-07 - cospstateIN%so2(:,:) = 2.0e-11 - - if (any(year(start_idx:end_idx) .lt. 0._wp)) then - print*,'Some of values of the input year field are masked. Replacing with 1 so RTTOV will run.' - where (year(start_idx:end_idx) .lt. 0._wp) - year(start_idx:end_idx) = 1 - end where - end if - if (any(month(start_idx:end_idx) .lt. 0._wp)) then - print*,'Some of values of the input month field are masked. Replacing with 1 so RTTOV will run.' - where (month(start_idx:end_idx) .lt. 0._wp) - month(start_idx:end_idx) = 1 - end where - end if - if (any(day(start_idx:end_idx) .lt. 0._wp)) then - print*,'Some of values of the input day field are masked. Replacing with 1 so RTTOV will run.' - where (day(start_idx:end_idx) .lt. 0._wp) - day(start_idx:end_idx) = 1 - end where - end if - if (any(hour(start_idx:end_idx) .lt. 0._wp)) then - print*,'Some of values of the input hour field are masked. Replacing with 1 so RTTOV will run.' - where (hour(start_idx:end_idx) .lt. 0._wp) - hour(start_idx:end_idx) = 1._wp - end where - end if - if (any(minute(start_idx:end_idx) .lt. 0._wp)) then - print*,'Some of values of the input minute field are masked. Replacing with 1 so RTTOV will run.' - where (minute(start_idx:end_idx) .lt. 0._wp) - minute(start_idx:end_idx) = 1._wp - end where - end if - if (any(seconds(start_idx:end_idx) .lt. 0._wp)) then - print*,'Some of values of the input minute field are masked. Replacing with 1 so RTTOV will run.' - where (seconds(start_idx:end_idx) .lt. 0._wp) - seconds(start_idx:end_idx) = 1._wp - end where - end if - - ! Read in date and time objects for RTTOV - cospstateIN%rttov_date(:,1) = year(start_idx:end_idx) - cospstateIN%rttov_date(:,2) = month(start_idx:end_idx) - cospstateIN%rttov_date(:,3) = day(start_idx:end_idx) - - cospstateIN%rttov_time(:,1) = hour(start_idx:end_idx) - cospstateIN%rttov_time(:,2) = minute(start_idx:end_idx) - cospstateIN%rttov_time(:,3) = seconds(start_idx:end_idx) - - cospstateIN%sza = 0._wp ! Hard code to zero for the offline driver. - - ! From the data input file - cospstateIN%u_sfc = u_wind(start_idx:end_idx) - cospstateIN%v_sfc = v_wind(start_idx:end_idx) - cospstateIN%lat = lat(start_idx:end_idx) - cospstateIN%lon = lon(start_idx:end_idx) - - cospstateIN%o3 = mr_ozone(start_idx:end_idx,Nlevels:1:-1) - cospstateIN%tca = tca(start_idx:end_idx,Nlevels:1:-1) - - ! Combine large-scale and convective cloud mixing ratios for RTTOV [kg/kg] - cospstateIN%cloudIce = mr_lsice(start_idx:end_idx,Nlevels:1:-1) + mr_ccice(start_idx:end_idx,Nlevels:1:-1) - cospstateIN%cloudLiq = mr_lsliq(start_idx:end_idx,Nlevels:1:-1) + mr_ccliq(start_idx:end_idx,Nlevels:1:-1) - - ! Combine large-scale and convective cloud effective radii into effective diameters for RTTOV - ! Reff(Npoints,Nlevels,N_HYDRO) - ! The weighted Reff is given by: Reff_net = (M_1 + M_2) / (M_1/Reff_1 + M_2/Reff_2) - cospstateIN%DeffLiq(:,:) = 0._wp ! Initialize for zero everywhere. - where ((mr_lsliq(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) .and. (mr_ccliq(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp)) - cospstateIN%DeffLiq(:,:) = 2._wp * 1.0e6 * (mr_lsliq(start_idx:end_idx,Nlevels:1:-1) + mr_ccliq(start_idx:end_idx,Nlevels:1:-1)) / (mr_lsliq(start_idx:end_idx,Nlevels:1:-1) / Reff(start_idx:end_idx,Nlevels:1:-1,I_LSCLIQ) + mr_ccliq(start_idx:end_idx,Nlevels:1:-1) / Reff(start_idx:end_idx,Nlevels:1:-1,I_CVCLIQ)) - elsewhere (mr_lsliq(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) - cospstateIN%DeffLiq(:,:) = 2._wp * 1.0e6 * Reff(start_idx:end_idx,Nlevels:1:-1,I_LSCLIQ) - elsewhere (mr_ccliq(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) - cospstateIN%DeffLiq(:,:) = 2._wp * 1.0e6 * Reff(start_idx:end_idx,Nlevels:1:-1,I_CVCLIQ) - end where - - cospstateIN%DeffIce(:,:) = 0._wp ! Initialize for zero everywhere. - where ((mr_lsice(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) .and. (mr_ccice(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp)) - cospstateIN%DeffIce(:,:) = 2._wp * 1.0e6 * (mr_lsice(start_idx:end_idx,Nlevels:1:-1) + mr_ccice(start_idx:end_idx,Nlevels:1:-1)) / (mr_lsice(start_idx:end_idx,Nlevels:1:-1) / Reff(start_idx:end_idx,Nlevels:1:-1,I_LSCICE) + mr_ccice(start_idx:end_idx,Nlevels:1:-1) / Reff(start_idx:end_idx,Nlevels:1:-1,I_CVCICE)) - elsewhere (mr_lsice(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) - cospstateIN%DeffIce(:,:) = 2._wp * 1.0e6 * Reff(start_idx:end_idx,Nlevels:1:-1,I_LSCICE) - elsewhere (mr_ccice(start_idx:end_idx,Nlevels:1:-1) .gt. 0._wp) - cospstateIN%DeffIce(:,:) = 2._wp * 1.0e6 * Reff(start_idx:end_idx,Nlevels:1:-1,I_CVCICE) - end where - - ! RTTOV doesn't consider precip flux for longwave, but it could be used when simulating MW instruments. - ! Graupel goes in the snow category, arbitrarily - cospstateIN%fl_rain = fl_lsrain(start_idx:end_idx,Nlevels:1:-1) + fl_ccrain(start_idx:end_idx,Nlevels:1:-1) - cospstateIN%fl_snow = fl_lssnow(start_idx:end_idx,Nlevels:1:-1) + fl_ccsnow(start_idx:end_idx,Nlevels:1:-1) + & - fl_lsgrpl(start_idx:end_idx,Nlevels:1:-1) - - ! Inputs not supplied in the UKMO test data - cospstateIN%rttov_sfcmask = landmask(start_idx:end_idx) ! (0=ocn,1=land,2=seaice). No sea ice in UKMO input here. - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Generate subcolumns and compute optical inputs. - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - call subsample_and_optics(nPtsPerIt,nLevels,nColumns,N_HYDRO,overlap, & - use_vgrid,use_precipitation_fluxes,lidar_ice_type,sd, & - tca(start_idx:end_idx,Nlevels:1:-1),cca(start_idx:end_idx,Nlevels:1:-1), & - fl_lsrain(start_idx:end_idx,Nlevels:1:-1),fl_lssnow(start_idx:end_idx,Nlevels:1:-1), & - fl_lsgrpl(start_idx:end_idx,Nlevels:1:-1),fl_ccrain(start_idx:end_idx,Nlevels:1:-1), & - fl_ccsnow(start_idx:end_idx,Nlevels:1:-1),mr_lsliq(start_idx:end_idx,Nlevels:1:-1), & - mr_lsice(start_idx:end_idx,Nlevels:1:-1),mr_ccliq(start_idx:end_idx,Nlevels:1:-1), & - mr_ccice(start_idx:end_idx,Nlevels:1:-1),Reff(start_idx:end_idx,Nlevels:1:-1,:), & - dtau_c(start_idx:end_idx,nLevels:1:-1),dtau_s(start_idx:end_idx,nLevels:1:-1), & - dem_c(start_idx:end_idx,nLevels:1:-1),dem_s(start_idx:end_idx,nLevels:1:-1), & - cospstateIN,cospIN) - - call cpu_time(driver_time(6)) - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Call COSP - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - cosp_status = COSP_SIMULATOR(cospIN, cospstateIN, cospOUT,start_idx,end_idx,rttov_verbose) - do ij=1,size(cosp_status,1) - if (cosp_status(ij) .ne. '') print*,trim(cosp_status(ij)) - end do - - call cpu_time(driver_time(7)) - end do - - print*,'Time to read in data: ',driver_time(2)-driver_time(1) - print*,'Time to initialize: ',driver_time(3)-driver_time(2) - print*,'Time to construct types: ',driver_time(4)-driver_time(3) - print*,'Time to compute optics: ',driver_time(6)-driver_time(4) - print*,'Time to run COSP: ',driver_time(7)-driver_time(6) - print*,'Total time: ',driver_time(7)-driver_time(1) - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Output - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - call write_cosp2_output(Npoints, Ncolumns, Nlevels, rttov_Ninstruments, zlev(1,Nlevels:1:-1), lon, lat, cospOUT, foutput) - - call cpu_time(driver_time(8)) - print*,'Time to write to output: ',driver_time(8)-driver_time(7) - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Free up memory - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (rttov_verbose) print*,'Calling "destroy_cosp_outputs".' - call destroy_cosp_outputs(cospOUT) - if (associated(cospIN%cfg_rttov)) then - if (rttov_verbose) print*,'Calling "rttov_cleanup".' - call rttov_cleanup(cospIN) - endif - if (rttov_verbose) print*,'Calling "destroy_cospIN".' - call destroy_cospIN(cospIN) - if (rttov_verbose) print*,'Calling "destroy_cospstateIN".' - call destroy_cospstateIN(cospstateIN) - if (rttov_verbose) print*,'Calling "cosp_cleanUp".' - call cosp_cleanUp() - if (rttov_verbose) print*,'all done.' - -contains - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE subsample_and_optics - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - subroutine subsample_and_optics(nPoints, nLevels, nColumns, nHydro, overlap, use_vgrid, & - use_precipitation_fluxes, lidar_ice_type, sd, tca, cca, fl_lsrainIN, fl_lssnowIN, & - fl_lsgrplIN, fl_ccrainIN, fl_ccsnowIN, mr_lsliq, mr_lsice, mr_ccliq, mr_ccice, & - reffIN, dtau_c, dtau_s, dem_c, dem_s, cospstateIN, cospIN) - ! Inputs - integer,intent(in) :: nPoints, nLevels, nColumns, nHydro, overlap, lidar_ice_type - real(wp),intent(in),dimension(nPoints,nLevels) :: tca,cca,mr_lsliq,mr_lsice,mr_ccliq, & - mr_ccice,dtau_c,dtau_s,dem_c,dem_s,fl_lsrainIN,fl_lssnowIN,fl_lsgrplIN,fl_ccrainIN,& - fl_ccsnowIN - real(wp),intent(in),dimension(nPoints,nLevels,nHydro) :: reffIN - logical,intent(in) :: use_vgrid ! .false.: outputs on model levels - ! .true.: outputs on evenly-spaced vertical levels. - logical,intent(in) :: use_precipitation_fluxes - type(size_distribution),intent(inout) :: sd - - ! Outputs - type(cosp_optical_inputs),intent(inout) :: cospIN - type(cosp_column_inputs),intent(inout) :: cospstateIN - - ! Local variables - type(rng_state),allocatable,dimension(:) :: rngs ! Seeds for random number generator - integer,dimension(:),allocatable :: seed - integer,dimension(:),allocatable :: cloudsat_preclvl_index - integer :: i,j,k - real(wp) :: zstep - real(wp),dimension(:,:), allocatable :: & - ls_p_rate, cv_p_rate, frac_ls, frac_cv, prec_ls, prec_cv,g_vol - real(wp),dimension(:,:,:), allocatable :: & - frac_prec, MODIS_cloudWater, MODIS_cloudIce, fracPrecipIce, fracPrecipIce_statGrid,& - MODIS_watersize,MODIS_iceSize, MODIS_opticalThicknessLiq,MODIS_opticalThicknessIce - real(wp),dimension(:,:,:,:),allocatable :: & - mr_hydro, Reff, Np - real(wp),dimension(nPoints,nLevels) :: & - column_frac_out, column_prec_out, fl_lsrain, fl_lssnow, fl_lsgrpl, fl_ccrain, fl_ccsnow - real(wp),dimension(nPoints,nColumns,Nlvgrid_local) :: tempOut - logical :: cmpGases=.true. - - if (Ncolumns .gt. 1) then - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Generate subcolumns for clouds (SCOPS) and precipitation type (PREC_SCOPS) - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! RNG used for subcolumn generation - allocate(rngs(nPoints),seed(nPoints)) - seed(:)=0 - seed = int(cospstateIN%phalf(:,Nlevels+1)) ! In case of NPoints=1 - ! *NOTE* Chunking will change the seed - if (NPoints .gt. 1) seed=int((cospstateIN%phalf(:,Nlevels+1)-minval(cospstateIN%phalf(:,Nlevels+1)))/ & - (maxval(cospstateIN%phalf(:,Nlevels+1))-minval(cospstateIN%phalf(:,Nlevels+1)))*100000) + 1 - call init_rng(rngs, seed) - - ! Call scops - call scops(NPoints,Nlevels,Ncolumns,rngs,tca,cca,overlap,cospIN%frac_out,0) - deallocate(seed,rngs) - - ! Sum up precipitation rates - allocate(ls_p_rate(nPoints,nLevels),cv_p_rate(nPoints,Nlevels)) - if(use_precipitation_fluxes) then - ls_p_rate(:,1:nLevels) = fl_lsrainIN + fl_lssnowIN + fl_lsgrplIN - cv_p_rate(:,1:nLevels) = fl_ccrainIN + fl_ccsnowIN - else - ls_p_rate(:,1:nLevels) = 0 ! mixing_ratio(rain) + mixing_ratio(snow) + mixing_ratio (groupel) - cv_p_rate(:,1:nLevels) = 0 ! mixing_ratio(rain) + mixing_ratio(snow) - endif - - ! Call PREC_SCOPS - allocate(frac_prec(nPoints,nColumns,nLevels)) - call prec_scops(nPoints,nLevels,nColumns,ls_p_rate,cv_p_rate,cospIN%frac_out,frac_prec) - deallocate(ls_p_rate,cv_p_rate) - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Compute fraction in each gridbox for precipitation and cloud type. - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Allocate - allocate(frac_ls(nPoints,nLevels),prec_ls(nPoints,nLevels), & - frac_cv(nPoints,nLevels),prec_cv(nPoints,nLevels)) - - ! Initialize - frac_ls(1:nPoints,1:nLevels) = 0._wp - prec_ls(1:nPoints,1:nLevels) = 0._wp - frac_cv(1:nPoints,1:nLevels) = 0._wp - prec_cv(1:nPoints,1:nLevels) = 0._wp - do j=1,nPoints - do k=1,nLevels - do i=1,nColumns - if (cospIN%frac_out(j,i,k) .eq. 1) frac_ls(j,k) = frac_ls(j,k)+1._wp - if (cospIN%frac_out(j,i,k) .eq. 2) frac_cv(j,k) = frac_cv(j,k)+1._wp - if (frac_prec(j,i,k) .eq. 1) prec_ls(j,k) = prec_ls(j,k)+1._wp - if (frac_prec(j,i,k) .eq. 2) prec_cv(j,k) = prec_cv(j,k)+1._wp - if (frac_prec(j,i,k) .eq. 3) prec_cv(j,k) = prec_cv(j,k)+1._wp - if (frac_prec(j,i,k) .eq. 3) prec_ls(j,k) = prec_ls(j,k)+1._wp - enddo - frac_ls(j,k)=frac_ls(j,k)/nColumns - frac_cv(j,k)=frac_cv(j,k)/nColumns - prec_ls(j,k)=prec_ls(j,k)/nColumns - prec_cv(j,k)=prec_cv(j,k)/nColumns - enddo - enddo - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Assign gridmean mixing-ratios (mr_XXXXX), effective radius (ReffIN) and number - ! concentration (not defined) to appropriate sub-column. Here we are using scops. - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - allocate(mr_hydro(nPoints,nColumns,nLevels,nHydro), & - Reff(nPoints,nColumns,nLevels,nHydro), & - Np(nPoints,nColumns,nLevels,nHydro)) - - ! Initialize - mr_hydro(:,:,:,:) = 0._wp - Reff(:,:,:,:) = 0._wp - Np(:,:,:,:) = 0._wp - do k=1,nColumns - ! Subcolumn cloud fraction - column_frac_out = cospIN%frac_out(:,k,:) - - ! LS clouds - where (column_frac_out == I_LSC) - mr_hydro(:,k,:,I_LSCLIQ) = mr_lsliq - mr_hydro(:,k,:,I_LSCICE) = mr_lsice - Reff(:,k,:,I_LSCLIQ) = ReffIN(:,:,I_LSCLIQ) - Reff(:,k,:,I_LSCICE) = ReffIN(:,:,I_LSCICE) - ! CONV clouds - elsewhere (column_frac_out == I_CVC) - mr_hydro(:,k,:,I_CVCLIQ) = mr_ccliq - mr_hydro(:,k,:,I_CVCICE) = mr_ccice - Reff(:,k,:,I_CVCLIQ) = ReffIN(:,:,I_CVCLIQ) - Reff(:,k,:,I_CVCICE) = ReffIN(:,:,I_CVCICE) - end where - - ! Subcolumn precipitation - column_prec_out = frac_prec(:,k,:) - - ! LS Precipitation - where ((column_prec_out == 1) .or. (column_prec_out == 3) ) - Reff(:,k,:,I_LSRAIN) = ReffIN(:,:,I_LSRAIN) - Reff(:,k,:,I_LSSNOW) = ReffIN(:,:,I_LSSNOW) - Reff(:,k,:,I_LSGRPL) = ReffIN(:,:,I_LSGRPL) - ! CONV precipitation - elsewhere ((column_prec_out == 2) .or. (column_prec_out == 3)) - Reff(:,k,:,I_CVRAIN) = ReffIN(:,:,I_CVRAIN) - Reff(:,k,:,I_CVSNOW) = ReffIN(:,:,I_CVSNOW) - end where - enddo - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Convert the subcolumn mixing ratio and precipitation fluxes from gridbox mean - ! values to fraction-based values. - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Initialize - fl_lsrain(:,:) = 0._wp - fl_lssnow(:,:) = 0._wp - fl_lsgrpl(:,:) = 0._wp - fl_ccrain(:,:) = 0._wp - fl_ccsnow(:,:) = 0._wp - do k=1,nLevels - do j=1,nPoints - ! In-cloud mixing ratios. - if (frac_ls(j,k) .ne. 0.) then - mr_hydro(j,:,k,I_LSCLIQ) = mr_hydro(j,:,k,I_LSCLIQ)/frac_ls(j,k) - mr_hydro(j,:,k,I_LSCICE) = mr_hydro(j,:,k,I_LSCICE)/frac_ls(j,k) - endif - if (frac_cv(j,k) .ne. 0.) then - mr_hydro(j,:,k,I_CVCLIQ) = mr_hydro(j,:,k,I_CVCLIQ)/frac_cv(j,k) - mr_hydro(j,:,k,I_CVCICE) = mr_hydro(j,:,k,I_CVCICE)/frac_cv(j,k) - endif - ! Precipitation - if (use_precipitation_fluxes) then - if (prec_ls(j,k) .ne. 0.) then - fl_lsrain(j,k) = fl_lsrainIN(j,k)/prec_ls(j,k) - fl_lssnow(j,k) = fl_lssnowIN(j,k)/prec_ls(j,k) - fl_lsgrpl(j,k) = fl_lsgrplIN(j,k)/prec_ls(j,k) - endif - if (prec_cv(j,k) .ne. 0.) then - fl_ccrain(j,k) = fl_ccrainIN(j,k)/prec_cv(j,k) - fl_ccsnow(j,k) = fl_ccsnowIN(j,k)/prec_cv(j,k) - endif - else - if (prec_ls(j,k) .ne. 0.) then - mr_hydro(j,:,k,I_LSRAIN) = mr_hydro(j,:,k,I_LSRAIN)/prec_ls(j,k) - mr_hydro(j,:,k,I_LSSNOW) = mr_hydro(j,:,k,I_LSSNOW)/prec_ls(j,k) - mr_hydro(j,:,k,I_LSGRPL) = mr_hydro(j,:,k,I_LSGRPL)/prec_ls(j,k) - endif - if (prec_cv(j,k) .ne. 0.) then - mr_hydro(j,:,k,I_CVRAIN) = mr_hydro(j,:,k,I_CVRAIN)/prec_cv(j,k) - mr_hydro(j,:,k,I_CVSNOW) = mr_hydro(j,:,k,I_CVSNOW)/prec_cv(j,k) - endif - endif - enddo - enddo - deallocate(frac_ls,prec_ls,frac_cv,prec_cv) - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Convert precipitation fluxes to mixing ratios - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (use_precipitation_fluxes) then - ! LS rain - call cosp_precip_mxratio(nPoints, nLevels, nColumns, cospstateIN%pfull, & - cospstateIN%at, frac_prec, 1._wp, n_ax(I_LSRAIN), n_bx(I_LSRAIN), & - alpha_x(I_LSRAIN), c_x(I_LSRAIN), d_x(I_LSRAIN), g_x(I_LSRAIN), & - a_x(I_LSRAIN), b_x(I_LSRAIN), gamma_1(I_LSRAIN), gamma_2(I_LSRAIN), & - gamma_3(I_LSRAIN), gamma_4(I_LSRAIN), fl_lsrain, & - mr_hydro(:,:,:,I_LSRAIN), Reff(:,:,:,I_LSRAIN)) - ! LS snow - call cosp_precip_mxratio(nPoints, nLevels, nColumns, cospstateIN%pfull, & - cospstateIN%at, frac_prec, 1._wp, n_ax(I_LSSNOW), n_bx(I_LSSNOW), & - alpha_x(I_LSSNOW), c_x(I_LSSNOW), d_x(I_LSSNOW), g_x(I_LSSNOW), & - a_x(I_LSSNOW), b_x(I_LSSNOW), gamma_1(I_LSSNOW), gamma_2(I_LSSNOW), & - gamma_3(I_LSSNOW), gamma_4(I_LSSNOW), fl_lssnow, & - mr_hydro(:,:,:,I_LSSNOW), Reff(:,:,:,I_LSSNOW)) - ! CV rain - call cosp_precip_mxratio(nPoints, nLevels, nColumns, cospstateIN%pfull, & - cospstateIN%at, frac_prec, 2._wp, n_ax(I_CVRAIN), n_bx(I_CVRAIN), & - alpha_x(I_CVRAIN), c_x(I_CVRAIN), d_x(I_CVRAIN), g_x(I_CVRAIN), & - a_x(I_CVRAIN), b_x(I_CVRAIN), gamma_1(I_CVRAIN), gamma_2(I_CVRAIN), & - gamma_3(I_CVRAIN), gamma_4(I_CVRAIN), fl_ccrain, & - mr_hydro(:,:,:,I_CVRAIN), Reff(:,:,:,I_CVRAIN)) - ! CV snow - call cosp_precip_mxratio(nPoints, nLevels, nColumns, cospstateIN%pfull, & - cospstateIN%at, frac_prec, 2._wp, n_ax(I_CVSNOW), n_bx(I_CVSNOW), & - alpha_x(I_CVSNOW), c_x(I_CVSNOW), d_x(I_CVSNOW), g_x(I_CVSNOW), & - a_x(I_CVSNOW), b_x(I_CVSNOW), gamma_1(I_CVSNOW), gamma_2(I_CVSNOW), & - gamma_3(I_CVSNOW), gamma_4(I_CVSNOW), fl_ccsnow, & - mr_hydro(:,:,:,I_CVSNOW), Reff(:,:,:,I_CVSNOW)) - ! LS groupel. - call cosp_precip_mxratio(nPoints, nLevels, nColumns, cospstateIN%pfull, & - cospstateIN%at, frac_prec, 1._wp, n_ax(I_LSGRPL), n_bx(I_LSGRPL), & - alpha_x(I_LSGRPL), c_x(I_LSGRPL), d_x(I_LSGRPL), g_x(I_LSGRPL), & - a_x(I_LSGRPL), b_x(I_LSGRPL), gamma_1(I_LSGRPL), gamma_2(I_LSGRPL), & - gamma_3(I_LSGRPL), gamma_4(I_LSGRPL), fl_lsgrpl, & - mr_hydro(:,:,:,I_LSGRPL), Reff(:,:,:,I_LSGRPL)) - deallocate(frac_prec) - endif - - else - cospIN%frac_out(:,:,:) = 1 - allocate(mr_hydro(nPoints,1,nLevels,nHydro),Reff(nPoints,1,nLevels,nHydro), & - Np(nPoints,1,nLevels,nHydro)) - mr_hydro(:,1,:,I_LSCLIQ) = mr_lsliq - mr_hydro(:,1,:,I_LSCICE) = mr_lsice - mr_hydro(:,1,:,I_CVCLIQ) = mr_ccliq - mr_hydro(:,1,:,I_CVCICE) = mr_ccice - Reff(:,1,:,:) = ReffIN - endif - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! 11 micron emissivity - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (Lisccp) then - call cosp_simulator_optics(nPoints,nColumns,nLevels,cospIN%frac_out,dem_c,dem_s, & - cospIN%emiss_11) - endif - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! 0.67 micron optical depth - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (Lisccp .or. Lmisr .or. Lmodis) then - call cosp_simulator_optics(nPoints,nColumns,nLevels,cospIN%frac_out,dtau_c,dtau_s, & - cospIN%tau_067) - endif - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! LIDAR Polarized optics - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (Lcalipso) then - call lidar_optics(nPoints, nColumns, nLevels, 4, lidar_ice_type, 532, .false., & - mr_hydro(:,:,:,I_LSCLIQ), mr_hydro(:,:,:,I_LSCICE), mr_hydro(:,:,:,I_CVCLIQ), & - mr_hydro(:,:,:,I_CVCICE), ReffIN(:,:,I_LSCLIQ), ReffIN(:,:,I_LSCICE), & - ReffIN(:,:,I_CVCLIQ), ReffIN(:,:,I_CVCICE), cospstateIN%pfull, & - cospstateIN%phalf, cospstateIN%at, cospIN%beta_mol_calipso, & - cospIN%betatot_calipso, cospIN%tau_mol_calipso, cospIN%tautot_calipso, & - cospIN%tautot_S_liq, cospIN%tautot_S_ice, cospIN%betatot_ice_calipso, & - cospIN%betatot_liq_calipso, cospIN%tautot_ice_calipso, cospIN%tautot_liq_calipso) - endif - - if (LgrLidar532) then - call lidar_optics(nPoints, nColumns, nLevels, 4, lidar_ice_type, 532, .true., & - mr_hydro(:,:,:,I_LSCLIQ), mr_hydro(:,:,:,I_LSCICE), mr_hydro(:,:,:,I_CVCLIQ), & - mr_hydro(:,:,:,I_CVCICE), ReffIN(:,:,I_LSCLIQ), ReffIN(:,:,I_LSCICE), & - ReffIN(:,:,I_CVCLIQ), ReffIN(:,:,I_CVCICE), cospstateIN%pfull, & - cospstateIN%phalf, cospstateIN%at, cospIN%beta_mol_grLidar532, & - cospIN%betatot_grLidar532, cospIN%tau_mol_grLidar532, cospIN%tautot_grLidar532) - endif - - if (Latlid) then - call lidar_optics(nPoints, nColumns, nLevels, 4, lidar_ice_type, 355, .false., & - mr_hydro(:,:,:,I_LSCLIQ), mr_hydro(:,:,:,I_LSCICE), mr_hydro(:,:,:,I_CVCLIQ), & - mr_hydro(:,:,:,I_CVCICE), ReffIN(:,:,I_LSCLIQ), ReffIN(:,:,I_LSCICE), & - ReffIN(:,:,I_CVCLIQ), ReffIN(:,:,I_CVCICE), cospstateIN%pfull, & - cospstateIN%phalf, cospstateIN%at, cospIN%beta_mol_atlid, cospIN%betatot_atlid,& - cospIN%tau_mol_atlid, cospIN%tautot_atlid) - endif - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! CLOUDSAT RADAR OPTICS - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (lcloudsat) then - - ! Compute gaseous absorption (assume identical for each subcolun) - allocate(g_vol(nPoints,nLevels)) - g_vol(:,:)=0._wp - do i=1,nPoints - do j=1,nLevels - if (rcfg_cloudsat%use_gas_abs == 1 .or. (rcfg_cloudsat%use_gas_abs == 2 .and. j .eq. 1)) then - g_vol(i,j) = gases(cospstateIN%pfull(i,j), cospstateIN%at(i,j),cospstateIN%qv(i,j),rcfg_cloudsat%freq) - endif - cospIN%g_vol_cloudsat(i,:,j)=g_vol(i,j) - end do - end do - - ! Loop over all subcolumns - allocate(fracPrecipIce(nPoints,nColumns,nLevels)) - fracPrecipIce(:,:,:) = 0._wp - do k=1,nColumns - call quickbeam_optics(sd, rcfg_cloudsat, nPoints, nLevels, R_UNDEF, & - mr_hydro(:,k,:,1:nHydro)*1000._wp, Reff(:,k,:,1:nHydro)*1.e6_wp,& - Np(:,k,:,1:nHydro), cospstateIN%pfull, cospstateIN%at, & - cospstateIN%qv, cospIN%z_vol_cloudsat(1:nPoints,k,:), & - cospIN%kr_vol_cloudsat(1:nPoints,k,:)) - - ! At each model level, what fraction of the precipitation is frozen? - where(mr_hydro(:,k,:,I_LSRAIN) .gt. 0 .or. mr_hydro(:,k,:,I_LSSNOW) .gt. 0 .or. & - mr_hydro(:,k,:,I_CVRAIN) .gt. 0 .or. mr_hydro(:,k,:,I_CVSNOW) .gt. 0 .or. & - mr_hydro(:,k,:,I_LSGRPL) .gt. 0) - fracPrecipIce(:,k,:) = (mr_hydro(:,k,:,I_LSSNOW) + mr_hydro(:,k,:,I_CVSNOW) + & - mr_hydro(:,k,:,I_LSGRPL)) / & - (mr_hydro(:,k,:,I_LSSNOW) + mr_hydro(:,k,:,I_CVSNOW) + mr_hydro(:,k,:,I_LSGRPL) + & - mr_hydro(:,k,:,I_LSRAIN) + mr_hydro(:,k,:,I_CVRAIN)) - elsewhere - fracPrecipIce(:,k,:) = 0._wp - endwhere - enddo - - ! Regrid frozen fraction to Cloudsat/Calipso statistical grid - if (use_vgrid) then - allocate(fracPrecipIce_statGrid(nPoints,nColumns,Nlvgrid_local)) - fracPrecipIce_statGrid(:,:,:) = 0._wp - call cosp_change_vertical_grid(Npoints, Ncolumns, Nlevels, cospstateIN%hgt_matrix(:,Nlevels:1:-1), & - cospstateIN%hgt_matrix_half(:,Nlevels:1:-1), fracPrecipIce(:,:,Nlevels:1:-1), Nlvgrid_local, & - vgrid_zl(Nlvgrid_local:1:-1), vgrid_zu(Nlvgrid_local:1:-1), fracPrecipIce_statGrid(:,:,Nlvgrid_local:1:-1)) - - ! Find proper layer above de surface elevation to compute precip flags in Cloudsat/Calipso statistical grid - allocate(cloudsat_preclvl_index(nPoints)) - cloudsat_preclvl_index(:) = 0._wp - ! Compute the zstep distance between two atmopsheric layers - zstep = vgrid_zl(1)-vgrid_zl(2) - ! Computing altitude index for precip flags calculation (one layer above surfelev layer) - cloudsat_preclvl_index(:) = cloudsat_preclvl - floor( cospstateIN%surfelev(:)/zstep ) - - ! For near-surface diagnostics, we only need the frozen fraction at one layer. - do i=1,nPoints - cospIN%fracPrecipIce(i,:) = fracPrecipIce_statGrid(i,:,cloudsat_preclvl_index(i)) - enddo - deallocate(cloudsat_preclvl_index) - deallocate(fracPrecipIce_statGrid) - endif - - endif - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! MODIS optics - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (Lmodis) then - allocate(MODIS_cloudWater(nPoints,nColumns,nLevels), & - MODIS_cloudIce(nPoints,nColumns,nLevels), & - MODIS_waterSize(nPoints,nColumns,nLevels), & - MODIS_iceSize(nPoints,nColumns,nLevels), & - MODIS_opticalThicknessLiq(nPoints,nColumns,nLevels), & - MODIS_opticalThicknessIce(nPoints,nColumns,nLevels)) - ! Cloud water - call cosp_simulator_optics(nPoints,nColumns,nLevels,cospIN%frac_out, & - mr_hydro(:,:,:,I_CVCLIQ),mr_hydro(:,:,:,I_LSCLIQ),MODIS_cloudWater) - ! Cloud ice - call cosp_simulator_optics(nPoints,nColumns,nLevels,cospIN%frac_out, & - mr_hydro(:,:,:,I_CVCICE),mr_hydro(:,:,:,I_LSCICE),MODIS_cloudIce) - ! Water droplet size - call cosp_simulator_optics(nPoints,nColumns,nLevels,cospIN%frac_out, & - Reff(:,:,:,I_CVCLIQ),Reff(:,:,:,I_LSCLIQ),MODIS_waterSize) - ! Ice crystal size - call cosp_simulator_optics(nPoints,nColumns,nLevels,cospIN%frac_out, & - Reff(:,:,:,I_CVCICE),Reff(:,:,:,I_LSCICE),MODIS_iceSize) - - ! Partition optical thickness into liquid and ice parts - call modis_optics_partition(nPoints, nLevels, nColumns, MODIS_cloudWater, & - MODIS_cloudIce, MODIS_waterSize, MODIS_iceSize, cospIN%tau_067, & - MODIS_opticalThicknessLiq, MODIS_opticalThicknessIce) - - ! Compute assymetry parameter and single scattering albedo - call modis_optics(nPoints, nLevels, nColumns, MODIS_opticalThicknessLiq, & - MODIS_waterSize*1.0e6_wp, MODIS_opticalThicknessIce, & - MODIS_iceSize*1.0e6_wp, cospIN%fracLiq, cospIN%asym, cospIN%ss_alb) - - ! Deallocate memory - deallocate(MODIS_cloudWater,MODIS_cloudIce,MODIS_WaterSize,MODIS_iceSize, & - MODIS_opticalThicknessLiq,MODIS_opticalThicknessIce,mr_hydro, & - Np,Reff) - endif - end subroutine subsample_and_optics - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE construct_cospIN - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - subroutine construct_cospIN(npoints,ncolumns,nlevels,ninst_rttov,y,emis_grey) - ! Inputs - integer,intent(in) :: & - npoints, & ! Number of horizontal gridpoints - ncolumns, & ! Number of subcolumns - nlevels, & ! Number of vertical levels - ninst_rttov ! Number of RTTOV instruments - ! Outputs - type(cosp_optical_inputs),intent(out) :: y - ! Optional input - real(kind=wp),intent(in),target, optional :: & - emis_grey - - ! Dimensions - y%Npoints = Npoints - y%Ncolumns = Ncolumns - y%Nlevels = Nlevels - y%Ninst_rttov = Ninst_rttov - y%Npart = 4 - y%Nrefl = PARASOL_NREFL - allocate(y%frac_out(npoints, ncolumns,nlevels)) - - if (present(emis_grey)) y%emis_grey => emis_grey - - if (Lmodis .or. Lmisr .or. Lisccp) then - allocate(y%tau_067(npoints, ncolumns,nlevels),& - y%emiss_11(npoints, ncolumns,nlevels)) - endif - if (Lcalipso) then - allocate(y%betatot_calipso(npoints, ncolumns,nlevels),& - y%betatot_ice_calipso(npoints, ncolumns,nlevels),& - y%betatot_liq_calipso(npoints, ncolumns,nlevels),& - y%tautot_calipso(npoints, ncolumns,nlevels),& - y%tautot_ice_calipso(npoints, ncolumns,nlevels),& - y%tautot_liq_calipso(npoints, ncolumns,nlevels),& - y%beta_mol_calipso(npoints, nlevels),& - y%tau_mol_calipso(npoints, nlevels),& - y%tautot_S_ice(npoints, ncolumns ),& - y%tautot_S_liq(npoints, ncolumns )) - endif - - if (LgrLidar532) then - allocate(y%beta_mol_grLidar532(npoints, nlevels),& - y%betatot_grLidar532(npoints, ncolumns,nlevels),& - y%tau_mol_grLidar532(npoints, nlevels),& - y%tautot_grLidar532(npoints, ncolumns,nlevels)) - endif - - if (Latlid) then - allocate(y%beta_mol_atlid(npoints, nlevels),& - y%betatot_atlid(npoints, ncolumns,nlevels),& - y%tau_mol_atlid(npoints, nlevels),& - y%tautot_atlid(npoints, ncolumns,nlevels)) - endif - - if (Lcloudsat) then - allocate(y%z_vol_cloudsat(npoints, ncolumns,nlevels),& - y%kr_vol_cloudsat(npoints, ncolumns,nlevels),& - y%g_vol_cloudsat(npoints, ncolumns,nlevels),& - y%fracPrecipIce(npoints, ncolumns)) - endif - if (Lmodis) then - allocate(y%fracLiq(npoints, ncolumns,nlevels),& - y%asym(npoints, ncolumns,nlevels),& - y%ss_alb(npoints, ncolumns,nlevels)) - endif - - end subroutine construct_cospIN - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE construct_cospstateIN - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - subroutine construct_cospstateIN(npoints,nlevels,y) - ! Inputs - integer,intent(in) :: & - npoints, & ! Number of horizontal gridpoints - nlevels ! Number of vertical levels - - ! Outputs - type(cosp_column_inputs),intent(out) :: y - - allocate(y%sunlit(npoints),y%skt(npoints),y%land(npoints),y%at(npoints,nlevels), & - y%psfc(npoints), & - y%pfull(npoints,nlevels),y%phalf(npoints,nlevels+1),y%qv(npoints,nlevels), & - y%o3(npoints,nlevels),y%hgt_matrix(npoints,nlevels),y%u_sfc(npoints), & - y%v_sfc(npoints),y%lat(npoints),y%lon(nPoints),y%rttov_sfcmask(nPoints), & - y%co(npoints,nlevels),y%n2o(npoints,nlevels),y%ch4(npoints,nlevels), & - y%co2(npoints,nlevels), y%so2(npoints,nlevels), & - y%cloudIce(nPoints,nLevels),y%cloudLiq(nPoints,nLevels),y%surfelev(nPoints),& - y%DeffLiq(nPoints,nLevels),y%DeffIce(nPoints,nLevels), & - y%fl_snow(nPoints,nLevels),y%fl_rain(nPoints,nLevels), & - y%tca(nPoints,nLevels),y%hgt_matrix_half(nPoints,nlevels), & - y%rttov_date(nPoints,3),y%rttov_time(nPoints,3),y%sza(nPoints)) - - - end subroutine construct_cospstateIN - - ! ###################################################################################### - ! SUBROUTINE construct_cosp_outputs - ! - ! This subroutine allocates output fields based on input logical flag switches. - ! ###################################################################################### - subroutine construct_cosp_outputs(Lpctisccp,Lclisccp,& - Lboxptopisccp,Lboxtauisccp,Ltauisccp,Lcltisccp, & - Lmeantbisccp,Lmeantbclrisccp,Lalbisccp,LclMISR, & - Lcltmodis,Lclwmodis,Lclimodis,Lclhmodis,Lclmmodis, & - Lcllmodis,Ltautmodis,Ltauwmodis,Ltauimodis, & - Ltautlogmodis,Ltauwlogmodis,Ltauilogmodis, & - Lreffclwmodis,Lreffclimodis,Lpctmodis,Llwpmodis, & - Liwpmodis,Lclmodis,Latb532,Latb532gr,Latb355, & - LlidarBetaMol532,LlidarBetaMol532gr,LlidarBetaMol355,& - LcfadLidarsr532,LcfadLidarsr532gr,LcfadLidarsr355, & - Lclcalipso2,Lclcalipso,LclgrLidar532,Lclatlid, & - Lclhcalipso,Lcllcalipso,Lclmcalipso,Lcltcalipso, & - LclhgrLidar532,LcllgrLidar532,LclmgrLidar532, & - LcltgrLidar532,Lclhatlid,Lcllatlid,Lclmatlid, & - Lcltatlid,Lcltlidarradar,Lcloudsat_tcc, & - Lcloudsat_tcc2,Lclcalipsoliq, & - Lclcalipsoice,Lclcalipsoun,Lclcalipsotmp, & - Lclcalipsotmpliq,Lclcalipsotmpice,Lclcalipsotmpun, & - Lcltcalipsoliq,Lcltcalipsoice,Lcltcalipsoun, & - Lclhcalipsoliq,Lclhcalipsoice,Lclhcalipsoun, & - Lclmcalipsoliq,Lclmcalipsoice,Lclmcalipsoun, & - Lcllcalipsoliq,Lcllcalipsoice,Lcllcalipsoun, & - Lclopaquecalipso,Lclthincalipso,Lclzopaquecalipso, & - Lclcalipsoopaque,Lclcalipsothin,Lclcalipsozopaque, & - Lclcalipsoopacity,Lclopaquetemp,Lclthintemp, & - Lclzopaquetemp,Lclopaquemeanz,Lclthinmeanz, & - Lclthinemis,Lclopaquemeanzse,Lclthinmeanzse, & - Lclzopaquecalipsose,LcfadDbze94,Ldbze94,Lparasolrefl,& - Lptradarflag0,Lptradarflag1,Lptradarflag2, & - Lptradarflag3,Lptradarflag4,Lptradarflag5, & - Lptradarflag6,Lptradarflag7,Lptradarflag8, & - Lptradarflag9,Lradarpia,Lwr_occfreq,Lcfodd, & - Ninst_rttov,rttov_configs, & - Npoints,Ncolumns,Nlevels,Nlvgrid,use_vgrid,x) - ! Inputs - logical,intent(in) :: & - Lpctisccp, & ! ISCCP mean cloud top pressure - Lclisccp, & ! ISCCP cloud area fraction - Lboxptopisccp, & ! ISCCP CTP in each column - Lboxtauisccp, & ! ISCCP optical epth in each column - Ltauisccp, & ! ISCCP mean optical depth - Lcltisccp, & ! ISCCP total cloud fraction - Lmeantbisccp, & ! ISCCP mean all-sky 10.5micron brightness temperature - Lmeantbclrisccp, & ! ISCCP mean clear-sky 10.5micron brightness temperature - Lalbisccp, & ! ISCCP mean cloud albedo - LclMISR, & ! MISR cloud fraction - Lcltmodis, & ! MODIS total cloud fraction - Lclwmodis, & ! MODIS liquid cloud fraction - Lclimodis, & ! MODIS ice cloud fraction - Lclhmodis, & ! MODIS high-level cloud fraction - Lclmmodis, & ! MODIS mid-level cloud fraction - Lcllmodis, & ! MODIS low-level cloud fraction - Ltautmodis, & ! MODIS total cloud optical thicknes - Ltauwmodis, & ! MODIS liquid optical thickness - Ltauimodis, & ! MODIS ice optical thickness - Ltautlogmodis, & ! MODIS total cloud optical thickness (log10 mean) - Ltauwlogmodis, & ! MODIS liquid optical thickness (log10 mean) - Ltauilogmodis, & ! MODIS ice optical thickness (log10 mean) - Lreffclwmodis, & ! MODIS liquid cloud particle size - Lreffclimodis, & ! MODIS ice particle size - Lpctmodis, & ! MODIS cloud top pressure - Llwpmodis, & ! MODIS cloud liquid water path - Liwpmodis, & ! MODIS cloud ice water path - Lclmodis, & ! MODIS cloud area fraction - Latb532, & ! CALIPSO attenuated total backscatter (532nm) - Latb532gr, & ! GROUND LIDAR @ 532NM attenuated total backscatter (532nm) - Latb355, & ! ATLID attenuated total backscatter (355nm) - LlidarBetaMol532, & ! CALIPSO molecular backscatter (532nm) - LlidarBetaMol532gr,&! GROUND LIDAR @ 532NM molecular backscatter (532nm) - LlidarBetaMol355, & ! ATLID molecular backscatter (355nm) - LcfadLidarsr532, & ! CALIPSO scattering ratio CFAD - LcfadLidarsr532gr,& ! GROUND LIDAR @ 532NM scattering ratio CFAD - LcfadLidarsr355, & ! ATLID scattering ratio CFAD - Lclcalipso2, & ! CALIPSO cloud fraction undetected by cloudsat - Lclcalipso, & ! CALIPSO cloud area fraction - LclgrLidar532, & ! GROUND LIDAR @ 532NM cloud area fraction - Lclatlid, & ! ATLID cloud area fraction - Lclhcalipso, & ! CALIPSO high-level cloud fraction - Lcllcalipso, & ! CALIPSO low-level cloud fraction - Lclmcalipso, & ! CALIPSO mid-level cloud fraction - Lcltcalipso, & ! CALIPSO total cloud fraction - LclhgrLidar532, & ! GROUND LIDAR @ 532NM high-level cloud fraction - LcllgrLidar532, & ! GROUND LIDAR @ 532NM low-level cloud fraction - LclmgrLidar532, & ! GROUND LIDAR @ 532NM mid-level cloud fraction - LcltgrLidar532, & ! GROUND LIDAR @ 532NM total cloud fraction - Lclhatlid, & ! ATLID high-level cloud fraction - Lcllatlid, & ! ATLID low-level cloud fraction - Lclmatlid, & ! ATLID mid-level cloud fraction - Lcltatlid, & ! ATLID total cloud fraction - Lcltlidarradar, & ! CALIPSO-CLOUDSAT total cloud fraction - Lcloudsat_tcc, & ! - Lcloudsat_tcc2, & ! - Lclcalipsoliq, & ! CALIPSO liquid cloud area fraction - Lclcalipsoice, & ! CALIPSO ice cloud area fraction - Lclcalipsoun, & ! CALIPSO undetected cloud area fraction - Lclcalipsotmp, & ! CALIPSO undetected cloud area fraction - Lclcalipsotmpliq, & ! CALIPSO liquid cloud area fraction - Lclcalipsotmpice, & ! CALIPSO ice cloud area fraction - Lclcalipsotmpun, & ! CALIPSO undetected cloud area fraction - Lcltcalipsoliq, & ! CALIPSO liquid total cloud fraction - Lcltcalipsoice, & ! CALIPSO ice total cloud fraction - Lcltcalipsoun, & ! CALIPSO undetected total cloud fraction - Lclhcalipsoliq, & ! CALIPSO high-level liquid cloud fraction - Lclhcalipsoice, & ! CALIPSO high-level ice cloud fraction - Lclhcalipsoun, & ! CALIPSO high-level undetected cloud fraction - Lclmcalipsoliq, & ! CALIPSO mid-level liquid cloud fraction - Lclmcalipsoice, & ! CALIPSO mid-level ice cloud fraction - Lclmcalipsoun, & ! CALIPSO mid-level undetected cloud fraction - Lcllcalipsoliq, & ! CALIPSO low-level liquid cloud fraction - Lcllcalipsoice, & ! CALIPSO low-level ice cloud fraction - Lcllcalipsoun, & ! CALIPSO low-level undetected cloud fraction - Lclopaquecalipso, & ! CALIPSO opaque cloud cover (2D Map) - Lclthincalipso, & ! CALIPSO thin cloud cover (2D Map) - Lclzopaquecalipso,& ! CALIPSO z_opaque altitude (opaque clouds only, 2D Map) - Lclcalipsoopaque, & ! CALIPSO opaque cloud profiles 3D fraction - Lclcalipsothin, & ! CALIPSO thin cloud profiles 3D fraction - Lclcalipsozopaque,& ! CALIPSO z_opaque 3D fraction - Lclcalipsoopacity,& ! CALIPSO opacity 3D fraction - Lclopaquetemp, & ! CALIPSO opaque cloud temperature - Lclthintemp, & ! CALIPSO thin cloud temperature - Lclzopaquetemp, & ! CALIPSO z_opaque temperature - Lclopaquemeanz, & ! CALIPSO opaque cloud altitude - Lclthinmeanz, & ! CALIPSO thin cloud altitude - Lclthinemis, & ! CALIPSO thin cloud emissivity - Lclopaquemeanzse, & ! CALIPSO opaque cloud altitude with respect to SE - Lclthinmeanzse, & ! CALIPSO thin cloud altitude with respect to SE - Lclzopaquecalipsose,& ! CALIPSO z_opaque altitude with respect to SE - LcfadDbze94, & ! CLOUDSAT radar reflectivity CFAD - Ldbze94, & ! CLOUDSAT radar reflectivity - LparasolRefl, & ! PARASOL reflectance - Lptradarflag0, & ! CLOUDSAT - Lptradarflag1, & ! CLOUDSAT - Lptradarflag2, & ! CLOUDSAT - Lptradarflag3, & ! CLOUDSAT - Lptradarflag4, & ! CLOUDSAT - Lptradarflag5, & ! CLOUDSAT - Lptradarflag6, & ! CLOUDSAT - Lptradarflag7, & ! CLOUDSAT - Lptradarflag8, & ! CLOUDSAT - Lptradarflag9, & ! CLOUDSAT - Lradarpia, & ! CLOUDSAT - Lwr_occfreq, & ! CloudSat+MODIS joint diagnostics - Lcfodd, & ! CloudSat+MODIS joint diagnostics - use_vgrid - - integer,intent(in) :: & - Npoints, & ! Number of sampled points - Ncolumns, & ! Number of subgrid columns - Nlevels, & ! Number of model levels - Nlvgrid, & ! Number of levels in L3 stats computation - Ninst_rttov - - type(rttov_cfg), dimension(:),intent(in) :: & - rttov_configs - - ! Outputs - type(cosp_outputs),intent(out) :: & - x ! COSP output structure - - integer :: & - i - - ! ISCCP simulator outputs - if (Lboxtauisccp) allocate(x%isccp_boxtau(Npoints,Ncolumns)) - if (Lboxptopisccp) allocate(x%isccp_boxptop(Npoints,Ncolumns)) - if (Lclisccp) allocate(x%isccp_fq(Npoints,numISCCPTauBins,numISCCPPresBins)) - if (Lcltisccp) allocate(x%isccp_totalcldarea(Npoints)) - if (Lpctisccp) allocate(x%isccp_meanptop(Npoints)) - if (Ltauisccp) allocate(x%isccp_meantaucld(Npoints)) - if (Lmeantbisccp) allocate(x%isccp_meantb(Npoints)) - if (Lmeantbclrisccp) allocate(x%isccp_meantbclr(Npoints)) - if (Lalbisccp) allocate(x%isccp_meanalbedocld(Npoints)) - - ! MISR simulator - if (LclMISR) then - allocate(x%misr_fq(Npoints,numMISRTauBins,numMISRHgtBins)) - ! *NOTE* These 3 fields are not output, but were part of the v1.4.0 cosp_misr, so - ! they are still computed. Should probably have a logical to control these - ! outputs. - allocate(x%misr_dist_model_layertops(Npoints,numMISRHgtBins)) - allocate(x%misr_meanztop(Npoints)) - allocate(x%misr_cldarea(Npoints)) - endif - - ! MODIS simulator - if (Lcltmodis) allocate(x%modis_Cloud_Fraction_Total_Mean(Npoints)) - if (Lclwmodis) allocate(x%modis_Cloud_Fraction_Water_Mean(Npoints)) - if (Lclimodis) allocate(x%modis_Cloud_Fraction_Ice_Mean(Npoints)) - if (Lclhmodis) allocate(x%modis_Cloud_Fraction_High_Mean(Npoints)) - if (Lclmmodis) allocate(x%modis_Cloud_Fraction_Mid_Mean(Npoints)) - if (Lcllmodis) allocate(x%modis_Cloud_Fraction_Low_Mean(Npoints)) - if (Ltautmodis) allocate(x%modis_Optical_Thickness_Total_Mean(Npoints)) - if (Ltauwmodis) allocate(x%modis_Optical_Thickness_Water_Mean(Npoints)) - if (Ltauimodis) allocate(x%modis_Optical_Thickness_Ice_Mean(Npoints)) - if (Ltautlogmodis) allocate(x%modis_Optical_Thickness_Total_LogMean(Npoints)) - if (Ltauwlogmodis) allocate(x%modis_Optical_Thickness_Water_LogMean(Npoints)) - if (Ltauilogmodis) allocate(x%modis_Optical_Thickness_Ice_LogMean(Npoints)) - if (Lreffclwmodis) allocate(x%modis_Cloud_Particle_Size_Water_Mean(Npoints)) - if (Lreffclimodis) allocate(x%modis_Cloud_Particle_Size_Ice_Mean(Npoints)) - if (Lpctmodis) allocate(x%modis_Cloud_Top_Pressure_Total_Mean(Npoints)) - if (Llwpmodis) allocate(x%modis_Liquid_Water_Path_Mean(Npoints)) - if (Liwpmodis) allocate(x%modis_Ice_Water_Path_Mean(Npoints)) - if (Lclmodis) then - allocate(x%modis_Optical_Thickness_vs_Cloud_Top_Pressure(nPoints,numModisTauBins,numMODISPresBins)) - allocate(x%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(nPoints,numModisTauBins,numMODISPresBins)) - allocate(x%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(nPoints,numModisTauBins,numMODISPresBins)) - allocate(x%modis_Optical_thickness_vs_ReffLIQ(nPoints,numMODISTauBins,numMODISReffLiqBins)) - allocate(x%modis_Optical_Thickness_vs_ReffICE(nPoints,numMODISTauBins,numMODISReffIceBins)) - endif - - ! LIDAR simulator - if (LlidarBetaMol532) allocate(x%calipso_beta_mol(Npoints,Nlevels)) - if (Latb532) allocate(x%calipso_beta_tot(Npoints,Ncolumns,Nlevels)) - if (LcfadLidarsr532) then - allocate(x%calipso_srbval(SR_BINS+1)) - allocate(x%calipso_cfad_sr(Npoints,SR_BINS,Nlvgrid)) - allocate(x%calipso_betaperp_tot(Npoints,Ncolumns,Nlevels)) - endif - if (Lclcalipso) allocate(x%calipso_lidarcld(Npoints,Nlvgrid)) - if (Lclhcalipso .or. Lclmcalipso .or. Lcllcalipso .or. Lcltcalipso) then - allocate(x%calipso_cldlayer(Npoints,LIDAR_NCAT)) - endif - if (Lclcalipsoice .or. Lclcalipsoliq .or. Lclcalipsoun) then - allocate(x%calipso_lidarcldphase(Npoints,Nlvgrid,6)) - endif - if (Lclcalipsotmp .or. Lclcalipsotmpliq .or. Lclcalipsoice .or. Lclcalipsotmpun .or. Lclcalipsotmpice) then - allocate(x%calipso_lidarcldtmp(Npoints,LIDAR_NTEMP,5)) - endif - if (Lcllcalipsoice .or. Lclmcalipsoice .or. Lclhcalipsoice .or. & - Lcltcalipsoice .or. Lcllcalipsoliq .or. Lclmcalipsoliq .or. & - Lclhcalipsoliq .or. Lcltcalipsoliq .or. Lcllcalipsoun .or. & - Lclmcalipsoun .or. Lclhcalipsoun .or. Lcltcalipsoun) then - allocate(x%calipso_cldlayerphase(Npoints,LIDAR_NCAT,6)) - endif - if (Lclopaquecalipso .or. Lclthincalipso .or. Lclzopaquecalipso) then - allocate(x%calipso_cldtype(Npoints,LIDAR_NTYPE)) - endif - if (Lclopaquetemp .or. Lclthintemp .or. Lclzopaquetemp) then - allocate(x%calipso_cldtypetemp(Npoints,LIDAR_NTYPE)) - endif - if (Lclopaquemeanz .or. Lclthinmeanz) then - allocate(x%calipso_cldtypemeanz(Npoints,2)) - endif - if (Lclopaquemeanzse .or. Lclthinmeanzse .or. Lclzopaquecalipsose) then - allocate(x%calipso_cldtypemeanzse(Npoints,3)) - endif - if (Lclthinemis) then - allocate(x%calipso_cldthinemis(Npoints)) - endif - if (Lclcalipsoopaque .or. Lclcalipsothin .or. Lclcalipsozopaque .or. Lclcalipsoopacity) then - allocate(x%calipso_lidarcldtype(Npoints,Nlvgrid,LIDAR_NTYPE+1)) - endif - - ! GROUND LIDAR @ 532NM simulator - if (LlidarBetaMol532gr) allocate(x%grLidar532_beta_mol(Npoints,Nlevels)) - if (Latb532gr) allocate(x%grLidar532_beta_tot(Npoints,Ncolumns,Nlevels)) - if (LcfadLidarsr532gr) then - allocate(x%grLidar532_srbval(SR_BINS+1)) - allocate(x%grLidar532_cfad_sr(Npoints,SR_BINS,Nlvgrid)) - endif - if (LclgrLidar532) allocate(x%grLidar532_lidarcld(Npoints,Nlvgrid)) - if (LclhgrLidar532 .or. LclmgrLidar532 .or. LcllgrLidar532 .or. LcltgrLidar532) then - allocate(x%grLidar532_cldlayer(Npoints,LIDAR_NCAT)) - endif - - ! ATLID simulator - if (LlidarBetaMol355) allocate(x%atlid_beta_mol(Npoints,Nlevels)) - if (Latb355) allocate(x%atlid_beta_tot(Npoints,Ncolumns,Nlevels)) - if (LcfadLidarsr355) then - allocate(x%atlid_srbval(SR_BINS+1)) - allocate(x%atlid_cfad_sr(Npoints,SR_BINS,Nlvgrid)) - endif - if (Lclatlid) allocate(x%atlid_lidarcld(Npoints,Nlvgrid)) - if (Lclhatlid .or. Lclmatlid .or. Lcllatlid .or. Lcltatlid) then - allocate(x%atlid_cldlayer(Npoints,LIDAR_NCAT)) - endif - - ! PARASOL - if (Lparasolrefl) then - allocate(x%parasolPix_refl(Npoints,Ncolumns,PARASOL_NREFL)) - allocate(x%parasolGrid_refl(Npoints,PARASOL_NREFL)) - endif - - ! Cloudsat simulator - if (Ldbze94) allocate(x%cloudsat_Ze_tot(Npoints,Ncolumns,Nlevels)) - if (LcfadDbze94) allocate(x%cloudsat_cfad_ze(Npoints,cloudsat_DBZE_BINS,Nlvgrid)) - if (Lptradarflag0 .or. Lptradarflag1 .or. Lptradarflag2 .or. Lptradarflag3 .or. & - Lptradarflag4 .or. Lptradarflag5 .or. Lptradarflag6 .or. Lptradarflag7 .or. & - Lptradarflag8 .or. Lptradarflag9) then - if (use_vgrid) then - allocate(x%cloudsat_precip_cover(Npoints,cloudsat_DBZE_BINS)) - else - print*,'WARNING: CLOUDSAT Precipitation occurrence diagnostics not available when use_vgrid=FALSE.' - print*,'WARNING: Turning CLOUDSAT Precipitation occurrence diagnostcs OFF' - endif - endif - if (Lradarpia) then - if (use_vgrid) then - allocate(x%cloudsat_pia(Npoints)) - else - print*,'WARNING: CLOUDSAT Precipitation occurrence diagnostics not available when use_vgrid=FALSE.' - print*,'WARNING: Turning CLOUDSAT Precipitation occurrence diagnostcs OFF' - endif - endif - - ! Combined CALIPSO/CLOUDSAT fields - if (Lclcalipso2) allocate(x%lidar_only_freq_cloud(Npoints,Nlvgrid)) - if (Lcltlidarradar) allocate(x%radar_lidar_tcc(Npoints)) - if (Lcloudsat_tcc) allocate(x%cloudsat_tcc(Npoints)) - if (Lcloudsat_tcc2) allocate(x%cloudsat_tcc2(Npoints)) - - ! Joint MODIS/CloudSat Statistics - if (Lwr_occfreq) allocate(x%wr_occfreq_ntotal(Npoints,WR_NREGIME)) - if (Lcfodd) allocate(x%cfodd_ntotal(Npoints,CFODD_NDBZE,CFODD_NICOD,CFODD_NCLASS)) - - ! RTTOV - Allocate output for multiple instruments - ! Do I not need to allocate the number of instruments? Because each rttov output DDT will be a pointer? - if (Lrttov) then - x % Ninst_rttov = Ninst_rttov - allocate(x % rttov_outputs(Ninst_rttov)) ! Need to allocate a pointer? - do i=1,Ninst_rttov - x % rttov_outputs(i) % nchan_out = rttov_configs(i) % nchan_out - if (rttov_configs(i) % Lrttov_pc) then ! Treat PC-RTTOV fields as clear-sky only for now - allocate(x % rttov_outputs(i) % channel_indices(rttov_configs(i) % nchan_out)) - if (rttov_configs(i) % Lrttov_bt) then ! Brightness temp - allocate(x % rttov_outputs(i) % bt_total_pc(Npoints,rttov_configs(i) % nchan_out)) - ! if (Lrttov_cld .or. Lrttov_aer) allocate(x%rttov_bt_clear(Npoints,Nchan)) - end if - if (rttov_configs(i) % Lrttov_rad) then ! Radiance - allocate(x % rttov_outputs(i) % rad_total_pc(Npoints,rttov_configs(i) % nchan_out)) - ! if (Lrttov_cld .or. Lrttov_aer) allocate(x%rttov_rad_clear(Npoints,Nchan)) - ! if (Lrttov_cld .or. Lrttov_aer) allocate(x%rttov_rad_cloudy(Npoints,Nchan)) - end if - else - allocate(x % rttov_outputs(i) % channel_indices(rttov_configs(i) % nchan_out)) - if (rttov_configs(i) % Lrttov_bt) then ! Brightness temp - allocate(x % rttov_outputs(i) % bt_total(Npoints,rttov_configs(i) % nchan_out)) - if ((rttov_configs(i) % Lrttov_cld) .or. (rttov_configs(i) % Lrttov_aer)) then - allocate(x % rttov_outputs(i) % bt_clear(Npoints,rttov_configs(i) % nchan_out)) - end if - end if - if (rttov_configs(i) % Lrttov_rad) then ! Radiance - allocate(x % rttov_outputs(i) % rad_total(Npoints,rttov_configs(i) % nchan_out)) - if ((rttov_configs(i) % Lrttov_cld) .or. (rttov_configs(i) % Lrttov_aer)) then - allocate(x % rttov_outputs(i) % rad_clear(Npoints,rttov_configs(i) % nchan_out)) - end if - if ((rttov_configs(i) % Lrttov_cld) .or. (rttov_configs(i) % Lrttov_aer)) then - allocate(x % rttov_outputs(i) % rad_cloudy(Npoints,rttov_configs(i) % nchan_out)) - end if - end if - if (rttov_configs(i) % Lrttov_refl) then ! Reflectance - allocate(x % rttov_outputs(i) % refl_total(Npoints,rttov_configs(i) % nchan_out)) - if ((rttov_configs(i) % Lrttov_cld) .or. (rttov_configs(i) % Lrttov_aer)) then - allocate(x % rttov_outputs(i) % refl_clear(Npoints,rttov_configs(i) % nchan_out)) - end if - end if - end if - end do - else - x % Ninst_rttov = 0 - end if - - end subroutine construct_cosp_outputs - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE destroy_cospIN - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - subroutine destroy_cospIN(y) - type(cosp_optical_inputs),intent(inout) :: y - - if (allocated(y%tau_067)) deallocate(y%tau_067) - if (allocated(y%emiss_11)) deallocate(y%emiss_11) - if (allocated(y%frac_out)) deallocate(y%frac_out) - if (allocated(y%beta_mol_calipso)) deallocate(y%beta_mol_calipso) - if (allocated(y%tau_mol_calipso)) deallocate(y%tau_mol_calipso) - if (allocated(y%betatot_calipso)) deallocate(y%betatot_calipso) - if (allocated(y%betatot_ice_calipso)) deallocate(y%betatot_ice_calipso) - if (allocated(y%betatot_liq_calipso)) deallocate(y%betatot_liq_calipso) - if (allocated(y%tautot_calipso)) deallocate(y%tautot_calipso) - if (allocated(y%tautot_ice_calipso)) deallocate(y%tautot_ice_calipso) - if (allocated(y%tautot_liq_calipso)) deallocate(y%tautot_liq_calipso) - if (allocated(y%tautot_S_liq)) deallocate(y%tautot_S_liq) - if (allocated(y%tautot_S_ice)) deallocate(y%tautot_S_ice) - if (allocated(y%z_vol_cloudsat)) deallocate(y%z_vol_cloudsat) - if (allocated(y%kr_vol_cloudsat)) deallocate(y%kr_vol_cloudsat) - if (allocated(y%g_vol_cloudsat)) deallocate(y%g_vol_cloudsat) - if (allocated(y%asym)) deallocate(y%asym) - if (allocated(y%ss_alb)) deallocate(y%ss_alb) - if (allocated(y%fracLiq)) deallocate(y%fracLiq) - if (allocated(y%beta_mol_grLidar532)) deallocate(y%beta_mol_grLidar532) - if (allocated(y%betatot_grLidar532)) deallocate(y%betatot_grLidar532) - if (allocated(y%tau_mol_grLidar532)) deallocate(y%tau_mol_grLidar532) - if (allocated(y%tautot_grLidar532)) deallocate(y%tautot_grLidar532) - if (allocated(y%beta_mol_atlid)) deallocate(y%beta_mol_atlid) - if (allocated(y%betatot_atlid)) deallocate(y%betatot_atlid) - if (allocated(y%tau_mol_atlid)) deallocate(y%tau_mol_atlid) - if (allocated(y%tautot_atlid)) deallocate(y%tautot_atlid) - if (allocated(y%fracPrecipIce)) deallocate(y%fracPrecipIce) - if (associated(y%cfg_rttov)) nullify(y%cfg_rttov) - end subroutine destroy_cospIN - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE destroy_cospstateIN - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - subroutine destroy_cospstateIN(y) - type(cosp_column_inputs),intent(inout) :: y - - if (allocated(y%sunlit)) deallocate(y%sunlit) - if (allocated(y%skt)) deallocate(y%skt) - if (allocated(y%psfc)) deallocate(y%psfc) - if (allocated(y%land)) deallocate(y%land) - if (allocated(y%rttov_sfcmask)) deallocate(y%rttov_sfcmask) - if (allocated(y%at)) deallocate(y%at) - if (allocated(y%pfull)) deallocate(y%pfull) - if (allocated(y%phalf)) deallocate(y%phalf) - if (allocated(y%qv)) deallocate(y%qv) - if (allocated(y%hgt_matrix)) deallocate(y%hgt_matrix) - if (allocated(y%hgt_matrix_half)) deallocate(y%hgt_matrix_half) - if (allocated(y%surfelev)) deallocate(y%surfelev) - if (allocated(y%rttov_date)) deallocate(y%rttov_date) - if (allocated(y%rttov_time)) deallocate(y%rttov_time) - if (allocated(y%sza)) deallocate(y%sza) - if (allocated(y%co2)) deallocate(y%co2) - if (allocated(y%ch4)) deallocate(y%ch4) - if (allocated(y%n2o)) deallocate(y%n2o) - if (allocated(y%co)) deallocate(y%co) - if (allocated(y%o3)) deallocate(y%o3) - if (allocated(y%u_sfc)) deallocate(y%u_sfc) - if (allocated(y%v_sfc)) deallocate(y%v_sfc) - if (allocated(y%lat)) deallocate(y%lat) - if (allocated(y%lon)) deallocate(y%lon) - ! if (allocated(y%emis_in)) deallocate(y%emis_in) - ! if (allocated(y%refl_in)) deallocate(y%refl_in) - if (allocated(y%cloudIce)) deallocate(y%cloudIce) - if (allocated(y%cloudLiq)) deallocate(y%cloudLiq) - if (allocated(y%DeffLiq)) deallocate(y%DeffLiq) - if (allocated(y%DeffIce)) deallocate(y%DeffIce) - if (allocated(y%fl_rain)) deallocate(y%fl_rain) - if (allocated(y%fl_snow)) deallocate(y%fl_snow) - if (allocated(y%tca)) deallocate(y%tca) - - end subroutine destroy_cospstateIN - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE destroy_cosp_outputs - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - subroutine destroy_cosp_outputs(y) - type(cosp_outputs),intent(inout) :: y - integer :: i ! Local iterator for RTTOV instruments - - ! Deallocate and nullify - if (associated(y%calipso_beta_mol)) then - deallocate(y%calipso_beta_mol) - nullify(y%calipso_beta_mol) - endif - if (associated(y%calipso_betaperp_tot)) then - deallocate(y%calipso_betaperp_tot) - nullify(y%calipso_betaperp_tot) - endif - if (associated(y%calipso_beta_tot)) then - deallocate(y%calipso_beta_tot) - nullify(y%calipso_beta_tot) - endif - if (associated(y%calipso_lidarcldphase)) then - deallocate(y%calipso_lidarcldphase) - nullify(y%calipso_lidarcldphase) - endif - if (associated(y%calipso_lidarcldtype)) then - deallocate(y%calipso_lidarcldtype) - nullify(y%calipso_lidarcldtype) - endif - if (associated(y%calipso_cldlayerphase)) then - deallocate(y%calipso_cldlayerphase) - nullify(y%calipso_cldlayerphase) - endif - if (associated(y%calipso_lidarcldtmp)) then - deallocate(y%calipso_lidarcldtmp) - nullify(y%calipso_lidarcldtmp) - endif - if (associated(y%calipso_cldlayer)) then - deallocate(y%calipso_cldlayer) - nullify(y%calipso_cldlayer) - endif - if (associated(y%calipso_cldtype)) then - deallocate(y%calipso_cldtype) - nullify(y%calipso_cldtype) - endif - if (associated(y%calipso_cldtypetemp)) then - deallocate(y%calipso_cldtypetemp) - nullify(y%calipso_cldtypetemp) - endif - if (associated(y%calipso_cldtypemeanz)) then - deallocate(y%calipso_cldtypemeanz) - nullify(y%calipso_cldtypemeanz) - endif - if (associated(y%calipso_cldtypemeanzse)) then - deallocate(y%calipso_cldtypemeanzse) - nullify(y%calipso_cldtypemeanzse) - endif - if (associated(y%calipso_cldthinemis)) then - deallocate(y%calipso_cldthinemis) - nullify(y%calipso_cldthinemis) - endif - if (associated(y%calipso_lidarcld)) then - deallocate(y%calipso_lidarcld) - nullify(y%calipso_lidarcld) - endif - if (associated(y%calipso_srbval)) then - deallocate(y%calipso_srbval) - nullify(y%calipso_srbval) - endif - if (associated(y%calipso_cfad_sr)) then - deallocate(y%calipso_cfad_sr) - nullify(y%calipso_cfad_sr) - endif - if (associated(y%grLidar532_beta_mol)) then - deallocate(y%grLidar532_beta_mol) - nullify(y%grLidar532_beta_mol) - endif - if (associated(y%grLidar532_beta_tot)) then - deallocate(y%grLidar532_beta_tot) - nullify(y%grLidar532_beta_tot) - endif - if (associated(y%grLidar532_cldlayer)) then - deallocate(y%grLidar532_cldlayer) - nullify(y%grLidar532_cldlayer) - endif - if (associated(y%grLidar532_lidarcld)) then - deallocate(y%grLidar532_lidarcld) - nullify(y%grLidar532_lidarcld) - endif - if (associated(y%grLidar532_cfad_sr)) then - deallocate(y%grLidar532_cfad_sr) - nullify(y%grLidar532_cfad_sr) - endif - if (associated(y%grLidar532_srbval)) then - deallocate(y%grLidar532_srbval) - nullify(y%grLidar532_srbval) - endif - if (associated(y%atlid_beta_mol)) then - deallocate(y%atlid_beta_mol) - nullify(y%atlid_beta_mol) - endif - if (associated(y%atlid_beta_tot)) then - deallocate(y%atlid_beta_tot) - nullify(y%atlid_beta_tot) - endif - if (associated(y%atlid_cldlayer)) then - deallocate(y%atlid_cldlayer) - nullify(y%atlid_cldlayer) - endif - if (associated(y%atlid_lidarcld)) then - deallocate(y%atlid_lidarcld) - nullify(y%atlid_lidarcld) - endif - if (associated(y%atlid_cfad_sr)) then - deallocate(y%atlid_cfad_sr) - nullify(y%atlid_cfad_sr) - endif - if (associated(y%atlid_srbval)) then - deallocate(y%atlid_srbval) - nullify(y%atlid_srbval) - endif - if (associated(y%parasolPix_refl)) then - deallocate(y%parasolPix_refl) - nullify(y%parasolPix_refl) - endif - if (associated(y%parasolGrid_refl)) then - deallocate(y%parasolGrid_refl) - nullify(y%parasolGrid_refl) - endif - if (associated(y%cloudsat_Ze_tot)) then - deallocate(y%cloudsat_Ze_tot) - nullify(y%cloudsat_Ze_tot) - endif - if (associated(y%cloudsat_cfad_ze)) then - deallocate(y%cloudsat_cfad_ze) - nullify(y%cloudsat_cfad_ze) - endif - if (associated(y%cloudsat_precip_cover)) then - deallocate(y%cloudsat_precip_cover) - nullify(y%cloudsat_precip_cover) - endif - if (associated(y%cloudsat_pia)) then - deallocate(y%cloudsat_pia) - nullify(y%cloudsat_pia) - endif - if (associated(y%cloudsat_tcc)) then - deallocate(y%cloudsat_tcc) - nullify(y%cloudsat_tcc) - endif - if (associated(y%cloudsat_tcc2)) then - deallocate(y%cloudsat_tcc2) - nullify(y%cloudsat_tcc2) - endif - if (associated(y%radar_lidar_tcc)) then - deallocate(y%radar_lidar_tcc) - nullify(y%radar_lidar_tcc) - endif - if (associated(y%cloudsat_tcc)) then - deallocate(y%cloudsat_tcc) - nullify(y%cloudsat_tcc) - endif - if (associated(y%cloudsat_tcc2)) then - deallocate(y%cloudsat_tcc2) - nullify(y%cloudsat_tcc2) - endif - if (associated(y%lidar_only_freq_cloud)) then - deallocate(y%lidar_only_freq_cloud) - nullify(y%lidar_only_freq_cloud) - endif - if (associated(y%isccp_totalcldarea)) then - deallocate(y%isccp_totalcldarea) - nullify(y%isccp_totalcldarea) - endif - if (associated(y%isccp_meantb)) then - deallocate(y%isccp_meantb) - nullify(y%isccp_meantb) - endif - if (associated(y%isccp_meantbclr)) then - deallocate(y%isccp_meantbclr) - nullify(y%isccp_meantbclr) - endif - if (associated(y%isccp_meanptop)) then - deallocate(y%isccp_meanptop) - nullify(y%isccp_meanptop) - endif - if (associated(y%isccp_meantaucld)) then - deallocate(y%isccp_meantaucld) - nullify(y%isccp_meantaucld) - endif - if (associated(y%isccp_meanalbedocld)) then - deallocate(y%isccp_meanalbedocld) - nullify(y%isccp_meanalbedocld) - endif - if (associated(y%isccp_boxtau)) then - deallocate(y%isccp_boxtau) - nullify(y%isccp_boxtau) - endif - if (associated(y%isccp_boxptop)) then - deallocate(y%isccp_boxptop) - nullify(y%isccp_boxptop) - endif - if (associated(y%isccp_fq)) then - deallocate(y%isccp_fq) - nullify(y%isccp_fq) - endif - if (associated(y%misr_fq)) then - deallocate(y%misr_fq) - nullify(y%misr_fq) - endif - if (associated(y%misr_dist_model_layertops)) then - deallocate(y%misr_dist_model_layertops) - nullify(y%misr_dist_model_layertops) - endif - if (associated(y%misr_meanztop)) then - deallocate(y%misr_meanztop) - nullify(y%misr_meanztop) - endif - if (associated(y%misr_cldarea)) then - deallocate(y%misr_cldarea) - nullify(y%misr_cldarea) - endif - if (associated(y%modis_Cloud_Fraction_Total_Mean)) then - deallocate(y%modis_Cloud_Fraction_Total_Mean) - nullify(y%modis_Cloud_Fraction_Total_Mean) - endif - if (associated(y%modis_Cloud_Fraction_Ice_Mean)) then - deallocate(y%modis_Cloud_Fraction_Ice_Mean) - nullify(y%modis_Cloud_Fraction_Ice_Mean) - endif - if (associated(y%modis_Cloud_Fraction_Water_Mean)) then - deallocate(y%modis_Cloud_Fraction_Water_Mean) - nullify(y%modis_Cloud_Fraction_Water_Mean) - endif - if (associated(y%modis_Cloud_Fraction_High_Mean)) then - deallocate(y%modis_Cloud_Fraction_High_Mean) - nullify(y%modis_Cloud_Fraction_High_Mean) - endif - if (associated(y%modis_Cloud_Fraction_Mid_Mean)) then - deallocate(y%modis_Cloud_Fraction_Mid_Mean) - nullify(y%modis_Cloud_Fraction_Mid_Mean) - endif - if (associated(y%modis_Cloud_Fraction_Low_Mean)) then - deallocate(y%modis_Cloud_Fraction_Low_Mean) - nullify(y%modis_Cloud_Fraction_Low_Mean) - endif - if (associated(y%modis_Optical_Thickness_Total_Mean)) then - deallocate(y%modis_Optical_Thickness_Total_Mean) - nullify(y%modis_Optical_Thickness_Total_Mean) - endif - if (associated(y%modis_Optical_Thickness_Water_Mean)) then - deallocate(y%modis_Optical_Thickness_Water_Mean) - nullify(y%modis_Optical_Thickness_Water_Mean) - endif - if (associated(y%modis_Optical_Thickness_Ice_Mean)) then - deallocate(y%modis_Optical_Thickness_Ice_Mean) - nullify(y%modis_Optical_Thickness_Ice_Mean) - endif - if (associated(y%modis_Optical_Thickness_Total_LogMean)) then - deallocate(y%modis_Optical_Thickness_Total_LogMean) - nullify(y%modis_Optical_Thickness_Total_LogMean) - endif - if (associated(y%modis_Optical_Thickness_Water_LogMean)) then - deallocate(y%modis_Optical_Thickness_Water_LogMean) - nullify(y%modis_Optical_Thickness_Water_LogMean) - endif - if (associated(y%modis_Optical_Thickness_Ice_LogMean)) then - deallocate(y%modis_Optical_Thickness_Ice_LogMean) - nullify(y%modis_Optical_Thickness_Ice_LogMean) - endif - if (associated(y%modis_Cloud_Particle_Size_Water_Mean)) then - deallocate(y%modis_Cloud_Particle_Size_Water_Mean) - nullify(y%modis_Cloud_Particle_Size_Water_Mean) - endif - if (associated(y%modis_Cloud_Particle_Size_Ice_Mean)) then - deallocate(y%modis_Cloud_Particle_Size_Ice_Mean) - nullify(y%modis_Cloud_Particle_Size_Ice_Mean) - endif - if (associated(y%modis_Cloud_Top_Pressure_Total_Mean)) then - deallocate(y%modis_Cloud_Top_Pressure_Total_Mean) - nullify(y%modis_Cloud_Top_Pressure_Total_Mean) - endif - if (associated(y%modis_Liquid_Water_Path_Mean)) then - deallocate(y%modis_Liquid_Water_Path_Mean) - nullify(y%modis_Liquid_Water_Path_Mean) - endif - if (associated(y%modis_Ice_Water_Path_Mean)) then - deallocate(y%modis_Ice_Water_Path_Mean) - nullify(y%modis_Ice_Water_Path_Mean) - endif - if (associated(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) then - deallocate(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure) - nullify(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure) - endif - if (associated(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) then - deallocate(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq) - nullify(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq) - endif - if (associated(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) then - deallocate(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice) - nullify(y%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice) - endif - if (associated(y%modis_Optical_thickness_vs_ReffLIQ)) then - deallocate(y%modis_Optical_thickness_vs_ReffLIQ) - nullify(y%modis_Optical_thickness_vs_ReffLIQ) - endif - if (associated(y%modis_Optical_thickness_vs_ReffICE)) then - deallocate(y%modis_Optical_thickness_vs_ReffICE) - nullify(y%modis_Optical_thickness_vs_ReffICE) - endif - if (associated(y%cfodd_ntotal)) then - deallocate(y%cfodd_ntotal) - nullify(y%cfodd_ntotal) - endif - if (associated(y%wr_occfreq_ntotal)) then - deallocate(y%wr_occfreq_ntotal) - nullify(y%wr_occfreq_ntotal) - endif - - ! RTTOV multi-instrument - if (allocated(y%rttov_outputs)) then - do i=1,y % Ninst_rttov ! Iterate over each instrument - if (associated(y%rttov_outputs(i)%channel_indices)) then - deallocate(y%rttov_outputs(i)%channel_indices) - nullify(y%rttov_outputs(i)%channel_indices) - endif - if (associated(y%rttov_outputs(i)%bt_total)) then - deallocate(y%rttov_outputs(i)%bt_total) - nullify(y%rttov_outputs(i)%bt_total) - endif - if (associated(y%rttov_outputs(i)%bt_clear)) then - deallocate(y%rttov_outputs(i)%bt_clear) - nullify(y%rttov_outputs(i)%bt_clear) - endif - if (associated(y%rttov_outputs(i)%rad_total)) then - deallocate(y%rttov_outputs(i)%rad_total) - nullify(y%rttov_outputs(i)%rad_total) - endif - if (associated(y%rttov_outputs(i)%rad_clear)) then - deallocate(y%rttov_outputs(i)%rad_clear) - nullify(y%rttov_outputs(i)%rad_clear) - endif - if (associated(y%rttov_outputs(i)%rad_cloudy)) then - deallocate(y%rttov_outputs(i)%rad_cloudy) - nullify(y%rttov_outputs(i)%rad_cloudy) - endif - if (associated(y%rttov_outputs(i)%refl_total)) then - deallocate(y%rttov_outputs(i)%refl_total) - nullify(y%rttov_outputs(i)%refl_total) - endif - if (associated(y%rttov_outputs(i)%refl_clear)) then - deallocate(y%rttov_outputs(i)%refl_clear) - nullify(y%rttov_outputs(i)%refl_clear) - endif - if (associated(y%rttov_outputs(i)%bt_total_pc)) then - deallocate(y%rttov_outputs(i)%bt_total_pc) - nullify(y%rttov_outputs(i)%bt_total_pc) - endif - if (associated(y%rttov_outputs(i)%rad_total_pc)) then - deallocate(y%rttov_outputs(i)%rad_total_pc) - nullify(y%rttov_outputs(i)%rad_total_pc) - endif - end do - deallocate(y%rttov_outputs) - end if - - end subroutine destroy_cosp_outputs - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE rttov_cleanup - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - subroutine rttov_cleanup(y) - use MOD_COSP_RTTOV_INTERFACE, only: DESTROY_RTTOV_CONFIG - - type(cosp_optical_inputs),intent(inout) :: y - integer :: i - - if (size(y%cfg_rttov) .gt. 0) then - do i=1,y%Ninst_rttov - call destroy_rttov_config(y%cfg_rttov(i)) - end do - end if - nullify(y%cfg_rttov) - - end subroutine rttov_cleanup - - end program cosp2_test - diff --git a/src/cosp.F90.bak b/src/cosp.F90.bak deleted file mode 100755 index 02ed2a6337..0000000000 --- a/src/cosp.F90.bak +++ /dev/null @@ -1,4840 +0,0 @@ -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -! Copyright (c) 2015, Regents of the University of Colorado -! All rights reserved. -! -! Redistribution and use in source and binary forms, with or without modification, are -! permitted provided that the following conditions are met: -! -! 1. Redistributions of source code must retain the above copyright notice, this list of -! conditions and the following disclaimer. -! -! 2. Redistributions in binary form must reproduce the above copyright notice, this list -! of conditions and the following disclaimer in the documentation and/or other -! materials provided with the distribution. -! -! 3. Neither the name of the copyright holder nor the names of its contributors may be -! used to endorse or promote products derived from this software without specific prior -! written permission. -! -! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL -! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT -! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -! -! History: -! May 2015- D. Swales - Original version -! Mar 2018- R. Guzman - Added OPAQ diagnostics and GLID simulator -! Apr 2018- R. Guzman - Added ATLID simulator -! Nov 2018- T. Michibata - Added CloudSat+MODIS Warmrain Diagnostics -! Mar 2024- C. Wall - Added MODIS joint-histogram diagnostics -! -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -MODULE MOD_COSP - USE COSP_KINDS, ONLY: wp - USE MOD_COSP_CONFIG, ONLY: R_UNDEF,PARASOL_NREFL,LIDAR_NCAT,LIDAR_NTYPE, SR_BINS,& - N_HYDRO,numMISRHgtBins, & - cloudsat_DBZE_BINS,LIDAR_NTEMP,calipso_histBsct,& - use_vgrid,Nlvgrid,vgrid_zu,vgrid_zl,vgrid_z,dz, & - WR_NREGIME, CFODD_NCLASS, & - CFODD_NDBZE, CFODD_NICOD, & - numMODISTauBins,numMODISPresBins, & - numMODISReffIceBins,numMODISReffLiqBins, & - numMODISLWPBins,numMODISIWPBins, & - numISCCPTauBins,numISCCPPresBins,numMISRTauBins,& - ntau,modis_histTau,tau_binBounds, & - modis_histTauEdges,tau_binEdges,nCloudsatPrecipClass,& - modis_histTauCenters,tau_binCenters, & - cloudsat_preclvl,grLidar532_histBsct,atlid_histBsct - USE MOD_COSP_MODIS_INTERFACE, ONLY: cosp_modis_init, modis_IN, & - COSP_ASSIGN_modisIN - USE MOD_COSP_RTTOV_INTERFACE, ONLY: cosp_rttov_init, cosp_rttov_simulate - USE MOD_COSP_RTTOV_UTIL, ONLY: rttov_cfg, rttov_output - USE MOD_COSP_MISR_INTERFACE, ONLY: cosp_misr_init, misr_IN, & - COSP_ASSIGN_misrIN, COSP_ASSIGN_misrIN_clean - USE MOD_COSP_ISCCP_INTERFACE, ONLY: cosp_isccp_init, isccp_IN, & - COSP_ASSIGN_isccpIN, COSP_ASSIGN_isccpIN_clean - USE MOD_COSP_CALIPSO_INTERFACE, ONLY: cosp_calipso_init, calipso_IN, & - COSP_ASSIGN_calipsoIN, COSP_ASSIGN_calipsoIN_clean - USE MOD_COSP_ATLID_INTERFACE, ONLY: cosp_atlid_init, atlid_IN, & - COSP_ASSIGN_atlidIN, COSP_ASSIGN_atlidIN_clean - USE MOD_COSP_GRLIDAR532_INTERFACE, ONLY: cosp_grLidar532_init, grLidar532_IN - USE MOD_COSP_PARASOL_INTERFACE, ONLY: cosp_parasol_init, parasol_in, & - COSP_ASSIGN_parasolIN, COSP_ASSIGN_parasolIN_clean - USE MOD_COSP_CLOUDSAT_INTERFACE, ONLY: cosp_cloudsat_init, cloudsat_IN, & - COSP_ASSIGN_cloudsatIN,COSP_ASSIGN_cloudsatIN_clean - USE quickbeam, ONLY: quickbeam_subcolumn, quickbeam_column - USE MOD_ICARUS, ONLY: icarus_subcolumn, icarus_column - USE MOD_MISR_SIMULATOR, ONLY: misr_subcolumn, misr_column - USE MOD_LIDAR_SIMULATOR, ONLY: lidar_subcolumn, lidar_column - USE MOD_MODIS_SIM, ONLY: modis_subcolumn, modis_column - USE MOD_PARASOL, ONLY: parasol_subcolumn, parasol_column - USE MOD_COSP_RTTOV, ONLY: rttov_IN - USE MOD_COSP_STATS, ONLY: COSP_LIDAR_ONLY_CLOUD,COSP_CHANGE_VERTICAL_GRID, & - COSP_DIAG_WARMRAIN, COMPUTE_ORBITMASKS, & - cosp_optical_inputs, cosp_column_inputs, & - swath_inputs, radar_cfg - USE COSP_PHYS_CONSTANTS, ONLY: radius_earth - USE COSP_MATH_CONSTANTS, ONLY: pi - - IMPLICIT NONE - - logical :: linitialization ! Initialization flag - - - ! ###################################################################################### - ! TYPE cosp_outputs - ! ###################################################################################### - type cosp_outputs - - ! CALIPSO outputs - real(wp),dimension(:,:,:),pointer :: & - calipso_betaperp_tot => null(), & ! Total backscattered signal - calipso_beta_tot => null(), & ! Total backscattered signal - calipso_lidarcldphase => null(), & ! 3D "lidar" phase cloud fraction - calipso_lidarcldtype => null(), & ! 3D "lidar" OPAQ type fraction - calipso_cldlayerphase => null(), & ! low, mid, high-level lidar phase cloud cover - calipso_lidarcldtmp => null(), & ! 3D "lidar" phase cloud temperature - calipso_cfad_sr => null() ! CFAD of scattering ratio - real(wp), dimension(:,:),pointer :: & - calipso_lidarcld => null(), & ! 3D "lidar" cloud fraction - calipso_cldlayer => null(), & ! low, mid, high-level, total lidar cloud cover - calipso_cldtype => null(), & ! opaque and thin lidar cloud cover + z_opaque altitude - calipso_cldtypetemp => null(), & ! opaque and thin cloud temperature - calipso_cldtypemeanz => null(), & ! opaque and thin cloud altitude - calipso_cldtypemeanzse => null(),& ! same as just above with respect to SE - calipso_beta_mol => null() ! Molecular backscatter - real(wp), dimension(:),pointer :: & - calipso_cldthinemis => null(), & ! thin cloud emissivity - calipso_srbval => null() ! SR bins in cfad_sr - - ! GROUND LIDAR outputs - real(wp),dimension(:,:,:),pointer :: & - grLidar532_beta_tot => null(), & ! Total GROUND LIDAR backscattered signal - grLidar532_cfad_sr => null() ! CFAD of GROUND LIDAR scattering ratio - real(wp), dimension(:,:),pointer :: & - grLidar532_lidarcld => null(), & ! 3D GROUND "lidar" cloud fraction - grLidar532_cldlayer => null(), & ! low, mid, high-level, total GROUND lidar cloud cover - grLidar532_beta_mol => null() ! GROUND LIDAR Molecular backscatter - real(wp), dimension(:),pointer :: & - grLidar532_srbval => null() ! SR bins in cfad_sr - - ! ATLID outputs - real(wp),dimension(:,:,:),pointer :: & - atlid_beta_tot => null(), & ! Total ATLID backscattered signal - atlid_cfad_sr => null() ! CFAD of ATLID scattering ratio - real(wp), dimension(:,:),pointer :: & - atlid_lidarcld => null(), & ! 3D ATLID cloud fraction - atlid_cldlayer => null(), & ! low, mid, high-level, total ATLID cloud cover - atlid_beta_mol => null() ! ATLID Molecular backscatter - real(wp), dimension(:),pointer :: & - atlid_srbval => null() ! SR bins in cfad_sr - - ! PARASOL outputs - real(wp),dimension(:,:,:),pointer :: & - parasolPix_refl => null() ! PARASOL reflectances (subcolumn) - real(wp),dimension(:,:),pointer :: & - parasolGrid_refl => null() ! PARASOOL reflectances (column) - - ! CLOUDSAT outputs - real(wp),dimension(:,:,:),pointer :: & - cloudsat_Ze_tot => null(), & ! Effective reflectivity factor (Npoints,Ncolumns,Nlevels) - cloudsat_cfad_ze => null() ! Ze CFAD(Npoints,dBZe_bins,Nlevels) - real(wp), dimension(:,:),pointer :: & - lidar_only_freq_cloud => null(), & ! (Npoints,Nlevels) - cloudsat_precip_cover => null() ! Radar total cloud amount by CloudSat precip flag (Npoints,dBZe_bins) - real(wp),dimension(:),pointer :: & - cloudsat_tcc => null(), & - cloudsat_tcc2 => null(), & - radar_lidar_tcc => null(), & ! Radar&lidar total cloud amount, grid-box scale (Npoints) - cloudsat_pia => null() ! Radar path integrated attenuation (Npoints) - - ! ISCCP outputs - real(wp),dimension(:),pointer :: & - isccp_totalcldarea => null(), & ! The fraction of model grid box columns with cloud - ! somewhere in them. (%) - isccp_meantb => null(), & ! Mean all-sky 10.5 micron brightness temperature. (K) - isccp_meantbclr => null(), & ! Mean clear-sky 10.5 micron brightness temperature. (K) - isccp_meanptop => null(), & ! Mean cloud top pressure (mb). - isccp_meantaucld => null(), & ! Mean optical thickness. (1) - isccp_meanalbedocld => null() ! Mean cloud albedo. (1) - real(wp),dimension(:,:),pointer ::& - isccp_boxtau => null(), & ! Optical thickness in each column. (1) - isccp_boxptop => null() ! Cloud top pressure in each column. (mb) - real(wp),dimension(:,:,:),pointer :: & - isccp_fq => null() ! The fraction of the model grid box covered by each of - ! the 49 ISCCP D level cloud types. (%) - - ! MISR outptus - real(wp),dimension(:,:,:),pointer :: & ! - misr_fq => null() ! Fraction of the model grid box covered by each of the MISR - ! cloud types - real(wp),dimension(:,:),pointer :: & ! - misr_dist_model_layertops => null() ! - real(wp),dimension(:),pointer :: & ! - misr_meanztop => null(), & ! Mean MISR cloud top height - misr_cldarea => null() ! Mean MISR cloud cover area - - ! MODIS outptus - real(wp),pointer,dimension(:) :: & ! - modis_Cloud_Fraction_Total_Mean => null(), & ! L3 MODIS retrieved cloud fraction (total) - modis_Cloud_Fraction_Water_Mean => null(), & ! L3 MODIS retrieved cloud fraction (liq) - modis_Cloud_Fraction_Ice_Mean => null(), & ! L3 MODIS retrieved cloud fraction (ice) - modis_Cloud_Fraction_High_Mean => null(), & ! L3 MODIS retrieved cloud fraction (high) - modis_Cloud_Fraction_Mid_Mean => null(), & ! L3 MODIS retrieved cloud fraction (middle) - modis_Cloud_Fraction_Low_Mean => null(), & ! L3 MODIS retrieved cloud fraction (low ) - modis_Optical_Thickness_Total_Mean => null(), & ! L3 MODIS retrieved optical thickness (tot) - modis_Optical_Thickness_Water_Mean => null(), & ! L3 MODIS retrieved optical thickness (liq) - modis_Optical_Thickness_Ice_Mean => null(), & ! L3 MODIS retrieved optical thickness (ice) - modis_Optical_Thickness_Total_LogMean => null(), & ! L3 MODIS retrieved log10 optical thickness - modis_Optical_Thickness_Water_LogMean => null(), & ! L3 MODIS retrieved log10 optical thickness - modis_Optical_Thickness_Ice_LogMean => null(), & ! L3 MODIS retrieved log10 optical thickness - modis_Cloud_Particle_Size_Water_Mean => null(), & ! L3 MODIS retrieved particle size (liquid) - modis_Cloud_Particle_Size_Ice_Mean => null(), & ! L3 MODIS retrieved particle size (ice) - modis_Cloud_Top_Pressure_Total_Mean => null(), & ! L3 MODIS retrieved cloud top pressure - modis_Liquid_Water_Path_Mean => null(), & ! L3 MODIS retrieved liquid water path - modis_Ice_Water_Path_Mean => null() ! L3 MODIS retrieved ice water path - real(wp),pointer,dimension(:,:,:) :: & - modis_Optical_Thickness_vs_Cloud_Top_Pressure => null(), & ! Tau/Pressure joint histogram - modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq => null(), & ! Tau/Pressure Liq joint histogram - modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice => null(), & ! Tau/Pressure Ice joint histogram - modis_Optical_Thickness_vs_ReffICE => null(), & ! Tau/ReffICE joint histogram - modis_Optical_Thickness_vs_ReffLIQ => null(), & ! Tau/ReffLIQ joint histogram - modis_LWP_vs_ReffLIQ => null(), & ! LWP/ReffLIQ joint histogram - modis_IWP_vs_ReffICE => null() ! IWP/ReffICE joint histogram - - ! Joint CloudSat+MODIS simulators outputs - real(wp),dimension(:,:,:,:),pointer :: & - cfodd_ntotal => null() ! # of CFODD (Npoints,CFODD_NDBZE,CFODD_NICOD,CFODD_NCLASS) - real(wp),dimension(:,:), pointer :: & - wr_occfreq_ntotal => null() ! # of nonprecip/drizzle/precip (Npoints,WR_NREGIME) - integer :: & - Ninst_rttov - type(rttov_output),dimension(:),allocatable :: & - rttov_outputs - - end type cosp_outputs - -CONTAINS - ! ###################################################################################### - ! FUNCTION cosp_simulator - ! ###################################################################################### - function COSP_SIMULATOR(cospIN,cospgridIN,cospOUT,start_idx,stop_idx,debug) - type(cosp_optical_inputs),intent(in),target :: cospIN ! Optical inputs to COSP simulator - type(cosp_column_inputs), intent(in),target :: cospgridIN ! Host model inputs to COSP - - ! Inputs into the simulators - type(isccp_IN) :: isccpIN ! Input to the ISCCP simulator - type(misr_IN) :: misrIN ! Input to the LIDAR simulator - type(calipso_IN) :: calipsoIN ! Input to the LIDAR simulator - type(grLidar532_IN) :: grLidar532IN ! Input to the GROUND LIDAR simulator - type(atlid_IN) :: atlidIN ! Input to the ATLID simulator - type(parasol_IN) :: parasolIN ! Input to the PARASOL simulator - type(cloudsat_IN) :: cloudsatIN ! Input to the CLOUDSAT radar simulator - type(modis_IN) :: modisIN ! Input to the MODIS simulator - type(rttov_IN) :: rttovIN ! Input to the RTTOV simulator - - ! Outputs from the simulators (nested simulator output structure) - type(cosp_outputs), intent(inout) :: cospOUT - - integer,optional :: start_idx,stop_idx - logical,optional :: debug - - character(len=256),dimension(100) :: cosp_simulator - - ! Local variables - integer :: & - i,icol,ij,ik,nError - integer :: k - integer,target :: & - Npoints - logical :: & - Lisccp_subcolumn, & ! On/Off switch for subcolumn ISCCP simulator - Lmisr_subcolumn, & ! On/Off switch for subcolumn MISR simulator - Lcalipso_subcolumn, & ! On/Off switch for subcolumn CALIPSO simulator - LgrLidar532_subcolumn,& ! On/Off switch for subcolumn GROUND LIDAR simulator - Latlid_subcolumn, & ! On/Off switch for subcolumn ATLID simulator - Lparasol_subcolumn, & ! On/Off switch for subcolumn PARASOL simulator - Lcloudsat_subcolumn, & ! On/Off switch for subcolumn CLOUDSAT simulator - Lmodis_subcolumn, & ! On/Off switch for subcolumn MODIS simulator - Lisccp_column, & ! On/Off switch for column ISCCP simulator - Lmisr_column, & ! On/Off switch for column MISR simulator - Lcalipso_column, & ! On/Off switch for column CALIPSO simulator - LgrLidar532_column, & ! On/Off switch for column GROUND LIDAR simulator - Latlid_column, & ! On/Off switch for column ATLID simulator - Lparasol_column, & ! On/Off switch for column PARASOL simulator - Lcloudsat_column, & ! On/Off switch for column CLOUDSAT simulator - Lmodis_column, & ! On/Off switch for column MODIS simulator - Lrttov_column, & ! On/Off switch for column RTTOV simulator - Lradar_lidar_tcc, & ! On/Off switch from joint Calipso/Cloudsat product - Lcloudsat_tcc, & ! - Lcloudsat_tcc2, & ! - Llidar_only_freq_cloud, & ! On/Off switch from joint Calipso/Cloudsat product - Lcloudsat_modis_wr ! On/Off switch from joint CloudSat/MODIS warm rain product - logical :: & - ok_lidar_cfad = .false., & - ok_lidar_cfad_grLidar532 = .false., & - ok_lidar_cfad_atlid = .false., & - verbose = .false. - integer, dimension(:,:),allocatable :: & - modisRetrievedPhase,isccpLEVMATCH - real(wp), dimension(:), allocatable :: & - modisCfTotal,modisCfLiquid,modisMeanIceWaterPath, isccp_meantbclr, & - modisCfIce, modisCfHigh, modisCfMid, modisCfLow,modisMeanTauTotal, & - modisMeanTauLiquid, modisMeanTauIce, modisMeanLogTauTotal, & - modisMeanLogTauLiquid, modisMeanLogTauIce, modisMeanSizeLiquid, & - modisMeanSizeIce, modisMeanCloudTopPressure, modisMeanLiquidWaterPath, & - radar_lidar_tcc, cloudsat_tcc, cloudsat_tcc2 - REAL(WP), dimension(:,:),allocatable :: & - modisRetrievedCloudTopPressure,modisRetrievedTau,modisRetrievedSize, & - misr_boxtau,misr_boxztop,misr_dist_model_layertops,isccp_boxtau, & - isccp_boxttop,isccp_boxptop,calipso_beta_mol,lidar_only_freq_cloud, & - grLidar532_beta_mol,atlid_beta_mol, & - rttov_bt_total,rttov_bt_clear, & ! RTTOV brightness temps - rttov_rad_total,rttov_rad_clear,rttov_rad_cloudy, & ! RTTOV radiances - rttov_refl_total,rttov_refl_clear ! RTTOV reflectances - REAL(WP), dimension(:,:,:),allocatable :: & - modisJointHistogram,modisJointHistogramIce,modisJointHistogramLiq, & - modisJointHistogram_CtpCodLiq,modisJointHistogram_CtpCodIce, & - modisJointHistogram_LwpRefLiq,modisJointHistogram_IwpRefIce, & - calipso_beta_tot,calipso_betaperp_tot, cloudsatDBZe,parasolPix_refl, & - grLidar532_beta_tot,atlid_beta_tot,cloudsatZe_non - real(wp),dimension(:),allocatable,target :: & - out1D_1,out1D_2,out1D_3,out1D_4,out1D_5,out1D_6,out1D_7,out1D_8, & - out1D_9,out1D_10,out1D_11,out1D_12 - real(wp),dimension(:,:,:),allocatable :: & - betamol_in,betamoli,pnormi,ze_toti - real(wp),dimension(:,:,:),allocatable :: & - t_in,tempI,frac_outI ! subscript "I": vertical interpolation (use_vgrid=.true.) - real(wp), allocatable :: & - zlev (:,:), & ! altitude (used only when use_vgrid=.true.) - cfodd_ntotal (:,:,:,:), & ! # of total samples for CFODD (Npoints,CFODD_NDBZE,CFODD_NICOD,CFODD_NCLASS) - wr_occfreq_ntotal(:,:) ! # of warm-rain (nonprecip/drizzle/precip) (Npoints,WR_NREGIME) - - ! Fields used in orbit swathing of gridcells. - logical,dimension(:),allocatable :: & ! Mask of reals over all local times - CSCAL_SWATH_MASK, & ! Needed for MODIS CSCAL - MODIS_SWATH_MASK ! Needed for MODIS CSCAL + normal MODIS - integer,dimension(:),allocatable :: & ! Arrays containing the indices of the swath masks - ISCCP_MASK_INDICES, & - MISR_MASK_INDICES, & - CSCAL_MASK_INDICES, & - PARASOL_MASK_INDICES, & - ATLID_MASK_INDICES, & - MODIS_CSCAL_MASK_INDICES - integer :: j - ! ISCCP swathing variables - real(wp),dimension(:),target,allocatable :: & - temp_isccp_meanalbedocld, & - temp_isccp_meanptop, & - temp_isccp_meantaucld, & - temp_isccp_totalcldarea, & - temp_isccp_meantb - real(wp),dimension(:,:,:),target,allocatable :: & - temp_isccp_fq - ! MISR swathing variables - real(wp),dimension(:),target,allocatable :: & - temp_misr_cldarea, & - temp_misr_meanztop - real(wp),dimension(:,:,:),target,allocatable :: & - temp_misr_fq - ! CALIPSO swathing variables - real(wp),dimension(:),target,allocatable :: & - temp_calipso_cldthinemis - real(wp),dimension(:,:),target,allocatable :: & - temp_calipso_lidarcld, & - temp_calipso_cldlayer, & - temp_calipso_cldtype, & - temp_calipso_cldtypetemp, & - temp_calipso_cldtypemeanz,& - temp_calipso_cldtypemeanzse - real(wp),dimension(:,:,:),target,allocatable :: & - temp_calipso_cfad_sr, & - temp_calipso_lidarcldphase, & - temp_calipso_lidarcldtype, & - temp_calipso_cldlayerphase, & - temp_calipso_lidarcldtmp - ! ATLID swathing variables - real(wp),dimension(:,:),target,allocatable :: & - temp_atlid_lidarcld, & - temp_atlid_cldlayer - real(wp),dimension(:,:,:),target,allocatable :: & - temp_atlid_cfad_sr - ! PARASOL swathing variables - real(wp),dimension(:,:),target,allocatable :: & - temp_parasolGrid_refl - ! CLOUDSAT swathing variables - real(wp),dimension(:),target,allocatable :: & - temp_cloudsat_pia - real(wp),dimension(:,:),target,allocatable :: & - temp_cloudsat_precip_cover - real(wp),dimension(:,:,:),target,allocatable :: & - temp_cloudsat_cfad_ze - ! MODIS swathing variables. - real(wp),dimension(:,:),allocatable :: & - modis_boxptop, & - modis_boxttop, & - modis_boxtau - integer,dimension(:,:),allocatable :: & - modisLEVMATCH - real(wp),dimension(:),target,allocatable :: & - modis_meantbclr - - ! Initialize error reporting for output - cosp_simulator(:)='' - if (present(debug)) verbose = debug - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! 1) Determine if using full inputs or subset - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (present(start_idx) .and. present(stop_idx)) then - ij=start_idx - ik=stop_idx - else - ij=1 - ik=cospIN%Npoints - endif - Npoints = ik-ij+1 - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! 2a) Determine which simulators to run and which statistics to compute - ! - If any of the subcolumn fields are allocated, then run the subcolumn simulators. - ! - If any of the column fields are allocated, then compute the statistics for that - ! simulator, but only save the requested fields. - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Start with all simulators and joint-diagnostics off - Lisccp_subcolumn = .false. - Lmisr_subcolumn = .false. - Lcalipso_subcolumn = .false. - LgrLidar532_subcolumn = .false. - Latlid_subcolumn = .false. - Lparasol_subcolumn = .false. - Lcloudsat_subcolumn = .false. - Lmodis_subcolumn = .false. - Lisccp_column = .false. - Lmisr_column = .false. - Lcalipso_column = .false. - LgrLidar532_column = .false. - Latlid_column = .false. - Lparasol_column = .false. - Lcloudsat_column = .false. - Lmodis_column = .false. - Lrttov_column = .false. - Lradar_lidar_tcc = .false. - Llidar_only_freq_cloud = .false. - Lcloudsat_tcc = .false. - Lcloudsat_tcc2 = .false. - Lcloudsat_modis_wr = .false. - - ! CLOUDSAT subcolumn - if (associated(cospOUT%cloudsat_Ze_tot)) Lcloudsat_subcolumn = .true. - - ! MODIS subcolumn - if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean) .or. & - associated(cospOUT%modis_Cloud_Fraction_Total_Mean) .or. & - associated(cospOUT%modis_Cloud_Fraction_Ice_Mean) .or. & - associated(cospOUT%modis_Cloud_Fraction_High_Mean) .or. & - associated(cospOUT%modis_Cloud_Fraction_Mid_Mean) .or. & - associated(cospOUT%modis_Cloud_Fraction_Low_Mean) .or. & - associated(cospOUT%modis_Optical_Thickness_Total_Mean) .or. & - associated(cospOUT%modis_Optical_Thickness_Water_Mean) .or. & - associated(cospOUT%modis_Optical_Thickness_Ice_Mean) .or. & - associated(cospOUT%modis_Optical_Thickness_Total_LogMean) .or. & - associated(cospOUT%modis_Optical_Thickness_Water_LogMean) .or. & - associated(cospOUT%modis_Optical_Thickness_Ice_LogMean) .or. & - associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean) .or. & - associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean) .or. & - associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean) .or. & - associated(cospOUT%modis_Liquid_Water_Path_Mean) .or. & - associated(cospOUT%modis_Ice_Water_Path_Mean) .or. & - associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure) .or. & - associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq) .or. & - associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & - Lmodis_subcolumn = .true. - - ! ISCCP subcolumn - if (associated(cospOUT%isccp_boxtau) .or. & - associated(cospOUT%isccp_boxptop)) & - Lisccp_subcolumn = .true. - - ! MISR subcolumn - if (associated(cospOUT%misr_dist_model_layertops)) & - Lmisr_subcolumn = .true. - - ! CALIPOSO subcolumn - if (associated(cospOUT%calipso_beta_mol) .or. & - associated(cospOUT%calipso_betaperp_tot) .or. & - associated(cospOUT%calipso_beta_tot)) & - Lcalipso_subcolumn = .true. - - ! GROUND LIDAR subcolumn - if (associated(cospOUT%grLidar532_beta_mol) .or. & - associated(cospOUT%grLidar532_beta_tot)) & - LgrLidar532_subcolumn = .true. - - ! ATLID subcolumn - if (associated(cospOUT%atlid_beta_mol) .or. & - associated(cospOUT%atlid_beta_tot)) & - Latlid_subcolumn = .true. - - ! PARASOL subcolumn - if (associated(cospOUT%parasolPix_refl)) & - Lparasol_subcolumn = .true. - - ! RTTOV Column - if (allocated(cospOUT%rttov_outputs)) then - Lrttov_column = .true. - endif - - ! ISCCP column - if (associated(cospOUT%isccp_fq) .or. & - associated(cospOUT%isccp_meanalbedocld) .or. & - associated(cospOUT%isccp_meanptop) .or. & - associated(cospOUT%isccp_meantaucld) .or. & - associated(cospOUT%isccp_totalcldarea) .or. & - associated(cospOUT%isccp_meantb)) then - Lisccp_column = .true. - Lisccp_subcolumn = .true. - endif - - ! MISR column - if (associated(cospOUT%misr_cldarea) .or. & - associated(cospOUT%misr_meanztop) .or. & - associated(cospOUT%misr_fq)) then - Lmisr_column = .true. - Lmisr_subcolumn = .true. - endif - - ! CALIPSO column - if (associated(cospOUT%calipso_cfad_sr) .or. & - associated(cospOUT%calipso_lidarcld) .or. & - associated(cospOUT%calipso_lidarcldphase) .or. & - associated(cospOUT%calipso_lidarcldtype) .or. & - associated(cospOUT%calipso_cldlayer) .or. & - associated(cospOUT%calipso_cldtype) .or. & - associated(cospOUT%calipso_cldtypetemp) .or. & - associated(cospOUT%calipso_cldtypemeanz) .or. & - associated(cospOUT%calipso_cldtypemeanzse) .or. & - associated(cospOUT%calipso_cldthinemis) .or. & - associated(cospOUT%calipso_cldlayerphase) .or. & - associated(cospOUT%calipso_lidarcldtmp)) then - Lcalipso_column = .true. - Lcalipso_subcolumn = .true. - endif - - ! GROUND LIDAR column - if (associated(cospOUT%grLidar532_cfad_sr) .or. & - associated(cospOUT%grLidar532_lidarcld) .or. & - associated(cospOUT%grLidar532_cldlayer)) then - LgrLidar532_column = .true. - LgrLidar532_subcolumn = .true. - endif - - ! ATLID column - if (associated(cospOUT%atlid_cfad_sr) .or. & - associated(cospOUT%atlid_lidarcld) .or. & - associated(cospOUT%atlid_cldlayer)) then - Latlid_column = .true. - Latlid_subcolumn = .true. - endif - - ! PARASOL column - if (associated(cospOUT%parasolGrid_refl)) then - Lparasol_column = .true. - Lparasol_subcolumn = .true. - endif - - ! CLOUDSAT column - if (associated(cospOUT%cloudsat_cfad_ze)) then - Lcloudsat_column = .true. - Lcloudsat_subcolumn = .true. - endif - - ! MODIS column - if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean) .or. & - associated(cospOUT%modis_Cloud_Fraction_Water_Mean) .or. & - associated(cospOUT%modis_Cloud_Fraction_Ice_Mean) .or. & - associated(cospOUT%modis_Cloud_Fraction_High_Mean) .or. & - associated(cospOUT%modis_Cloud_Fraction_Mid_Mean) .or. & - associated(cospOUT%modis_Cloud_Fraction_Low_Mean) .or. & - associated(cospOUT%modis_Optical_Thickness_Total_Mean) .or. & - associated(cospOUT%modis_Optical_Thickness_Water_Mean) .or. & - associated(cospOUT%modis_Optical_Thickness_Ice_Mean) .or. & - associated(cospOUT%modis_Optical_Thickness_Total_LogMean) .or. & - associated(cospOUT%modis_Optical_Thickness_Water_LogMean) .or. & - associated(cospOUT%modis_Optical_Thickness_Ice_LogMean) .or. & - associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean) .or. & - associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean) .or. & - associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean) .or. & - associated(cospOUT%modis_Liquid_Water_Path_Mean) .or. & - associated(cospOUT%modis_Ice_Water_Path_Mean) .or. & - associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure) .or. & - associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq) .or. & - associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) then - Lmodis_column = .true. - Lmodis_subcolumn = .true. - endif - - ! Joint simulator products - if (associated(cospOUT%lidar_only_freq_cloud) .or. associated(cospOUT%radar_lidar_tcc) .or. & - associated(cospOUT%cloudsat_tcc) .or. associated(cospOUT%cloudsat_tcc2)) then - Lcalipso_column = .true. - Lcalipso_subcolumn = .true. - Lcloudsat_column = .true. - Lcloudsat_subcolumn = .true. - Lradar_lidar_tcc = .true. - Llidar_only_freq_cloud = .true. - Lcloudsat_tcc = .true. - Lcloudsat_tcc2 = .true. - endif - - ! CloudSat+MODIS joint simulator product - if ( associated(cospOUT%cfodd_ntotal) .or. associated(cospOUT%wr_occfreq_ntotal) ) then - Lmodis_column = .true. - Lmodis_subcolumn = .true. - Lcloudsat_column = .true. - Lcloudsat_subcolumn = .true. - Lcloudsat_modis_wr = .true. ! WR: warm rain product - endif - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! 2b) Error Checking - ! Enforce bounds on input fields. If input field is out-of-bounds, report error - ! and turn off simulator - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - call cosp_errorCheck(cospgridIN, cospIN, Lisccp_subcolumn, Lisccp_column, & - Lmisr_subcolumn, Lmisr_column, Lmodis_subcolumn, Lmodis_column, & - Lcloudsat_subcolumn, Lcloudsat_column, Lcalipso_subcolumn, Lcalipso_column, & - Latlid_subcolumn, Latlid_column, LgrLidar532_subcolumn, LgrLidar532_column, & - Lrttov_column, Lparasol_subcolumn, Lparasol_column, & - Lradar_lidar_tcc, Llidar_only_freq_cloud, Lcloudsat_tcc,Lcloudsat_tcc2, & - Lcloudsat_modis_wr, cospOUT, cosp_simulator, nError) - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! 3) Populate instrument simulator inputs - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - ! Indexing order for "cospIN % cospswathsIN" is ISCCP, MISR, CLOUDSAT-CALIPSO, ATLID, PARASOL, MODIS - if (Lisccp_subcolumn .or. Lmodis_subcolumn) then - call COSP_ASSIGN_isccpIN(cospIN,cospgridIN,Npoints,isccpIN,ISCCP_MASK_INDICES) !COSP_ASSIGN_isccpIN - endif - - if (Lmisr_subcolumn) then - call COSP_ASSIGN_misrIN(cospIN,cospgridIN,Npoints,misrIN,MISR_MASK_INDICES) - endif - - if (Lcalipso_subcolumn) then - call COSP_ASSIGN_calipsoIN(cospIN,cospgridIN,Npoints,calipsoIN,CSCAL_MASK_INDICES,CSCAL_SWATH_MASK) - endif - - if (LgrLidar532_subcolumn) then - grLidar532IN%Npoints => Npoints - grLidar532IN%Ncolumns => cospIN%Ncolumns - grLidar532IN%Nlevels => cospIN%Nlevels - grLidar532IN%beta_mol => cospIN%beta_mol_grLidar532 - grLidar532IN%betatot => cospIN%betatot_grLidar532 - grLidar532IN%tau_mol => cospIN%tau_mol_grLidar532 - grLidar532IN%tautot => cospIN%tautot_grLidar532 - endif - - if (Latlid_subcolumn) then - call COSP_ASSIGN_atlidIN(cospIN,cospgridIN,Npoints,atlidIN,ATLID_MASK_INDICES) - endif - - if (Lparasol_subcolumn) then - call COSP_ASSIGN_parasolIN(cospIN,cospgridIN,Npoints,parasolIN,PARASOL_MASK_INDICES) - endif - - if (Lcloudsat_subcolumn) then - call COSP_ASSIGN_cloudsatIN(cospIN,cospgridIN,Npoints,cloudsatIN,CSCAL_MASK_INDICES,CSCAL_SWATH_MASK) - endif - - if (Lmodis_subcolumn) then - call COSP_ASSIGN_modisIN(cospIN,cospgridIN,Npoints,modisIN,CSCAL_SWATH_MASK,MODIS_CSCAL_MASK_INDICES) - endif - - if (Lrttov_column) then - rttovIN%nPoints => Npoints - rttovIN%nLevels => cospIN%nLevels ! This is actually "nlayers" in the RTTOV sense - rttovIN%nSubCols => cospIN%nColumns - rttovIN%co2 => cospgridIN%co2 - rttovIN%ch4 => cospgridIN%ch4 - rttovIN%n2o => cospgridIN%n2o - rttovIN%co => cospgridIN%co - rttovIN%h_surf => cospgridIN%surfelev - rttovIN%u_surf => cospgridIN%u_sfc - rttovIN%v_surf => cospgridIN%v_sfc - rttovIN%t_skin => cospgridIN%skt - rttovIN%p_surf => cospgridIN%psfc ! Lower boundary of lowest layer may not be the surface. - if (associated(cospIN%emis_grey)) rttovIN%emis_grey => cospIN%emis_grey -! rttovIN%surfem => cospgridIN%emis_in -! rttovIN%refl_in => cospgridIN%refl_in - if (allocated(cospgridIN%q2m)) then - rttovIN%q2m => cospgridIN%q2m(:) - else - rttovIN%q2m => cospgridIN%qv(:,cospIN%Nlevels) - end if - if (allocated(cospgridIN%t2m)) then - rttovIN%t2m => cospgridIN%t2m(:) - else - rttovIN%t2m => cospgridIN%at(:,cospIN%Nlevels) - end if - rttovIN%sfcmask => cospgridIN%rttov_sfcmask - rttovIN%latitude => cospgridIN%lat - rttovIN%longitude => cospgridIN%lon - rttovIN%p => cospgridIN%pfull - rttovIN%ph => cospgridIN%phalf - rttovIN%t => cospgridIN%at - rttovIN%q => cospgridIN%qv - rttovIN%o3 => cospgridIN%o3 - ! Below only needed for all-sky RTTOV calculation - rttovIN%rttov_date => cospgridIN%rttov_date - rttovIN%rttov_time => cospgridIN%rttov_time - rttovIN%sza => cospgridIN%sza - rttovIN%tca => cospgridIN%tca - rttovIN%cldLiq => cospgridIN%cloudLiq - rttovIN%cldIce => cospgridIN%cloudIce - rttovIN%DeffLiq => cospgridIN%DeffLiq - rttovIN%DeffIce => cospgridIN%DeffIce - rttovIN%fl_rain => cospgridIN%fl_rain ! Keep in case of RTTOV-SCATT implementation. - rttovIN%fl_snow => cospgridIN%fl_snow ! Keep in case of RTTOV-SCATT implementation. - endif - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! 4) Call subcolumn simulators - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - ! ISCCP (icarus) subcolumn simulator - if (Lisccp_subcolumn .or. Lmodis_subcolumn) then - if (isccpIN%Npoints .gt. 0) then - allocate(isccpLEVMATCH(isccpIN%Npoints,isccpIN%Ncolumns), & - isccp_boxttop(isccpIN%Npoints,isccpIN%Ncolumns), & - isccp_boxptop(isccpIN%Npoints,isccpIN%Ncolumns), & - isccp_boxtau(isccpIN%Npoints,isccpIN%Ncolumns), & - isccp_meantbclr(isccpIN%Npoints)) - ! Call simulator - call icarus_subcolumn(isccpIN%npoints,isccpIN%ncolumns,isccpIN%nlevels, & - isccpIN%sunlit,isccpIN%dtau,isccpIN%dem,isccpIN%skt, & - isccpIN%emsfc_lw,isccpIN%qv,isccpIN%at,isccpIN%pfull, & - isccpIN%phalf,isccpIN%frac_out,isccpLEVMATCH, & - isccp_boxtau(:,:),isccp_boxptop(:,:), & - isccp_boxttop(:,:),isccp_meantbclr(:)) - if (cospIN % cospswathsIN(1) % N_inst_swaths .gt. 0) then - ! Decode outputs from swaths when reading into cospOUT fields - cospOUT%isccp_boxtau(ij:ik,:) = R_UNDEF - cospOUT%isccp_boxptop(ij:ik,:) = R_UNDEF - cospOUT%isccp_meantbclr(ij:ik) = R_UNDEF - if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(ij+int(ISCCP_MASK_INDICES)-1,:) = isccp_boxtau(:,:) - if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(ij+int(ISCCP_MASK_INDICES)-1,:) = isccp_boxptop(:,:) - if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(ij+int(ISCCP_MASK_INDICES)-1) = isccp_meantbclr(:) - else - if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(ij:ik,:) = isccp_boxtau - if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(ij:ik,:) = isccp_boxptop - if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(ij:ik) = isccp_meantbclr - end if - else - cospOUT%isccp_boxtau(ij:ik,:) = R_UNDEF - cospOUT%isccp_boxptop(ij:ik,:) = R_UNDEF - cospOUT%isccp_meantbclr(ij:ik) = R_UNDEF - end if - end if - - ! MISR subcolumn simulator - if (Lmisr_subcolumn) then - if (misrIN%Npoints .gt. 0) then - ! Allocate space for local variables. - allocate(misr_boxztop(misrIN%Npoints,misrIN%Ncolumns), & - misr_boxtau(misrIN%Npoints,misrIN%Ncolumns), & - misr_dist_model_layertops(misrIN%Npoints,numMISRHgtBins)) - ! Call simulator - call misr_subcolumn(misrIN%Npoints,misrIN%Ncolumns,misrIN%Nlevels,misrIN%dtau, & - misrIN%zfull,misrIN%at,misrIN%sunlit,misr_boxtau, & - misr_dist_model_layertops,misr_boxztop) - if (cospIN % cospswathsIN(2) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - ! Decode outputs from swaths when reading into cospOUT fields - cospOUT%misr_dist_model_layertops(ij:ik,:) = R_UNDEF - if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(ij+int(MISR_MASK_INDICES)-1,:) = misr_dist_model_layertops(:,:) - else - if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(ij:ik,:) = misr_dist_model_layertops - end if - else - cospOUT%misr_dist_model_layertops(ij:ik,:) = R_UNDEF - end if - end if - - ! Calipso subcolumn simulator - if (Lcalipso_subcolumn) then - if (calipsoIN%Npoints .gt. 0) then - ! Allocate space for local variables - allocate(calipso_beta_mol(calipsoIN%Npoints,calipsoIN%Nlevels), & - calipso_beta_tot(calipsoIN%Npoints,calipsoIN%Ncolumns,calipsoIN%Nlevels),& - calipso_betaperp_tot(calipsoIN%Npoints,calipsoIN%Ncolumns,calipsoIN%Nlevels)) - ! Call simulator - call lidar_subcolumn(calipsoIN%npoints, calipsoIN%ncolumns, calipsoIN%nlevels, .false., & - calipsoIN%beta_mol, calipsoIN%tau_mol, calipsoIN%betatot, calipsoIN%tautot, & - calipso_beta_mol(:,:), calipso_beta_tot(:,:,:), calipsoIN%betatot_ice, & - calipsoIN%tautot_ice, calipsoIN%betatot_liq, calipsoIN%tautot_liq, & - calipso_betaperp_tot(:,:,:)) - if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - ! Decode outputs from swaths when reading into cospOUT fields - cospOUT%calipso_beta_mol(ij:ik,:) = R_UNDEF - cospOUT%calipso_beta_tot(ij:ik,:,:) = R_UNDEF - cospOUT%calipso_betaperp_tot(ij:ik,:,:) = R_UNDEF - if (associated(cospOUT%calipso_beta_mol)) cospOUT%calipso_beta_mol(ij+int(CSCAL_MASK_INDICES)-1,calipsoIN%Nlevels:1:-1) = calipso_beta_mol(:,:) - if (associated(cospOUT%calipso_beta_tot)) cospOUT%calipso_beta_tot(ij+int(CSCAL_MASK_INDICES)-1,:,calipsoIN%Nlevels:1:-1) = calipso_beta_tot(:,:,:) - if (associated(cospOUT%calipso_betaperp_tot)) cospOUT%calipso_betaperp_tot(ij+int(CSCAL_MASK_INDICES)-1,:,:) = calipso_betaperp_tot(:,:,:) - else ! Proceed normally - ! Store output (if requested) - if (associated(cospOUT%calipso_beta_mol)) cospOUT%calipso_beta_mol(ij:ik,calipsoIN%Nlevels:1:-1) = calipso_beta_mol - if (associated(cospOUT%calipso_beta_tot)) cospOUT%calipso_beta_tot(ij:ik,:,calipsoIN%Nlevels:1:-1) = calipso_beta_tot - if (associated(cospOUT%calipso_betaperp_tot)) cospOUT%calipso_betaperp_tot(ij:ik,:,:) = calipso_betaperp_tot - endif - else - cospOUT%calipso_beta_mol(ij:ik,:) = R_UNDEF - cospOUT%calipso_beta_tot(ij:ik,:,:) = R_UNDEF - cospOUT%calipso_betaperp_tot(ij:ik,:,:) = R_UNDEF - endif - endif - - ! GROUND LIDAR subcolumn simulator - if (LgrLidar532_subcolumn) then - ! Allocate space for local variables - allocate(grLidar532_beta_mol(grLidar532IN%Npoints,grLidar532IN%Nlevels), & - grLidar532_beta_tot(grLidar532IN%Npoints,grLidar532IN%Ncolumns,grLidar532IN%Nlevels)) - ! Call simulator - call lidar_subcolumn(grLidar532IN%npoints, grLidar532IN%ncolumns, grLidar532IN%nlevels,& - .true., grLidar532IN%beta_mol, grLidar532IN%tau_mol, grLidar532IN%betatot,& - grLidar532IN%tautot, grLidar532_beta_mol(:,:), grLidar532_beta_tot(:,:,:)) - ! Store output (if requested) - if (associated(cospOUT%grLidar532_beta_mol)) & - cospOUT%grLidar532_beta_mol(ij:ik,grLidar532IN%Nlevels:1:-1) = grLidar532_beta_mol - if (associated(cospOUT%grLidar532_beta_tot)) & - cospOUT%grLidar532_beta_tot(ij:ik,:,grLidar532IN%Nlevels:1:-1) = grLidar532_beta_tot - endif - - ! ATLID subcolumn simulator - if (Latlid_subcolumn) then - if (atlidIN%Npoints .gt. 0) then - ! Allocate space for local variables - allocate(atlid_beta_mol(atlidIN%Npoints,atlidIN%Nlevels), & - atlid_beta_tot(atlidIN%Npoints,atlidIN%Ncolumns,atlidIN%Nlevels)) - ! Call simulator - call lidar_subcolumn(atlidIN%npoints, atlidIN%ncolumns, atlidIN%nlevels, & - .false., atlidIN%beta_mol_atlid, atlidIN%tau_mol_atlid, atlidIN%betatot_atlid, & - atlidIN%tautot_atlid, atlid_beta_mol(:,:), atlid_beta_tot(:,:,:)) - ! Decode outputs from swaths when reading into cospOUT fields - if (cospIN % cospswathsIN(4) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - cospOUT%atlid_beta_mol(ij:ik,:) = R_UNDEF - cospOUT%atlid_beta_tot(ij:ik,:,:) = R_UNDEF - if (associated(cospOUT%atlid_beta_mol)) cospOUT%atlid_beta_mol(ij+int(ATLID_MASK_INDICES)-1,atlidIN%Nlevels:1:-1) = atlid_beta_mol(:,:) - if (associated(cospOUT%atlid_beta_tot)) cospOUT%atlid_beta_tot(ij+int(ATLID_MASK_INDICES)-1,:,atlidIN%Nlevels:1:-1) = atlid_beta_tot(:,:,:) - else - ! Store output (if requested) - if (associated(cospOUT%atlid_beta_mol)) & - cospOUT%atlid_beta_mol(ij:ik,atlidIN%Nlevels:1:-1) = atlid_beta_mol - if (associated(cospOUT%atlid_beta_tot)) & - cospOUT%atlid_beta_tot(ij:ik,:,atlidIN%Nlevels:1:-1) = atlid_beta_tot - end if - else - cospOUT%atlid_beta_mol(ij:ik,:) = R_UNDEF - cospOUT%atlid_beta_tot(ij:ik,:,:) = R_UNDEF - endif - endif - - ! PARASOL subcolumn simulator - if (Lparasol_subcolumn) then - if (parasolIN%Npoints .gt. 0) then - ! Allocate space for local variables - allocate(parasolPix_refl(parasolIN%Npoints,parasolIN%Ncolumns,PARASOL_NREFL)) - ! Call simulator - do icol=1,parasolIN%Ncolumns - call parasol_subcolumn(parasolIN%npoints, PARASOL_NREFL, & - parasolIN%tautot_S_liq(1:parasolIN%Npoints,icol), & - parasolIN%tautot_S_ice(1:parasolIN%Npoints,icol), & - parasolPix_refl(:,icol,1:PARASOL_NREFL)) - ! Store output (if requested) - if (cospIN % cospswathsIN(5) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - cospOUT%parasolPix_refl(ij:ik,icol,1:PARASOL_NREFL) = R_UNDEF - if (associated(cospOUT%parasolPix_refl)) cospOUT%parasolPix_refl(ij+int(PARASOL_MASK_INDICES)-1,icol,1:PARASOL_NREFL) = parasolPix_refl(:,icol,1:PARASOL_NREFL) - else - if (associated(cospOUT%parasolPix_refl)) cospOUT%parasolPix_refl(ij:ik,icol,1:PARASOL_NREFL) = parasolPix_refl(:,icol,1:PARASOL_NREFL) - endif - enddo - else - cospOUT%parasolPix_refl(ij:ik,:,1:PARASOL_NREFL) = R_UNDEF - endif - endif - - ! Cloudsat (quickbeam) subcolumn simulator - if (Lcloudsat_subcolumn) then - ! Allocate space for local variables - if (cloudsatIN%Npoints .gt. 0) then - allocate(cloudsatDBZe(cloudsatIN%Npoints,cloudsatIN%Ncolumns,cloudsatIN%Nlevels), & - cloudsatZe_non(cloudsatIN%Npoints,cloudsatIN%Ncolumns,cloudsatIN%Nlevels)) - do icol=1,cloudsatIN%ncolumns - call quickbeam_subcolumn(cloudsatIN%rcfg,cloudsatIN%Npoints,cloudsatIN%Nlevels,& - cloudsatIN%hgt_matrix/1000._wp, & - cloudsatIN%z_vol(:,icol,:), & - cloudsatIN%kr_vol(:,icol,:), & - cloudsatIN%g_vol(:,1,:),cloudsatDBze(:,icol,:),cloudsatZe_non(:,icol,:)) - enddo - ! Store output (if requested) - if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - cospOUT%cloudsat_Ze_tot(ij:ik,:,:) = R_UNDEF - if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(ij+int(CSCAL_MASK_INDICES)-1,:,1:cloudsatIN%Nlevels) = cloudsatDBZe(:,:,1:cloudsatIN%Nlevels) - else - if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(ij:ik,:,:) = cloudsatDBZe(:,:,1:cloudsatIN%Nlevels) - endif - else - cospOUT%cloudsat_Ze_tot(ij:ik,:,:) = R_UNDEF - endif - endif - - ! MODIS subcolumn simulator - if (Lmodis_subcolumn) then - if (modisiN%nSunlit > 0) then - ! Allocate space for local variables - allocate(modisRetrievedTau(modisIN%nSunlit,modisIN%nColumns), & - modisRetrievedSize(modisIN%nSunlit,modisIN%nColumns), & - modisRetrievedPhase(modisIN%nSunlit,modisIN%nColumns), & - modisRetrievedCloudTopPressure(modisIN%nSunlit,modisIN%nColumns)) - if ((Lisccp_subcolumn .or. Lmodis_subcolumn) .and. (cospIN % cospswathsIN(1) % N_inst_swaths .gt. 0)) then ! If ISCCP is swathed must run ICARUS separately for MODIS - allocate(modisLEVMATCH(modisIN%Npoints,modisIN%Ncolumns), & - modis_boxptop(modisIN%Npoints,modisIN%Ncolumns), & - modis_boxttop(modisIN%Npoints,modisIN%Ncolumns), & - modis_boxtau(modisIN%Npoints,modisIN%Ncolumns), & - modis_meantbclr(modisIN%Npoints)) - if (.not. allocated(MODIS_SWATH_MASK)) then ! Allows to run when there is no swathing - allocate(MODIS_SWATH_MASK(Npoints)) - MODIS_SWATH_MASK(:) = .true. - end if - call icarus_subcolumn(modisIN%npoints,modisIN%ncolumns,modisIN%nlevels, & - int(MERGE(1,0,MASK=(cospgridIN%sunlit > 0) .and. MODIS_SWATH_MASK)), & - modisIN%tau,cospIN%emiss_11,cospgridIN%skt, & - cospIN%emsfc_lw,cospgridIN%qv,cospgridIN%at,cospgridIN%pfull, & - modisIN%pres,cospIN%frac_out,modisLEVMATCH, & - modis_boxtau(:,:),modis_boxptop(:,:), & - modis_boxttop(:,:),modis_meantbclr(:)) - deallocate(modis_boxtau,modis_boxttop,modis_meantbclr,modisLEVMATCH) - else ! If ISCCP runs fully, just use the cospOUT field indexed appropriately - allocate(modis_boxptop(modisIN%Npoints,modisIN%Ncolumns)) - modis_boxptop = cospOUT%isccp_boxptop(ij:ik,:) - end if - ! Call simulator one column at a time on sunlit columns - do i = 1, modisIN%nSunlit ! Just run on the sunlit columns, even though the modisIN DDT includes everything orbit swathed - call modis_subcolumn(modisIN%Ncolumns,modisIN%Nlevels, & - modisIN%pres(int(modisIN%sunlit(i)),:), & - modisIN%tau(int(modisIN%sunlit(i)),:,:), & - modisIN%liqFrac(int(modisIN%sunlit(i)),:,:), & - modisIN%g(int(modisIN%sunlit(i)),:,:), & - modisIN%w0(int(modisIN%sunlit(i)),:,:), & - modis_boxptop(int(modisIN%sunlit(i)),:), & - modisRetrievedPhase(i,:), & - modisRetrievedCloudTopPressure(i,:), & - modisRetrievedTau(i,:),modisRetrievedSize(i,:)) - end do - deallocate(modis_boxptop) - endif - endif - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! 5) Call column simulators - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - ! ISCCP - if (Lisccp_column) then - ! Check to see which outputs are requested. If not requested, use a local dummy array - if(.not. associated(cospOUT%isccp_meanalbedocld)) then - allocate(out1D_1(Npoints)) - cospOUT%isccp_meanalbedocld(ij:ik) => out1D_1 - endif - if(.not. associated(cospOUT%isccp_meanptop)) then - allocate(out1D_2(Npoints)) - cospOUT%isccp_meanptop(ij:ik) => out1D_2 - endif - if(.not. associated(cospOUT%isccp_meantaucld)) then - allocate(out1D_3(Npoints)) - cospOUT%isccp_meantaucld(ij:ik) => out1D_3 - endif - if(.not. associated(cospOUT%isccp_totalcldarea)) then - allocate(out1D_4(Npoints)) - cospOUT%isccp_totalcldarea(ij:ik) => out1D_4 - endif - if(.not. associated(cospOUT%isccp_meantb)) then - allocate(out1D_5(Npoints)) - cospOUT%isccp_meantb(ij:ik) => out1D_5 - endif - if(.not. associated(cospOUT%isccp_fq)) then - allocate(out1D_6(Npoints*numISCCPTauBins*numISCCPPresBins)) - cospOUT%isccp_fq(ij:ik,1:numISCCPTauBins,1:numISCCPPresBins) => out1D_6 - endif - - ! Call simulator - if (isccpIN%Npoints .gt. 0) then - allocate(temp_isccp_fq(isccpIN%Npoints,numISCCPTauBins,numISCCPPresBins), & - temp_isccp_meanalbedocld(isccpIN%Npoints), & - temp_isccp_meanptop(isccpIN%Npoints), & - temp_isccp_meantaucld(isccpIN%Npoints), & - temp_isccp_totalcldarea(isccpIN%Npoints), & - temp_isccp_meantb(isccpIN%Npoints)) - call icarus_column(isccpIN%npoints, isccpIN%ncolumns,isccp_boxtau(:,:), & - isccp_boxptop(:,:)/100._wp,isccpIN%sunlit,isccp_boxttop(:,:), & - temp_isccp_fq, & - temp_isccp_meanalbedocld, & - temp_isccp_meanptop,temp_isccp_meantaucld, & - temp_isccp_totalcldarea,temp_isccp_meantb) - if (cospIN % cospswathsIN(1) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - ! Decode back to the cospOUT shapes - cospOUT%isccp_fq(ij:ik,:,:) = R_UNDEF - cospOUT%isccp_meanalbedocld(ij:ik) = R_UNDEF - cospOUT%isccp_meanptop(ij:ik) = R_UNDEF - cospOUT%isccp_meantaucld(ij:ik) = R_UNDEF - cospOUT%isccp_totalcldarea(ij:ik) = R_UNDEF - cospOUT%isccp_meantb(ij:ik) = R_UNDEF - if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(ij+int(ISCCP_MASK_INDICES)-1,:,:) = temp_isccp_fq(:,:,:) - if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(ij+int(ISCCP_MASK_INDICES)-1) = temp_isccp_meanalbedocld(:) - if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(ij+int(ISCCP_MASK_INDICES)-1) = temp_isccp_meanptop(:) - if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(ij+int(ISCCP_MASK_INDICES)-1) = temp_isccp_meantaucld(:) - if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(ij+int(ISCCP_MASK_INDICES)-1) = temp_isccp_totalcldarea(:) - if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(ij+int(ISCCP_MASK_INDICES)-1) = temp_isccp_meantb(:) - else - if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(ij:ik,:,:) = temp_isccp_fq(:,:,:) - if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(ij:ik) = temp_isccp_meanalbedocld(:) - if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(ij:ik) = temp_isccp_meanptop(:) - if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(ij:ik) = temp_isccp_meantaucld(:) - if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(ij:ik) = temp_isccp_totalcldarea(:) - if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(ij:ik) = temp_isccp_meantb(:) - end if - deallocate(temp_isccp_fq,temp_isccp_meanalbedocld,temp_isccp_meanptop,temp_isccp_meantaucld,temp_isccp_totalcldarea,temp_isccp_meantb) - else - cospOUT%isccp_fq(ij:ik,:,:) = R_UNDEF - cospOUT%isccp_meanalbedocld(ij:ik) = R_UNDEF - cospOUT%isccp_meanptop(ij:ik) = R_UNDEF - cospOUT%isccp_meantaucld(ij:ik) = R_UNDEF - cospOUT%isccp_totalcldarea(ij:ik) = R_UNDEF - cospOUT%isccp_meantb(ij:ik) = R_UNDEF - end if - cospOUT%isccp_fq(ij:ik,:,:) = cospOUT%isccp_fq(ij:ik,:,7:1:-1) - - ! Check if there is any value slightly greater than 1 - where ((cospOUT%isccp_totalcldarea > 1.0-1.e-5) .and. & - (cospOUT%isccp_totalcldarea < 1.0+1.e-5)) - cospOUT%isccp_totalcldarea = 1.0 - endwhere - - ! Clear up memory (if necessary) - if (allocated(isccp_boxttop)) deallocate(isccp_boxttop) - if (allocated(isccp_boxptop)) deallocate(isccp_boxptop) - if (allocated(isccp_boxtau)) deallocate(isccp_boxtau) - if (allocated(isccp_meantbclr)) deallocate(isccp_meantbclr) - if (allocated(isccpLEVMATCH)) deallocate(isccpLEVMATCH) - if (allocated(ISCCP_MASK_INDICES)) deallocate(ISCCP_MASK_INDICES) - if (allocated(out1D_1)) then - deallocate(out1D_1) - nullify(cospOUT%isccp_meanalbedocld) - endif - if (allocated(out1D_2)) then - deallocate(out1D_2) - nullify(cospOUT%isccp_meanptop) - endif - if (allocated(out1D_3)) then - deallocate(out1D_3) - nullify(cospOUT%isccp_meantaucld) - endif - if (allocated(out1D_4)) then - deallocate(out1D_4) - nullify(cospOUT%isccp_totalcldarea) - endif - if (allocated(out1D_5)) then - deallocate(out1D_5) - nullify(cospOUT%isccp_meantb) - endif - if (allocated(out1D_6)) then - deallocate(out1D_6) - nullify(cospOUT%isccp_fq) - endif - endif - - ! MISR - if (Lmisr_column) then - ! Check to see which outputs are requested. If not requested, use a local dummy array - if (.not. associated(cospOUT%misr_cldarea)) then - allocate(out1D_1(Npoints)) - cospOUT%misr_cldarea(ij:ik) => out1D_1 - endif - if (.not. associated(cospOUT%misr_meanztop)) then - allocate(out1D_2(Npoints)) - cospOUT%misr_meanztop(ij:ik) => out1D_2 - endif - if (.not. associated(cospOUT%misr_fq)) then - allocate(out1D_3(Npoints*numMISRTauBins*numMISRHgtBins)) - cospOUT%misr_fq(ij:ik,1:numMISRTauBins,1:numMISRHgtBins) => out1D_3 - endif - - ! Call simulator - if (cospIN % cospswathsIN(2) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - if (misrIN%Npoints .gt. 0) then - ! Operate at the masked format. - allocate(temp_misr_cldarea(misrIN%Npoints), & - temp_misr_meanztop(misrIN%Npoints), & - temp_misr_fq(misrIN%Npoints,numMISRTauBins,numMISRHgtBins)) - call misr_column(misrIN%Npoints,misrIN%Ncolumns,misr_boxztop,misrIN%sunlit, & - misr_boxtau,temp_misr_cldarea(:), & - temp_misr_meanztop(:),temp_misr_fq(:,:,:)) - ! Decode back to the cospOUT shapes - cospOUT%misr_cldarea(ij:ik) = R_UNDEF - cospOUT%misr_meanztop(ij:ik) = R_UNDEF - cospOUT%misr_fq(ij:ik,:,:) = R_UNDEF - if (associated(cospOUT%misr_cldarea)) cospOUT%misr_cldarea(ij+int(MISR_MASK_INDICES)-1) = temp_misr_cldarea(:) - if (associated(cospOUT%misr_meanztop)) cospOUT%misr_meanztop(ij+int(MISR_MASK_INDICES)-1) = temp_misr_meanztop(:) - if (associated(cospOUT%misr_fq)) cospOUT%misr_fq(ij+int(MISR_MASK_INDICES)-1,:,:) = temp_misr_fq(:,:,:) - deallocate(temp_misr_cldarea,temp_misr_meanztop,temp_misr_fq) - else - cospOUT%misr_cldarea(ij:ik) = R_UNDEF - cospOUT%misr_meanztop(ij:ik) = R_UNDEF - cospOUT%misr_fq(ij:ik,:,:) = R_UNDEF - endif - else - call misr_column(misrIN%Npoints,misrIN%Ncolumns,misr_boxztop,misrIN%sunlit,& - misr_boxtau,cospOUT%misr_cldarea(ij:ik), & - cospOUT%misr_meanztop(ij:ik),cospOUT%misr_fq(ij:ik,:,:)) - endif - ! Clear up memory - if (allocated(misr_boxtau)) deallocate(misr_boxtau) - if (allocated(misr_boxztop)) deallocate(misr_boxztop) - if (allocated(misr_dist_model_layertops)) deallocate(misr_dist_model_layertops) - if (allocated(MISR_MASK_INDICES)) deallocate(MISR_MASK_INDICES) - if (allocated(out1D_1)) then - deallocate(out1D_1) - nullify(cospOUT%misr_cldarea) - endif - if (allocated(out1D_2)) then - deallocate(out1D_2) - nullify(cospOUT%misr_meanztop) - endif - if (allocated(out1D_3)) then - deallocate(out1D_3) - nullify(cospOUT%misr_fq) - endif - endif - - ! CALIPSO LIDAR Simulator - if (Lcalipso_column) then - ! Check to see which outputs are requested. If not requested, use a local dummy array - if (.not. associated(cospOUT%calipso_cfad_sr)) then - allocate(out1D_1(Npoints*SR_BINS*Nlvgrid)) - cospOUT%calipso_cfad_sr(ij:ik,1:SR_BINS,1:Nlvgrid) => out1D_1 - endif - if (.not. associated(cospOUT%calipso_lidarcld)) then - allocate(out1D_2(Npoints*Nlvgrid)) - cospOUT%calipso_lidarcld(ij:ik,1:Nlvgrid) => out1D_2 - endif - if (.not. associated(cospOUT%calipso_lidarcldphase)) then - allocate(out1D_3(Npoints*Nlvgrid*6)) - cospOUT%calipso_lidarcldphase(ij:ik,1:Nlvgrid,1:6) => out1D_3 - endif - if (.not. associated(cospOUT%calipso_cldlayer)) then - allocate(out1D_4(Npoints*LIDAR_NCAT)) - cospOUT%calipso_cldlayer(ij:ik,1:LIDAR_NCAT) => out1D_4 - endif - if (.not. associated(cospOUT%calipso_cldlayerphase)) then - allocate(out1D_5(Npoints*LIDAR_NCAT*6)) - cospOUT%calipso_cldlayerphase(ij:ik,1:LIDAR_NCAT,1:6) => out1D_5 - endif - if (.not. associated(cospOUT%calipso_lidarcldtmp)) then - allocate(out1D_6(Npoints*40*5)) - cospOUT%calipso_lidarcldtmp(ij:ik,1:40,1:5) => out1D_6 - endif - if (.not. associated(cospOUT%calipso_lidarcldtype)) then - allocate(out1D_7(Npoints*Nlvgrid*4)) - cospOUT%calipso_lidarcldtype(ij:ik,1:Nlvgrid,1:4) => out1D_7 - endif - if (.not. associated(cospOUT%calipso_cldtype)) then - allocate(out1D_8(Npoints*LIDAR_NTYPE)) - cospOUT%calipso_cldtype(ij:ik,1:LIDAR_NTYPE) => out1D_8 - endif - if (.not. associated(cospOUT%calipso_cldtypetemp)) then - allocate(out1D_9(Npoints*LIDAR_NTYPE)) - cospOUT%calipso_cldtypetemp(ij:ik,1:LIDAR_NTYPE) => out1D_9 - endif - if (.not. associated(cospOUT%calipso_cldtypemeanz)) then - allocate(out1D_10(Npoints*2)) - cospOUT%calipso_cldtypemeanz(ij:ik,1:2) => out1D_10 - endif - if (.not. associated(cospOUT%calipso_cldtypemeanzse)) then - allocate(out1D_12(Npoints*3)) - cospOUT%calipso_cldtypemeanzse(ij:ik,1:3) => out1D_12 - endif - if (.not. associated(cospOUT%calipso_cldthinemis)) then - allocate(out1D_11(Npoints)) - cospOUT%calipso_cldthinemis(ij:ik) => out1D_11 - endif - - ! Call simulator - if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - ! Operate at the masked format. - if (calipsoIN%Npoints .gt. 0) then - allocate(temp_calipso_cfad_sr(calipsoIN%Npoints,SR_BINS,Nlvgrid), & - temp_calipso_lidarcld(calipsoIN%Npoints,Nlvgrid), & - temp_calipso_cldlayer(calipsoIN%Npoints,LIDAR_NCAT), & - temp_calipso_lidarcldphase(calipsoIN%Npoints,Nlvgrid,6), & - temp_calipso_lidarcldtype(calipsoIN%Npoints,Nlvgrid,LIDAR_NTYPE+1), & - temp_calipso_cldtype(calipsoIN%Npoints,LIDAR_NTYPE), & - temp_calipso_cldtypetemp(calipsoIN%Npoints,LIDAR_NTYPE), & - temp_calipso_cldtypemeanz(calipsoIN%Npoints,2), & - temp_calipso_cldtypemeanzse(calipsoIN%Npoints,3), & - temp_calipso_cldthinemis(calipsoIN%Npoints), & - temp_calipso_cldlayerphase(calipsoIN%Npoints,LIDAR_NCAT,6), & - temp_calipso_lidarcldtmp(calipsoIN%Npoints,LIDAR_NTEMP,5)) - ok_lidar_cfad=.true. - call lidar_column(calipsoIN%Npoints, calipsoIN%Ncolumns, calipsoIN%Nlevels, & - Nlvgrid, SR_BINS, LIDAR_NTYPE, 'calipso',calipso_beta_tot(:,:,:), calipso_beta_mol(:,:), & - cospgridIN%phalf(int(CSCAL_MASK_INDICES),2:calipsoIN%Nlevels+1), & - cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES),:), & - cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES),:), vgrid_z(:), ok_lidar_cfad, LIDAR_NCAT, & - temp_calipso_cfad_sr(:,:,:), temp_calipso_lidarcld(:,:), temp_calipso_cldlayer(:,:), & - cospgridIN%at(int(CSCAL_MASK_INDICES),:), calipso_betaperp_tot(:,:,:), & - cospgridIN%surfelev(int(CSCAL_MASK_INDICES)), & - temp_calipso_lidarcldphase(:,:,:), & - temp_calipso_lidarcldtype(:,:,:), temp_calipso_cldtype(:,:), & - temp_calipso_cldtypetemp(:,:), temp_calipso_cldtypemeanz(:,:), & - temp_calipso_cldtypemeanzse(:,:), temp_calipso_cldthinemis(:), & - temp_calipso_cldlayerphase(:,:,:), temp_calipso_lidarcldtmp(:,:,:)) - ! Decode back to the cospOUT shapes - cospOUT%calipso_cfad_sr(ij:ik,:,:) = R_UNDEF - cospOUT%calipso_lidarcld(ij:ik,:) = R_UNDEF - cospOUT%calipso_cldlayer(ij:ik,:) = R_UNDEF - cospOUT%calipso_lidarcldphase(ij:ik,:,:) = R_UNDEF - cospOUT%calipso_lidarcldtype(ij:ik,:,:) = R_UNDEF - cospOUT%calipso_cldtype(ij:ik,:) = R_UNDEF - cospOUT%calipso_cldtypetemp(ij:ik,:) = R_UNDEF - cospOUT%calipso_cldtypemeanz(ij:ik,:) = R_UNDEF - cospOUT%calipso_cldtypemeanzse(ij:ik,:) = R_UNDEF - cospOUT%calipso_cldthinemis(ij:ik) = R_UNDEF - cospOUT%calipso_cldlayerphase(ij:ik,:,:) = R_UNDEF - cospOUT%calipso_lidarcldtmp(ij:ik,:,:) = R_UNDEF - ! Note: The active simulators use R_UNDEF to indicate unretrieved and clear-sky values. - ! Decisions on how to treat these values are delegeate to the host user, and fields - ! are often set to zero. - ! Using R_UNDEF in this way is incompatible with the swath approach, where R_UNDEF means - ! that a field should not be used in statistically averaging, etc. - ! To avoid this error, when swathing we set R_UNDEF value to zero here. - where (temp_calipso_cfad_sr(:,:,:) == R_UNDEF) temp_calipso_cfad_sr(:,:,:) = 0._wp - where (temp_calipso_lidarcldphase(:,:,:) == R_UNDEF) temp_calipso_lidarcldphase(:,:,:) = 0._wp - where (temp_calipso_lidarcld(:,:) == R_UNDEF) temp_calipso_lidarcld(:,:) = 0._wp - ! Unpack into the full lat-lon structure - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(ij+int(CSCAL_MASK_INDICES)-1,:,:) = temp_calipso_cfad_sr(:,:,:) - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_calipso_lidarcld(:,:) - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_calipso_cldlayer(:,:) - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(ij+int(CSCAL_MASK_INDICES)-1,:,:) = temp_calipso_lidarcldphase(:,:,:) - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(ij+int(CSCAL_MASK_INDICES)-1,:,:) = temp_calipso_lidarcldtype(:,:,:) - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_calipso_cldtype(:,:) - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_calipso_cldtypetemp(:,:) - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_calipso_cldtypemeanz(:,:) - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_calipso_cldtypemeanzse(:,:) - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(ij+int(CSCAL_MASK_INDICES)-1) = temp_calipso_cldthinemis(:) - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(ij+int(CSCAL_MASK_INDICES)-1,:,:) = temp_calipso_cldlayerphase(:,:,:) - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(ij+int(CSCAL_MASK_INDICES)-1,:,:) = temp_calipso_lidarcldtmp(:,:,:) - deallocate(temp_calipso_cfad_sr,temp_calipso_lidarcld,temp_calipso_cldlayer,temp_calipso_lidarcldphase, & - temp_calipso_lidarcldtype,temp_calipso_cldtype,temp_calipso_cldtypetemp,temp_calipso_cldtypemeanz, & - temp_calipso_cldtypemeanzse,temp_calipso_cldthinemis,temp_calipso_cldlayerphase,temp_calipso_lidarcldtmp) - else - cospOUT%calipso_cfad_sr(ij:ik,:,:) = R_UNDEF - cospOUT%calipso_lidarcld(ij:ik,:) = R_UNDEF - cospOUT%calipso_cldlayer(ij:ik,:) = R_UNDEF - cospOUT%calipso_lidarcldphase(ij:ik,:,:) = R_UNDEF - cospOUT%calipso_lidarcldtype(ij:ik,:,:) = R_UNDEF - cospOUT%calipso_cldtype(ij:ik,:) = R_UNDEF - cospOUT%calipso_cldtypetemp(ij:ik,:) = R_UNDEF - cospOUT%calipso_cldtypemeanz(ij:ik,:) = R_UNDEF - cospOUT%calipso_cldtypemeanzse(ij:ik,:) = R_UNDEF - cospOUT%calipso_cldthinemis(ij:ik) = R_UNDEF - cospOUT%calipso_cldlayerphase(ij:ik,:,:) = R_UNDEF - cospOUT%calipso_lidarcldtmp(ij:ik,:,:) = R_UNDEF - endif - else - ok_lidar_cfad=.true. - call lidar_column(calipsoIN%Npoints, calipsoIN%Ncolumns, calipsoIN%Nlevels, & - Nlvgrid, SR_BINS, LIDAR_NTYPE, 'calipso',calipso_beta_tot(:,:,:), calipso_beta_mol(:,:),& - cospgridIN%phalf(:,2:calipsoIN%Nlevels+1),cospgridIN%hgt_matrix, & - cospgridIN%hgt_matrix_half, vgrid_z(:), ok_lidar_cfad, LIDAR_NCAT, & - cospOUT%calipso_cfad_sr(ij:ik,:,:), cospOUT%calipso_lidarcld(ij:ik,:), & - cospOUT%calipso_cldlayer(ij:ik,:), & - cospgridIN%at(:,:), calipso_betaperp_tot(:,:,:), cospgridIN%surfelev, & - cospOUT%calipso_lidarcldphase(ij:ik,:,:), & - cospOUT%calipso_lidarcldtype(ij:ik,:,:), cospOUT%calipso_cldtype(ij:ik,:), & - cospOUT%calipso_cldtypetemp(ij:ik,:), cospOUT%calipso_cldtypemeanz(ij:ik,:), & - cospOUT%calipso_cldtypemeanzse(ij:ik,:), cospOUT%calipso_cldthinemis(ij:ik), & - cospOUT%calipso_cldlayerphase(ij:ik,:,:), cospOUT%calipso_lidarcldtmp(ij:ik,:,:)) - endif - - if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval = calipso_histBsct - - ! Free up memory (if necessary) - if (allocated(out1D_1)) then - deallocate(out1D_1) - nullify(cospOUT%calipso_cfad_sr) - endif - if (allocated(out1D_2)) then - deallocate(out1D_2) - nullify(cospOUT%calipso_lidarcld) - endif - if (allocated(out1D_3)) then - deallocate(out1D_3) - nullify(cospOUT%calipso_lidarcldphase) - endif - if (allocated(out1D_4)) then - deallocate(out1D_4) - nullify(cospOUT%calipso_cldlayer) - endif - if (allocated(out1D_5)) then - deallocate(out1D_5) - nullify(cospOUT%calipso_cldlayerphase) - endif - if (allocated(out1D_6)) then - deallocate(out1D_6) - nullify(cospOUT%calipso_lidarcldtmp) - endif - if (allocated(out1D_7)) then - deallocate(out1D_7) - nullify(cospOUT%calipso_lidarcldtype) - endif - if (allocated(out1D_8)) then - deallocate(out1D_8) - nullify(cospOUT%calipso_cldtype) - endif - if (allocated(out1D_9)) then - deallocate(out1D_9) - nullify(cospOUT%calipso_cldtypetemp) - endif - if (allocated(out1D_10)) then - deallocate(out1D_10) - nullify(cospOUT%calipso_cldtypemeanz) - endif - if (allocated(out1D_12)) then - deallocate(out1D_12) - nullify(cospOUT%calipso_cldtypemeanzse) - endif - if (allocated(out1D_11)) then - deallocate(out1D_11) - nullify(cospOUT%calipso_cldthinemis) - endif - - endif - - ! GROUND LIDAR Simulator - if (LgrLidar532_column) then - ! Check to see which outputs are requested. If not requested, use a local dummy array - if (.not. associated(cospOUT%grLidar532_cfad_sr)) then - allocate(out1D_1(Npoints*SR_BINS*Nlvgrid)) - cospOUT%grLidar532_cfad_sr(ij:ik,1:SR_BINS,1:Nlvgrid) => out1D_1 - endif - if (.not. associated(cospOUT%grLidar532_lidarcld)) then - allocate(out1D_2(Npoints*Nlvgrid)) - cospOUT%grLidar532_lidarcld(ij:ik,1:Nlvgrid) => out1D_2 - endif - if (.not. associated(cospOUT%grLidar532_cldlayer)) then - allocate(out1D_3(Npoints*LIDAR_NCAT)) - cospOUT%grLidar532_cldlayer(ij:ik,1:LIDAR_NCAT) => out1D_3 - endif - - ! Call simulator - ok_lidar_cfad_grLidar532=.true. - call lidar_column(grLidar532IN%Npoints, grLidar532IN%Ncolumns, grLidar532IN%Nlevels, & - Nlvgrid, SR_BINS, LIDAR_NTYPE, 'grlidar532',grLidar532_beta_tot(:,:,:), grLidar532_beta_mol(:,:),& - cospgridIN%phalf(:,2:grLidar532IN%Nlevels+1),cospgridIN%hgt_matrix, & - cospgridIN%hgt_matrix_half, vgrid_z(:), ok_lidar_cfad_grLidar532, LIDAR_NCAT, & - cospOUT%grLidar532_cfad_sr(ij:ik,:,:), cospOUT%grLidar532_lidarcld(ij:ik,:), & - cospOUT%grLidar532_cldlayer(ij:ik,:)) - - if (associated(cospOUT%grLidar532_srbval)) cospOUT%grLidar532_srbval = grLidar532_histBsct - - ! Free up memory (if necessary) - if (allocated(out1D_1)) then - deallocate(out1D_1) - nullify(cospOUT%grLidar532_cfad_sr) - endif - if (allocated(out1D_2)) then - deallocate(out1D_2) - nullify(cospOUT%grLidar532_lidarcld) - endif - if (allocated(out1D_3)) then - deallocate(out1D_3) - nullify(cospOUT%grLidar532_cldlayer) - endif - - endif - - ! ATLID Simulator - if (Latlid_column) then - ! Check to see which outputs are requested. If not requested, use a local dummy array - if (.not. associated(cospOUT%atlid_cfad_sr)) then - allocate(out1D_1(Npoints*SR_BINS*Nlvgrid)) - cospOUT%atlid_cfad_sr(ij:ik,1:SR_BINS,1:Nlvgrid) => out1D_1 - endif - if (.not. associated(cospOUT%atlid_lidarcld)) then - allocate(out1D_2(Npoints*Nlvgrid)) - cospOUT%atlid_lidarcld(ij:ik,1:Nlvgrid) => out1D_2 - endif - if (.not. associated(cospOUT%atlid_cldlayer)) then - allocate(out1D_3(Npoints*LIDAR_NCAT)) - cospOUT%atlid_cldlayer(ij:ik,1:LIDAR_NCAT) => out1D_3 - endif - ! Call simulator - ok_lidar_cfad_atlid=.true. - if (cospIN % cospswathsIN(4) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - if (atlidIN%Npoints .gt. 0) then - allocate(temp_atlid_cfad_sr(atlidIN%Npoints,SR_BINS,Nlvgrid), & - temp_atlid_lidarcld(atlidIN%Npoints,Nlvgrid), & - temp_atlid_cldlayer(atlidIN%Npoints,LIDAR_NCAT)) - call lidar_column(atlidIN%Npoints, atlidIN%Ncolumns, atlidIN%Nlevels, & - Nlvgrid, SR_BINS, LIDAR_NTYPE, 'atlid',atlid_beta_tot(:,:,:), & - atlid_beta_mol(:,:), cospgridIN%phalf(int(ATLID_MASK_INDICES),2:atlidIN%Nlevels+1), & - cospgridIN%hgt_matrix(int(ATLID_MASK_INDICES),:), & - cospgridIN%hgt_matrix_half(int(ATLID_MASK_INDICES),:), vgrid_z(:), & - ok_lidar_cfad_atlid, LIDAR_NCAT, temp_atlid_cfad_sr(:,:,:), & - temp_atlid_lidarcld(:,:), temp_atlid_cldlayer(:,:)) - ! Decode back to the cospOUT shapes - cospOUT%atlid_cfad_sr(ij:ik,:,:) = R_UNDEF - cospOUT%atlid_lidarcld(ij:ik,:) = R_UNDEF - cospOUT%atlid_cldlayer(ij:ik,:) = R_UNDEF - if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(ij+int(ATLID_MASK_INDICES)-1,:,:) = temp_atlid_cfad_sr(:,:,:) - if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(ij+int(ATLID_MASK_INDICES)-1,:) = temp_atlid_lidarcld(:,:) - if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(ij+int(ATLID_MASK_INDICES)-1,:) = temp_atlid_cldlayer(:,:) - deallocate(temp_atlid_cfad_sr,temp_atlid_lidarcld,temp_atlid_cldlayer) - else - cospOUT%atlid_cfad_sr(ij:ik,:,:) = R_UNDEF - cospOUT%atlid_lidarcld(ij:ik,:) = R_UNDEF - cospOUT%atlid_cldlayer(ij:ik,:) = R_UNDEF - endif - else - call lidar_column(atlidIN%Npoints, atlidIN%Ncolumns, atlidIN%Nlevels, & - Nlvgrid, SR_BINS, LIDAR_NTYPE, 'atlid',atlid_beta_tot(:,:,:), & - atlid_beta_mol(:,:), cospgridIN%phalf(:,2:atlidIN%Nlevels+1), & - cospgridIN%hgt_matrix, cospgridIN%hgt_matrix_half, vgrid_z(:), & - ok_lidar_cfad_atlid, LIDAR_NCAT, cospOUT%atlid_cfad_sr(ij:ik,:,:), & - cospOUT%atlid_lidarcld(ij:ik,:), cospOUT%atlid_cldlayer(ij:ik,:)) - endif - if (associated(cospOUT%atlid_srbval)) cospOUT%atlid_srbval = atlid_histBsct - - ! Free up memory (if necessary) - if (allocated(ATLID_MASK_INDICES)) deallocate(ATLID_MASK_INDICES) - if (allocated(out1D_1)) then - deallocate(out1D_1) - nullify(cospOUT%atlid_cfad_sr) - endif - if (allocated(out1D_2)) then - deallocate(out1D_2) - nullify(cospOUT%atlid_lidarcld) - endif - if (allocated(out1D_3)) then - deallocate(out1D_3) - nullify(cospOUT%atlid_cldlayer) - endif - - endif - - ! PARASOL - if (Lparasol_column) then - if (cospIN % cospswathsIN(5) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - if (parasolIN%Npoints .gt. 0) then - allocate(temp_parasolGrid_refl(parasolIN%Npoints,PARASOL_NREFL)) - call parasol_column(parasolIN%Npoints,PARASOL_NREFL,parasolIN%Ncolumns, & - cospgridIN%land(int(PARASOL_MASK_INDICES)),parasolPix_refl(:,:,:), & - temp_parasolGrid_refl(:,:)) - ! Decode back to the cospOUT shapes - cospOUT%parasolGrid_refl(ij:ik,:) = R_UNDEF - ! Note: The active simulators use R_UNDEF to indicate unretrieved and clear-sky values. - ! Decisions on how to treat these values are delegeate to the host user, and fields - ! are often set to zero. - ! Using R_UNDEF in this way is incompatible with the swath approach, where R_UNDEF means - ! that a field should not be used in statistically averaging, etc. - ! To avoid this error, when swathing we set R_UNDEF value to zero here. - where (temp_parasolGrid_refl(:,:) == R_UNDEF) temp_parasolGrid_refl(:,:) = 0._wp - if (associated(cospOUT%parasolGrid_refl)) cospOUT%parasolGrid_refl(ij+int(PARASOL_MASK_INDICES)-1,:) = temp_parasolGrid_refl(:,:) - deallocate(temp_parasolGrid_refl) - else - cospOUT%parasolGrid_refl(ij:ik,:) = R_UNDEF - endif - else - call parasol_column(parasolIN%Npoints,PARASOL_NREFL,parasolIN%Ncolumns, & - cospgridIN%land(:),parasolPix_refl(:,:,:), & - cospOUT%parasolGrid_refl(ij:ik,:)) - ! print*,'cospOUT%parasolGrid_refl: ',cospOUT%parasolGrid_refl ! Values not zeroed here. - endif - if (allocated(parasolPix_refl)) deallocate(parasolPix_refl) - if (allocated(PARASOL_MASK_INDICES)) deallocate(PARASOL_MASK_INDICES) - endif - - ! CLOUDSAT - if (Lcloudsat_column) then - ! Check to see which outputs are requested. If not requested, use a local dummy array - if (.not. associated(cospOUT%cloudsat_cfad_ze)) then - allocate(out1D_1(Npoints*cloudsat_DBZE_BINS*Nlvgrid)) - cospOUT%cloudsat_cfad_ze(ij:ik,1:cloudsat_DBZE_BINS,1:Nlvgrid) => out1D_1 - endif - - if (.not. associated(cospOUT%cloudsat_pia)) then - allocate(out1D_2(Npoints)) - cospOUT%cloudsat_pia(ij:ik) => out1D_2 - endif - if (.not. associated(cospOUT%cloudsat_precip_cover)) then - allocate(out1D_3(Npoints*nCloudsatPrecipClass)) - cospOUT%cloudsat_precip_cover(ij:ik,1:nCloudsatPrecipClass) => out1D_3 - endif - - ! Call simulator - if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - if (cloudsatIN%Npoints .gt. 0) then - allocate(temp_cloudsat_cfad_ze(cloudsatIN%Npoints,cloudsat_DBZE_BINS,Nlvgrid), & - temp_cloudsat_precip_cover(cloudsatIN%Npoints,cloudsat_DBZE_BINS), & - temp_cloudsat_pia(cloudsatIN%Npoints)) - call quickbeam_column(cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels, & - Nlvgrid, cloudsat_DBZE_BINS, 'cloudsat', cloudsatDBZe, cloudsatZe_non, & - cospgridIN%land(int(CSCAL_MASK_INDICES)), cospgridIN%surfelev(int(CSCAL_MASK_INDICES)), & - cospgridIN%at(int(CSCAL_MASK_INDICES),cospIN%Nlevels), cospIN%fracPrecipIce(int(CSCAL_MASK_INDICES),:), & - cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES),:), cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES),:), & - temp_cloudsat_cfad_ze(:,:,:), temp_cloudsat_precip_cover(:,:), temp_cloudsat_pia(:)) - ! Decode back to the cospOUT shapes - cospOUT%cloudsat_cfad_ze(ij:ik,:,:) = R_UNDEF - cospOUT%cloudsat_precip_cover(ij:ik,:) = R_UNDEF - cospOUT%cloudsat_pia(ij:ik) = R_UNDEF - ! Note: The active simulators use R_UNDEF to indicate unretrieved and clear-sky values. - ! Decisions on how to treat these values are delegeate to the host user, and fields - ! are often set to zero. - ! Using R_UNDEF in this way is incompatible with the swath approach, where R_UNDEF means - ! that a field should not be used in statistically averaging, etc. - ! To avoid this error, when swathing we set R_UNDEF value to zero here. - where (temp_cloudsat_cfad_ze(:,:,:) == R_UNDEF) temp_cloudsat_cfad_ze(:,:,:) = 0._wp - if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(ij+int(CSCAL_MASK_INDICES)-1,:,:) = temp_cloudsat_cfad_ze(:,:,:) - if (associated(cospOUT%cloudsat_precip_cover)) cospOUT%cloudsat_precip_cover(ij+int(CSCAL_MASK_INDICES)-1,:) = temp_cloudsat_precip_cover(:,:) - if (associated(cospOUT%cloudsat_pia)) cospOUT%cloudsat_pia(ij+int(CSCAL_MASK_INDICES)-1) = temp_cloudsat_pia(:) - deallocate(temp_cloudsat_cfad_ze,temp_cloudsat_precip_cover,temp_cloudsat_pia) - if (allocated(CSCAL_SWATH_MASK)) deallocate(CSCAL_SWATH_MASK) - else - cospOUT%cloudsat_cfad_ze(ij:ik,:,:) = R_UNDEF - cospOUT%cloudsat_precip_cover(ij:ik,:) = R_UNDEF - cospOUT%cloudsat_pia(ij:ik) = R_UNDEF - endif - else - call quickbeam_column(cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels,& - Nlvgrid, cloudsat_DBZE_BINS, 'cloudsat', cloudsatDBZe, cloudsatZe_non, & - cospgridIN%land(:), cospgridIN%surfelev(:), cospgridIN%at(:,cospIN%Nlevels), & - cospIN%fracPrecipIce, cospgridIN%hgt_matrix, cospgridIN%hgt_matrix_half, & - cospOUT%cloudsat_cfad_ze(ij:ik,:,:), cospOUT%cloudsat_precip_cover(ij:ik,:), & - cospOUT%cloudsat_pia(ij:ik)) - endif - ! Free up memory (if necessary) - if (allocated(out1D_1)) then - deallocate(out1D_1) - nullify(cospOUT%cloudsat_cfad_ze) - endif - if (allocated(out1D_2)) then - deallocate(out1D_2) - nullify(cospOUT%cloudsat_pia) - endif - if (allocated(out1D_3)) then - deallocate(out1D_3) - nullify(cospOUT%cloudsat_precip_cover) - endif - endif - - ! MODIS - if (Lmodis_column) then - if (modisIN%nSunlit > 0) then - ! Allocate space for local variables - allocate(modisCftotal(modisIN%nSunlit), modisCfLiquid(modisIN%nSunlit), & - modisCfIce(modisIN%nSunlit),modisCfHigh(modisIN%nSunlit), & - modisCfMid(modisIN%nSunlit),modisCfLow(modisIN%nSunlit), & - modisMeanTauTotal(modisIN%nSunlit), & - modisMeanTauLiquid(modisIN%nSunlit),modisMeanTauIce(modisIN%nSunlit), & - modisMeanLogTauTotal(modisIN%nSunlit), & - modisMeanLogTauLiquid(modisIN%nSunlit), & - modisMeanLogTauIce(modisIN%nSunlit), & - modisMeanSizeLiquid(modisIN%nSunlit), & - modisMeanSizeIce(modisIN%nSunlit), & - modisMeanCloudTopPressure(modisIN%nSunlit), & - modisMeanLiquidWaterPath(modisIN%nSunlit), & - modisMeanIceWaterPath(modisIN%nSunlit), & - modisJointHistogram(modisIN%nSunlit,numMODISTauBins,numMODISPresBins),& - modisJointHistogramIce(modisIN%nSunlit,numModisTauBins,numMODISReffIceBins),& - modisJointHistogramLiq(modisIN%nSunlit,numModisTauBins,numMODISReffLiqBins),& - modisJointHistogram_CtpCodLiq(modisIN%nSunlit,numMODISTauBins,numMODISPresBins),& - modisJointHistogram_CtpCodIce(modisIN%nSunlit,numMODISTauBins,numMODISPresBins),& - modisJointHistogram_LwpRefLiq(modisIN%nSunlit,numMODISLWPBins,numMODISReffLiqBins), & - modisJointHistogram_IwpRefIce(modisIN%nSunlit,numMODISIWPBins,numMODISReffIceBins) & - ) - ! Call simulator - call modis_column(modisIN%nSunlit, modisIN%Ncolumns,modisRetrievedPhase, & - modisRetrievedCloudTopPressure,modisRetrievedTau, & - modisRetrievedSize, modisCfTotal, modisCfLiquid, modisCfIce,& - modisCfHigh, modisCfMid, modisCfLow, modisMeanTauTotal, & - modisMeanTauLiquid, modisMeanTauIce, modisMeanLogTauTotal, & - modisMeanLogTauLiquid, modisMeanLogTauIce, & - modisMeanSizeLiquid, modisMeanSizeIce, & - modisMeanCloudTopPressure, modisMeanLiquidWaterPath, & - modisMeanIceWaterPath, modisJointHistogram, & - modisJointHistogramIce,modisJointHistogramLiq, & - modisJointHistogram_CtpCodLiq, & - modisJointHistogram_CtpCodIce, & - modisJointHistogram_LwpRefLiq, & - modisJointHistogram_IwpRefIce & - ) - ! Store data (if requested) - if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) then - cospOUT%modis_Cloud_Fraction_Total_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisCfTotal - endif - if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) then - cospOUT%modis_Cloud_Fraction_Water_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisCfLiquid - endif - if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) then - cospOUT%modis_Cloud_Fraction_Ice_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisCfIce - endif - if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) then - cospOUT%modis_Cloud_Fraction_High_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisCfHigh - endif - if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) then - cospOUT%modis_Cloud_Fraction_Mid_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisCfMid - endif - if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) then - cospOUT%modis_Cloud_Fraction_Low_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisCfLow - endif - if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) then - cospOUT%modis_Optical_Thickness_Total_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisMeanTauTotal - endif - if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) then - cospOUT%modis_Optical_Thickness_Water_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisMeanTauLiquid - endif - if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) then - cospOUT%modis_Optical_Thickness_Ice_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisMeanTauIce - endif - if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) then - cospOUT%modis_Optical_Thickness_Total_LogMean(ij+int(modisIN%sunlit(:))-1)= & - modisMeanLogTauTotal - endif - if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) then - cospOUT%modis_Optical_Thickness_Water_LogMean(ij+int(modisIN%sunlit(:))-1) = & - modisMeanLogTauLiquid - endif - if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) then - cospOUT%modis_Optical_Thickness_Ice_LogMean(ij+int(modisIN%sunlit(:))-1) = & - modisMeanLogTauIce - endif - if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) then - cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisMeanSizeLiquid - endif - if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) then - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisMeanSizeIce - endif - if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) then - cospOUT%modis_Cloud_Top_Pressure_Total_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisMeanCloudTopPressure - endif - if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) then - cospOUT%modis_Liquid_Water_Path_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisMeanLiquidWaterPath - endif - if (associated(cospOUT%modis_Ice_Water_Path_Mean)) then - cospOUT%modis_Ice_Water_Path_Mean(ij+int(modisIN%sunlit(:))-1) = & - modisMeanIceWaterPath - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) then - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(ij+ & - int(modisIN%sunlit(:))-1, 1:numModisTauBins, :) = modisJointHistogram(:, :, :) - ! Reorder pressure bins in joint histogram to go from surface to TOA - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(ij:ik,:,:) = & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(ij:ik,:,numMODISPresBins:1:-1) - endif - - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) then - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(ij+ & - int(modisIN%sunlit(:))-1, 1:numModisTauBins, :) = modisJointHistogram_CtpCodLiq(:, :, :) - ! Reorder pressure bins in joint histogram to go from surface to TOA - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(ij:ik,:,:) = & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(ij:ik,:,numMODISPresBins:1:-1) - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) then - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(ij+ & - int(modisIN%sunlit(:))-1, 1:numModisTauBins, :) = modisJointHistogram_CtpCodIce(:, :, :) - ! Reorder pressure bins in joint histogram to go from surface to TOA - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(ij:ik,:,:) = & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(ij:ik,:,numMODISPresBins:1:-1) - endif - if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) then - cospOUT%modis_LWP_vs_ReffLIQ(ij+int(modisIN%sunlit(:))-1, 1:numMODISLWPBins,:) = & - modisJointHistogram_LwpRefLiq(:,:,:) - endif - if (associated(cospOUT%modis_IWP_vs_ReffICE)) then - cospOUT%modis_IWP_vs_ReffICE(ij+int(modisIN%sunlit(:))-1, 1:numMODISIWPBins,:) = & - modisJointHistogram_IwpRefIce(:,:,:) - endif - - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffIce)) then - cospOUT%modis_Optical_Thickness_vs_ReffIce(ij:ik,1:numMODISTauBins,:) = 0.0 - cospOUT%modis_Optical_Thickness_vs_ReffIce(ij+int(modisIN%sunlit(:))-1, 1:numMODISTauBins,:) = & - modisJointHistogramIce(:,:,:) - endif - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLiq)) then - cospOUT%modis_Optical_Thickness_vs_ReffLiq(ij:ik,:,:) = 0.0 - cospOUT%modis_Optical_Thickness_vs_ReffLiq(ij+int(modisIN%sunlit(:))-1, 1:numMODISTauBins,:) = & - modisJointHistogramLiq(:,:,:) - endif - - if(modisIN%nSunlit < modisIN%Npoints) then - ! Where it's night and we haven't done the retrievals the values are undefined - if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & - cospOUT%modis_Cloud_Fraction_Total_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & - cospOUT%modis_Cloud_Fraction_Water_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & - cospOUT%modis_Cloud_Fraction_Ice_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & - cospOUT%modis_Cloud_Fraction_High_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & - cospOUT%modis_Cloud_Fraction_Mid_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & - cospOUT%modis_Cloud_Fraction_Low_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & - cospOUT%modis_Optical_Thickness_Total_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & - cospOUT%modis_Optical_Thickness_Water_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & - cospOUT%modis_Optical_Thickness_Ice_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & - cospOUT%modis_Optical_Thickness_Total_LogMean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & - cospOUT%modis_Optical_Thickness_Water_LogMean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & - cospOUT%modis_Optical_Thickness_Ice_LogMean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & - cospOUT%modis_Cloud_Top_Pressure_Total_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & - cospOUT%modis_Liquid_Water_Path_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & - cospOUT%modis_Ice_Water_Path_Mean(ij+int(modisIN%notSunlit(:))-1) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(ij+int(modisIN%notSunlit(:))-1, :, :) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(ij+int(modisIN%notSunlit(:))-1, :, :) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(ij+int(modisIN%notSunlit(:))-1, :, :) = R_UNDEF - end if - else - ! It's nightime everywhere - everything is undefined - if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & - cospOUT%modis_Cloud_Fraction_Total_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & - cospOUT%modis_Cloud_Fraction_Water_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & - cospOUT%modis_Cloud_Fraction_Ice_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & - cospOUT%modis_Cloud_Fraction_High_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & - cospOUT%modis_Cloud_Fraction_Mid_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & - cospOUT%modis_Cloud_Fraction_Low_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & - cospOUT%modis_Optical_Thickness_Total_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & - cospOUT%modis_Optical_Thickness_Water_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & - cospOUT%modis_Optical_Thickness_Ice_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & - cospOUT%modis_Optical_Thickness_Total_LogMean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & - cospOUT%modis_Optical_Thickness_Water_LogMean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & - cospOUT%modis_Optical_Thickness_Ice_LogMean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & - cospOUT%modis_Cloud_Top_Pressure_Total_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & - cospOUT%modis_Liquid_Water_Path_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & - cospOUT%modis_Ice_Water_Path_Mean(ij:ik) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(ij:ik, :, :) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(ij+int(modisIN%notSunlit(:))-1, :, :) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(ij+int(modisIN%notSunlit(:))-1, :, :) = R_UNDEF - endif - ! Free up memory (if necessary) - if (allocated(modisRetrievedTau)) deallocate(modisRetrievedTau) - if (allocated(modisRetrievedSize)) deallocate(modisRetrievedSize) - if (allocated(modisRetrievedPhase)) deallocate(modisRetrievedPhase) - if (allocated(modisRetrievedCloudTopPressure)) deallocate(modisRetrievedCloudTopPressure) - if (allocated(modisCftotal)) deallocate(modisCftotal) - if (allocated(modisCfLiquid)) deallocate(modisCfLiquid) - if (allocated(modisCfIce)) deallocate(modisCfIce) - if (allocated(modisCfHigh)) deallocate(modisCfHigh) - if (allocated(modisCfMid)) deallocate(modisCfMid) - if (allocated(modisCfLow)) deallocate(modisCfLow) - if (allocated(modisMeanTauTotal)) deallocate(modisMeanTauTotal) - if (allocated(modisMeanTauLiquid)) deallocate(modisMeanTauLiquid) - if (allocated(modisMeanTauIce)) deallocate(modisMeanTauIce) - if (allocated(modisMeanLogTauTotal)) deallocate(modisMeanLogTauTotal) - if (allocated(modisMeanLogTauLiquid)) deallocate(modisMeanLogTauLiquid) - if (allocated(modisMeanLogTauIce)) deallocate(modisMeanLogTauIce) - if (allocated(modisMeanSizeLiquid)) deallocate(modisMeanSizeLiquid) - if (allocated(modisMeanSizeIce)) deallocate(modisMeanSizeIce) - if (allocated(modisMeanCloudTopPressure)) deallocate(modisMeanCloudTopPressure) - if (allocated(modisMeanLiquidWaterPath)) deallocate(modisMeanLiquidWaterPath) - if (allocated(modisMeanIceWaterPath)) deallocate(modisMeanIceWaterPath) - if (allocated(modisJointHistogram)) deallocate(modisJointHistogram) - if (allocated(modisJointHistogram_CtpCodLiq)) deallocate(modisJointHistogram_CtpCodLiq) - if (allocated(modisJointHistogram_CtpCodIce)) deallocate(modisJointHistogram_CtpCodIce) - if (allocated(modisJointHistogram_LwpRefLiq)) deallocate(modisJointHistogram_LwpRefLiq) - if (allocated(modisJointHistogram_IwpRefIce)) deallocate(modisJointHistogram_IwpRefIce) - if (allocated(modisJointHistogramIce)) deallocate(modisJointHistogramIce) - if (allocated(modisJointHistogramLiq)) deallocate(modisJointHistogramLiq) - if (allocated(isccp_boxttop)) deallocate(isccp_boxttop) - if (allocated(isccp_boxptop)) deallocate(isccp_boxptop) - if (allocated(isccp_boxtau)) deallocate(isccp_boxtau) - if (allocated(isccp_meantbclr)) deallocate(isccp_meantbclr) - if (allocated(isccpLEVMATCH)) deallocate(isccpLEVMATCH) - if (allocated(MODIS_SWATH_MASK)) deallocate(MODIS_SWATH_MASK) - endif - - ! RTTOV multi-instrument - if (Lrttov_column) then - do i=1,cospIN%Ninst_rttov - ! Allocate memory for the outputs - I won't need all of these in every situation. - ! Only allocate clear-sky memory when PC-RTTOV is run. - if (cospIN % cfg_rttov(i) % Lrttov_pc) then - allocate(rttov_bt_clear(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! all-sky brightness temp - allocate(rttov_rad_clear(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! all-sky radiance - rttov_bt_clear(:,:) = R_UNDEF - rttov_rad_clear(:,:) = R_UNDEF - ! Run simulator - call cosp_rttov_simulate(rttovIN,cospIN%cfg_rttov(i), & ! Inputs - cosp_simulator(nError+1), & ! Error message holder - bt_clear=rttov_bt_clear, & ! Clear-sky BT - rad_clear=rttov_rad_clear) ! Clear-sky radiance - else - allocate(rttov_bt_total(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! all-sky brightness temp - allocate(rttov_bt_clear(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! clear-sky brightness temp - allocate(rttov_rad_total(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! all-sky brightness temp - allocate(rttov_rad_clear(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! clear-sky brightness temp - allocate(rttov_rad_cloudy(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! cloudy-sky brightness temp - allocate(rttov_refl_total(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! all-sky Bi-directional reflectance factor - allocate(rttov_refl_clear(rttovIN%Npoints,cospIN % cfg_rttov(i) % nchan_out)) ! clear-sky Bi-directional reflectance factor - ! Init to R_UNDEF - rttov_bt_total(:,:) = R_UNDEF - rttov_bt_clear(:,:) = R_UNDEF - rttov_rad_total(:,:) = R_UNDEF - rttov_rad_clear(:,:) = R_UNDEF - rttov_rad_cloudy(:,:) = R_UNDEF - rttov_refl_total(:,:) = R_UNDEF - rttov_refl_clear(:,:) = R_UNDEF - ! Run simulator - call cosp_rttov_simulate(rttovIN,cospIN%cfg_rttov(i), & ! Inputs - cosp_simulator(nError+1), & ! Error message holder - bt_total=rttov_bt_total, & ! Brightness Temp Outputs - bt_clear=rttov_bt_clear, & - rad_total=rttov_rad_total, & ! Radiance Outputs - rad_clear=rttov_rad_clear, & - rad_cloudy=rttov_rad_cloudy, & - refl_total=rttov_refl_total, & ! Reflectance Outputs - refl_clear=rttov_refl_clear, & - debug=verbose) - endif - - ! Write to cospOUT - if (associated(cospOUT % rttov_outputs(i) % channel_indices)) & - cospOUT % rttov_outputs(i) % channel_indices(:) = cospIN % cfg_rttov(i) % iChannel - if (cospIN % cfg_rttov(i) % Lrttov_pc) then - if (associated(cospOUT % rttov_outputs(i) % bt_total_pc)) & - cospOUT % rttov_outputs(i) % bt_total_pc(ij:ik,:) = rttov_bt_clear - if (associated(cospOUT % rttov_outputs(i) % rad_total_pc)) & - cospOUT % rttov_outputs(i) % rad_total_pc(ij:ik,:) = rttov_rad_clear - else - if (associated(cospOUT % rttov_outputs(i) % bt_total)) & - cospOUT % rttov_outputs(i) % bt_total(ij:ik,:) = rttov_bt_total - if (associated(cospOUT % rttov_outputs(i) % bt_clear)) & - cospOUT % rttov_outputs(i) % bt_clear(ij:ik,:) = rttov_bt_clear - if (associated(cospOUT % rttov_outputs(i) % rad_total)) & - cospOUT % rttov_outputs(i) % rad_total(ij:ik,:) = rttov_rad_total - if (associated(cospOUT % rttov_outputs(i) % rad_clear)) & - cospOUT % rttov_outputs(i) % rad_clear(ij:ik,:) = rttov_rad_clear - if (associated(cospOUT % rttov_outputs(i) % rad_cloudy)) & - cospOUT % rttov_outputs(i) % rad_cloudy(ij:ik,:) = rttov_rad_cloudy - if (associated(cospOUT % rttov_outputs(i) % refl_total)) & - cospOUT % rttov_outputs(i) % refl_total(ij:ik,:) = rttov_refl_total - if (associated(cospOUT % rttov_outputs(i) % refl_clear)) & - cospOUT % rttov_outputs(i) % refl_clear(ij:ik,:) = rttov_refl_clear - endif - - ! Free up memory from output (if necessary) - if (allocated(rttov_bt_total)) deallocate(rttov_bt_total) - if (allocated(rttov_bt_clear)) deallocate(rttov_bt_clear) - if (allocated(rttov_rad_total)) deallocate(rttov_rad_total) - if (allocated(rttov_rad_clear)) deallocate(rttov_rad_clear) - if (allocated(rttov_rad_cloudy)) deallocate(rttov_rad_cloudy) - if (allocated(rttov_refl_total)) deallocate(rttov_refl_total) - if (allocated(rttov_refl_clear)) deallocate(rttov_refl_clear) - - end do - - endif - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! 6) Compute multi-instrument products - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - ! CLOUDSAT/CALIPSO products - if (Lradar_lidar_tcc .or. Llidar_only_freq_cloud .or. Lcloudsat_tcc .or. Lcloudsat_tcc2) then - if (calipsoIN%Npoints .gt. 0) then - if (use_vgrid) then - allocate(lidar_only_freq_cloud(cloudsatIN%Npoints,Nlvgrid), & - radar_lidar_tcc(cloudsatIN%Npoints), cloudsat_tcc(cloudsatIN%Npoints), & - cloudsat_tcc2(cloudsatIN%Npoints)) - allocate(betamol_in(cloudsatIN%Npoints,1,cloudsatIN%Nlevels), & - betamolI(cloudsatIN%Npoints,1,Nlvgrid), & - pnormI(cloudsatIN%Npoints,cloudsatIN%Ncolumns,Nlvgrid), & - Ze_totI(cloudsatIN%Npoints,cloudsatIN%Ncolumns,Nlvgrid)) - - ! Regrid in the vertical (*NOTE* This routine requires SFC-2-TOA ordering, so flip - ! inputs and outputs to maintain TOA-2-SFC ordering convention in COSP2.) - ! Use CLOUDSAT masking array here (it is the same as calipso) - if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - betamol_in(:,1,:) = calipso_beta_mol(:,cloudsatIN%Nlevels:1:-1) - call cosp_change_vertical_grid(cloudsatIN%Npoints,1,cloudsatIN%Nlevels, & - cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & - cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1),betamol_in, & - Nlvgrid,vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1), & - betamolI(:,1,Nlvgrid:1:-1)) - call cosp_change_vertical_grid(cloudsatIN%Npoints,cloudsatIN%Ncolumns, & - cloudsatIN%Nlevels,cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & - cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & - calipso_beta_tot(:,:,cloudsatIN%Nlevels:1:-1),Nlvgrid, & - vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1),pnormI(:,:,Nlvgrid:1:-1)) - call cosp_change_vertical_grid(cloudsatIN%Npoints,cloudsatIN%Ncolumns, & - cloudsatIN%Nlevels,cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & - cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & - cloudsatDBZe(:,:,cloudsatIN%Nlevels:1:-1),Nlvgrid,vgrid_zl(Nlvgrid:1:-1), & - vgrid_zu(Nlvgrid:1:-1),Ze_totI(:,:,Nlvgrid:1:-1),log_units=.true.) - else - betamol_in(:,1,:) = calipso_beta_mol(:,cloudsatIN%Nlevels:1:-1) - call cosp_change_vertical_grid(cloudsatIN%Npoints,1,cloudsatIN%Nlevels, & - cospgridIN%hgt_matrix(:,cloudsatIN%Nlevels:1:-1), & - cospgridIN%hgt_matrix_half(:,cloudsatIN%Nlevels:1:-1),betamol_in, & - Nlvgrid,vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1), & - betamolI(:,1,Nlvgrid:1:-1)) - - call cosp_change_vertical_grid(cloudsatIN%Npoints,cloudsatIN%Ncolumns, & - cloudsatIN%Nlevels,cospgridIN%hgt_matrix(:,cloudsatIN%Nlevels:1:-1), & - cospgridIN%hgt_matrix_half(:,cloudsatIN%Nlevels:1:-1), & - calipso_beta_tot(:,:,cloudsatIN%Nlevels:1:-1),Nlvgrid, & - vgrid_zl(Nlvgrid:1:-1),vgrid_zu(Nlvgrid:1:-1),pnormI(:,:,Nlvgrid:1:-1)) - - call cosp_change_vertical_grid(cloudsatIN%Npoints,cloudsatIN%Ncolumns, & - cloudsatIN%Nlevels,cospgridIN%hgt_matrix(:,cloudsatIN%Nlevels:1:-1), & - cospgridIN%hgt_matrix_half(:,cloudsatIN%Nlevels:1:-1), & - cloudsatDBZe(:,:,cloudsatIN%Nlevels:1:-1),Nlvgrid,vgrid_zl(Nlvgrid:1:-1), & - vgrid_zu(Nlvgrid:1:-1),Ze_totI(:,:,Nlvgrid:1:-1),log_units=.true.) - end if - call cosp_lidar_only_cloud(cloudsatIN%Npoints, cloudsatIN%Ncolumns, Nlvgrid, & - pnormI, betamolI, Ze_totI, lidar_only_freq_cloud, radar_lidar_tcc, & - cloudsat_tcc, cloudsat_tcc2) - deallocate(betamol_in,betamolI,pnormI,ze_totI) - else - allocate(lidar_only_freq_cloud(cloudsatIN%Npoints,cloudsatIN%Nlevels), & - radar_lidar_tcc(cloudsatIN%Npoints), cloudsat_tcc(cloudsatIN%Npoints), & - cloudsat_tcc2(cloudsatIN%Npoints)) - call cosp_lidar_only_cloud(cloudsatIN%Npoints,cloudsatIN%Ncolumns, & - cospIN%Nlevels,calipso_beta_tot(:,:,cloudsatIN%Nlevels:1:-1), & - calipso_beta_mol(:,cloudsatIN%Nlevels:1:-1), & - cloudsatDBZe(:,:,cloudsatIN%Nlevels:1:-1),lidar_only_freq_cloud, & - radar_lidar_tcc, cloudsat_tcc, cloudsat_tcc2) - endif - endif - - ! Store, when necessary - if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - if (associated(cospOUT%lidar_only_freq_cloud)) then - cospOUT%lidar_only_freq_cloud(ij:ik,:) = R_UNDEF - cospOUT%lidar_only_freq_cloud(ij+int(CSCAL_MASK_INDICES(:))-1,:) = lidar_only_freq_cloud(:,:) - endif - if (associated(cospOUT%radar_lidar_tcc)) then - cospOUT%radar_lidar_tcc(ij:ik) = R_UNDEF - cospOUT%radar_lidar_tcc(ij+int(CSCAL_MASK_INDICES(:))-1) = radar_lidar_tcc(:) - endif - if (associated(cospOUT%cloudsat_tcc)) then - cospOUT%cloudsat_tcc(ij:ik) = R_UNDEF - cospOUT%cloudsat_tcc(ij+int(CSCAL_MASK_INDICES(:))-1) = cloudsat_tcc(:) - endif - if (associated(cospOUT%cloudsat_tcc2)) then - cospOUT%cloudsat_tcc2(ij:ik) = R_UNDEF - cospOUT%cloudsat_tcc2(ij+int(CSCAL_MASK_INDICES(:))-1) = cloudsat_tcc2(:) - endif - else - if (associated(cospOUT%lidar_only_freq_cloud)) then - cospOUT%lidar_only_freq_cloud(ij:ik,:) = lidar_only_freq_cloud - endif - if (associated(cospOUT%radar_lidar_tcc)) then - cospOUT%radar_lidar_tcc(ij:ik) = radar_lidar_tcc - endif - if (associated(cospOUT%cloudsat_tcc)) then - cospOUT%cloudsat_tcc(ij:ik) = cloudsat_tcc - endif - if (associated(cospOUT%cloudsat_tcc2)) then - cospOUT%cloudsat_tcc2(ij:ik) = cloudsat_tcc2 - endif - endif - endif - - ! CloudSat/MODIS joint products (CFODDs and Occurrence Frequency of Warm Clouds) - if (Lcloudsat_modis_wr) then - if (cloudsatIN%Npoints .gt. 0) then - allocate( cfodd_ntotal(cloudsatIN%Npoints, CFODD_NDBZE, CFODD_NICOD, CFODD_NCLASS) ) - allocate( wr_occfreq_ntotal(cloudsatIN%Npoints, WR_NREGIME) ) - - if ( use_vgrid ) then - !! interporation for fixed vertical grid: - allocate( zlev(cloudsatIN%Npoints,Nlvgrid), & - t_in(cloudsatIN%Npoints,1,cloudsatIN%Nlevels), & - tempI(cloudsatIN%Npoints,1,Nlvgrid), & - Ze_totI(cloudsatIN%Npoints,cloudsatIN%Ncolumns,Nlvgrid), & - frac_outI(cloudsatIN%Npoints,cloudsatIN%Ncolumns,Nlvgrid) ) - do k = 1, Nlvgrid - zlev(:,k) = vgrid_zu(k) - enddo - ! Use CLOUDSAT masking array here (it is the same as calipso) - if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - t_in(:,1,:) = cospgridIN%at(int(CSCAL_MASK_INDICES(:)),:) - call cosp_change_vertical_grid ( & - cloudsatIN%Npoints, 1, cloudsatIN%Nlevels, & - cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & - cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & - t_in(:,:,cloudsatIN%Nlevels:1:-1), Nlvgrid, & - vgrid_zl(Nlvgrid:1:-1), vgrid_zu(Nlvgrid:1:-1), & - tempI(:,:,Nlvgrid:1:-1) ) - call cosp_change_vertical_grid ( & - cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels, & - cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & - cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & - cloudsatDBZe(:,:,cloudsatIN%Nlevels:1:-1), Nlvgrid, & - vgrid_zl(Nlvgrid:1:-1), vgrid_zu(Nlvgrid:1:-1), & - Ze_totI(:,:,Nlvgrid:1:-1), log_units=.true. ) - call cosp_change_vertical_grid ( & - cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels, & - cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & - cospgridIN%hgt_matrix_half(int(CSCAL_MASK_INDICES(:)),cloudsatIN%Nlevels:1:-1), & - cospIN%frac_out(int(CSCAL_MASK_INDICES(:)),:,cloudsatIN%Nlevels:1:-1), Nlvgrid, & - vgrid_zl(Nlvgrid:1:-1), vgrid_zu(Nlvgrid:1:-1), & - frac_outI(:,:,Nlvgrid:1:-1) ) - call cosp_diag_warmrain( & - cloudsatIN%Npoints, cloudsatIN%Ncolumns, Nlvgrid, & !! in - tempI, zlev, & !! in - cospOUT%modis_Liquid_Water_Path_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Optical_Thickness_Water_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Cloud_Fraction_Water_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Ice_Water_Path_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Optical_Thickness_Ice_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Cloud_Fraction_Ice_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - frac_outI, & !! in - Ze_totI, & !! in - cfodd_ntotal, wr_occfreq_ntotal ) !! inout - else - t_in(:,1,:) = cospgridIN%at(:,:) - call cosp_change_vertical_grid ( & - cloudsatIN%Npoints, 1, cloudsatIN%Nlevels, & - cospgridIN%hgt_matrix(:,cloudsatIN%Nlevels:1:-1), & - cospgridIN%hgt_matrix_half(:,cloudsatIN%Nlevels:1:-1), & - t_in(:,:,cloudsatIN%Nlevels:1:-1), Nlvgrid, & - vgrid_zl(Nlvgrid:1:-1), vgrid_zu(Nlvgrid:1:-1), & - tempI(:,:,Nlvgrid:1:-1) ) - call cosp_change_vertical_grid ( & - cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels, & - cospgridIN%hgt_matrix(:,cloudsatIN%Nlevels:1:-1), & - cospgridIN%hgt_matrix_half(:,cloudsatIN%Nlevels:1:-1), & - cloudsatDBZe(:,:,cloudsatIN%Nlevels:1:-1), Nlvgrid, & - vgrid_zl(Nlvgrid:1:-1), vgrid_zu(Nlvgrid:1:-1), & - Ze_totI(:,:,Nlvgrid:1:-1), log_units=.true. ) - call cosp_change_vertical_grid ( & - cloudsatIN%Npoints, cloudsatIN%Ncolumns, cloudsatIN%Nlevels, & - cospgridIN%hgt_matrix(:,cloudsatIN%Nlevels:1:-1), & - cospgridIN%hgt_matrix_half(:,cloudsatIN%Nlevels:1:-1), & - cospIN%frac_out(:,:,cloudsatIN%Nlevels:1:-1), Nlvgrid, & - vgrid_zl(Nlvgrid:1:-1), vgrid_zu(Nlvgrid:1:-1), & - frac_outI(:,:,Nlvgrid:1:-1) ) - call cosp_diag_warmrain( & - cloudsatIN%Npoints, cloudsatIN%Ncolumns, Nlvgrid, & !! in - tempI, zlev, & !! in - cospOUT%modis_Liquid_Water_Path_Mean(ij:ik), & !! in - cospOUT%modis_Optical_Thickness_Water_Mean(ij:ik), & !! in - cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij:ik), & !! in - cospOUT%modis_Cloud_Fraction_Water_Mean(ij:ik), & !! in - cospOUT%modis_Ice_Water_Path_Mean(ij:ik), & !! in - cospOUT%modis_Optical_Thickness_Ice_Mean(ij:ik), & !! in - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij:ik), & !! in - cospOUT%modis_Cloud_Fraction_Ice_Mean(ij:ik), & !! in - frac_outI, & !! in - Ze_totI, & !! in - cfodd_ntotal, wr_occfreq_ntotal ) !! inout - endif - deallocate( zlev, t_in, tempI, frac_outI, Ze_totI ) - else ! do not use vgrid interporation ---------------------------------------! - !! original model grid - if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - call cosp_diag_warmrain( & - cloudsatIN%Npoints, cloudsatIN%Ncolumns, cospIN%Nlevels, & !! in - cospgridIN%at(int(CSCAL_MASK_INDICES(:)),:), & !! in - cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES(:)),:), & !! in - cospOUT%modis_Liquid_Water_Path_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Optical_Thickness_Water_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Cloud_Fraction_Water_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Ice_Water_Path_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Optical_Thickness_Ice_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospOUT%modis_Cloud_Fraction_Ice_Mean(ij+int(CSCAL_MASK_INDICES(:))-1), & !! in - cospIN%frac_out(int(CSCAL_MASK_INDICES(:)),:,:), & !! in - cloudsatDBZe, & !! in - cfodd_ntotal, wr_occfreq_ntotal ) !! inout - else - call cosp_diag_warmrain( & - cloudsatIN%Npoints, cloudsatIN%Ncolumns, cospIN%Nlevels, & !! in - cospgridIN%at, cospgridIN%hgt_matrix, & !! in - cospOUT%modis_Liquid_Water_Path_Mean(ij:ik), & !! in - cospOUT%modis_Optical_Thickness_Water_Mean(ij:ik), & !! in - cospOUT%modis_Cloud_Particle_Size_Water_Mean(ij:ik), & !! in - cospOUT%modis_Cloud_Fraction_Water_Mean(ij:ik), & !! in - cospOUT%modis_Ice_Water_Path_Mean(ij:ik), & !! in - cospOUT%modis_Optical_Thickness_Ice_Mean(ij:ik), & !! in - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(ij:ik), & !! in - cospOUT%modis_Cloud_Fraction_Ice_Mean(ij:ik), & !! in - cospIN%frac_out, & !! in - cloudsatDBZe, & !! in - cfodd_ntotal, wr_occfreq_ntotal ) !! inout - endif - endif !! use_vgrid or not - - ! Store, when necessary - if (associated(cospOUT%lidar_only_freq_cloud)) then - if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays - cospOUT%lidar_only_freq_cloud(ij+int(CSCAL_MASK_INDICES(:))-1,:) = lidar_only_freq_cloud(:,:) - else - cospOUT%lidar_only_freq_cloud(ij:ik,:) = lidar_only_freq_cloud - endif - endif - - if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then ! Trigger use of swathed arrays for CSCAL - if (cospIN % cospswathsIN(6) % N_inst_swaths .gt. 0) then ! If MODIS is also swathed then use the joint mask MODIS_CSCAL_MASK_INDICES for setting R_UNDEF - if ( associated(cospOUT%cfodd_ntotal) ) then - cospOUT%cfodd_ntotal(ij+int(CSCAL_MASK_INDICES(:))-1,:,:,:) = cfodd_ntotal - cospOUT%cfodd_ntotal(ij+int(MODIS_CSCAL_MASK_INDICES(:))-1,:,:,:) = R_UNDEF - endif - if ( associated(cospOUT%wr_occfreq_ntotal) ) then - cospOUT%wr_occfreq_ntotal(ij+int(CSCAL_MASK_INDICES(:))-1,:) = wr_occfreq_ntotal - cospOUT%wr_occfreq_ntotal(ij+int(MODIS_CSCAL_MASK_INDICES(:))-1,:) = R_UNDEF - endif - else - if ( associated(cospOUT%cfodd_ntotal) ) then - cospOUT%cfodd_ntotal(ij:ik,:,:,:) = R_UNDEF - cospOUT%cfodd_ntotal(ij+int(CSCAL_MASK_INDICES(:))-1,:,:,:) = cfodd_ntotal - endif - if ( associated(cospOUT%wr_occfreq_ntotal) ) then - cospOUT%wr_occfreq_ntotal(ij:ik,:) = R_UNDEF - cospOUT%wr_occfreq_ntotal(ij+int(CSCAL_MASK_INDICES(:))-1,:) = wr_occfreq_ntotal - endif - endif - else - if ( associated(cospOUT%cfodd_ntotal) ) then - cospOUT%cfodd_ntotal(ij:ik,:,:,:) = cfodd_ntotal - endif - if ( associated(cospOUT%wr_occfreq_ntotal) ) then - cospOUT%wr_occfreq_ntotal(ij:ik,:) = wr_occfreq_ntotal - endif - endif - else - if ( associated(cospOUT%cfodd_ntotal) ) cospOUT%cfodd_ntotal(ij:ik,:,:,:) = R_UNDEF - if ( associated(cospOUT%wr_occfreq_ntotal) ) cospOUT%wr_occfreq_ntotal(ij:ik,:) = R_UNDEF - endif - endif - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! 7) Cleanup - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (Lisccp_subcolumn .or. Lmodis_subcolumn) then - nullify(isccpIN%Ncolumns,isccpIN%Nlevels,isccpIN%emsfc_lw, & - isccpIN%skt,isccpIN%qv,isccpIN%at,isccpIN%frac_out,isccpIN%dtau, & - isccpIN%dem,isccpIN%phalf,isccpIN%sunlit,isccpIN%pfull) - call COSP_ASSIGN_isccpIN_CLEAN() - endif - - if (Lmisr_subcolumn) then - nullify(misrIN%Ncolumns,misrIN%Nlevels,misrIN%dtau,misrIN%sunlit, & - misrIN%zfull,misrIN%at) - call COSP_ASSIGN_misrIN_CLEAN() - endif - - if (Lcalipso_subcolumn) then - nullify(calipsoIN%Ncolumns,calipsoIN%Nlevels,calipsoIN%beta_mol,& - calipsoIN%betatot,calipsoIN%betatot_liq,calipsoIN%betatot_ice, & - calipsoIN%tau_mol,calipsoIN%tautot,calipsoIN%tautot_liq,calipsoIN%tautot_ice) - if (allocated(CSCAL_MASK_INDICES)) deallocate(CSCAL_MASK_INDICES) - if (allocated(CSCAL_SWATH_MASK)) deallocate(CSCAL_SWATH_MASK) - call COSP_ASSIGN_calipsoIN_CLEAN() - endif - - if (LgrLidar532_subcolumn) then - nullify(grLidar532IN%Npoints,grLidar532IN%Ncolumns,grLidar532IN%Nlevels,grLidar532IN%beta_mol, & - grLidar532IN%betatot,grLidar532IN%tau_mol,grLidar532IN%tautot) - endif - - if (Latlid_subcolumn) then - nullify(atlidIN%Ncolumns,atlidIN%Nlevels,atlidIN%beta_mol_atlid, & - atlidIN%betatot_atlid,atlidIN%tau_mol_atlid,atlidIN%tautot_atlid) - call COSP_ASSIGN_atlidIN_CLEAN() - endif - - if (Lparasol_subcolumn) then - nullify(parasolIN%Nlevels,parasolIN%Ncolumns,parasolIN%Nrefl, & - parasolIN%tautot_S_liq,parasolIN%tautot_S_ice) - call COSP_ASSIGN_parasolIN_CLEAN() - endif - - if (Lcloudsat_subcolumn) then - nullify(cloudsatIN%Nlevels,cloudsatIN%Ncolumns,cloudsatIN%rcfg,& - cloudsatIN%kr_vol,cloudsatIN%g_vol,cloudsatIN%z_vol,cloudsatIN%hgt_matrix) - call COSP_ASSIGN_cloudsatIN_CLEAN() - if (allocated(CSCAL_MASK_INDICES)) deallocate(CSCAL_MASK_INDICES) - if (allocated(CSCAL_SWATH_MASK)) deallocate(CSCAL_SWATH_MASK) - endif - - if (Lmodis_subcolumn) then - nullify(modisIN%Npoints,modisIN%Ncolumns,modisIN%Nlevels,modisIN%tau,modisIN%g, & - modisIN%liqFrac,modisIN%w0) - if (allocated(modisIN%sunlit)) deallocate(modisIN%sunlit) - if (allocated(modisIN%notSunlit)) deallocate(modisIN%notSunlit) - if (allocated(modisIN%pres)) deallocate(modisIN%pres) - if (allocated(MODIS_CSCAL_MASK_INDICES)) deallocate(MODIS_CSCAL_MASK_INDICES) - endif - - if (Lrttov_column) then - nullify(rttovIN%nPoints,rttovIN%nLevels,rttovIN%nSubCols,rttovIN%co2,rttovIN%ch4, & - rttovIN%n2o,rttovIN%co,rttovIN%h_surf,rttovIN%u_surf,rttovIN%v_surf, & - rttovIN%t_skin,rttovIN%p_surf,rttovIN%sfcmask,rttovIN%latitude, & - rttovIN%longitude,rttovIN%p,rttovIN%ph,rttovIN%q2m,rttovIN%t2m,rttovIN%t, & - rttovIN%q,rttovIN%o3,rttovIN%rttov_date,rttovIN%rttov_time,rttovIN%tca, & - rttovIN%cldLiq,rttovIN%cldIce,rttovIN%DeffLiq,rttovIN%DeffIce, & - rttovIN%fl_rain,rttovIN%fl_snow) - endif - - if (allocated(calipso_beta_tot)) deallocate(calipso_beta_tot) - if (allocated(grLidar532_beta_tot)) deallocate(grLidar532_beta_tot) - if (allocated(atlid_beta_tot)) deallocate(atlid_beta_tot) - if (allocated(calipso_beta_mol)) deallocate(calipso_beta_mol) - if (allocated(grLidar532_beta_mol)) deallocate(grLidar532_beta_mol) - if (allocated(atlid_beta_mol)) deallocate(atlid_beta_mol) - if (allocated(calipso_betaperp_tot)) deallocate(calipso_betaperp_tot) - if (allocated(cloudsatDBZe)) deallocate(cloudsatDBZe) - if (allocated(lidar_only_freq_cloud)) deallocate(lidar_only_freq_cloud) - if (allocated(radar_lidar_tcc)) deallocate(radar_lidar_tcc) - if (allocated(cloudsat_tcc)) deallocate(cloudsat_tcc) - if (allocated(cloudsat_tcc2)) deallocate(cloudsat_tcc2) - if (allocated(cfodd_ntotal)) deallocate(cfodd_ntotal) - if (allocated(wr_occfreq_ntotal)) deallocate(wr_occfreq_ntotal) - - end function COSP_SIMULATOR - ! ###################################################################################### - ! SUBROUTINE cosp_init - ! ###################################################################################### - SUBROUTINE COSP_INIT(Lisccp, Lmodis, Lmisr, Lcloudsat, Lcalipso, LgrLidar532, Latlid, Lparasol, Lrttov, & - cloudsat_radar_freq, cloudsat_k2, cloudsat_use_gas_abs, cloudsat_do_ray, & - isccp_top_height, isccp_top_height_direction, surface_radar, rcfg, lusevgrid, & - luseCSATvgrid, Nvgrid, Nlevels, cloudsat_micro_scheme, & - rttov_Ninstruments, rttov_instrument_namelists,rttov_configs,unitn,debug) - - ! INPUTS - logical,intent(in) :: Lisccp,Lmodis,Lmisr,Lcloudsat,Lcalipso,LgrLidar532,Latlid,Lparasol - logical,intent(inout) :: Lrttov - integer,intent(in) :: & - cloudsat_use_gas_abs, & ! - cloudsat_do_ray, & ! - isccp_top_height, & ! - isccp_top_height_direction, & ! - Nlevels, & ! - Nvgrid, & ! Number of levels for new L3 grid - surface_radar, & ! - rttov_Ninstruments - real(wp),intent(in) :: & - cloudsat_radar_freq, & ! - cloudsat_k2 ! - logical,intent(in) :: & - lusevgrid, & ! Switch to use different vertical grid - luseCSATvgrid ! Switch to use CLOUDSAT grid spacing for new - ! vertical grid - character(len=64),intent(in) :: & - cloudsat_micro_scheme ! Microphysical scheme used by CLOUDSAT - - type(character(len=256)), dimension(rttov_Ninstruments) :: & - rttov_instrument_namelists ! Array of paths to RTTOV instrument namelists - - ! OUTPUTS - type(radar_cfg) :: rcfg - type(rttov_cfg), dimension(:), allocatable,intent(inout) :: rttov_configs - - ! Optional args - integer,intent(in),Optional :: unitn ! Used for io limits - logical,intent(in),Optional :: debug - logical :: verbose = .false. - - ! Local variables - integer :: i - real(wp) :: zstep - - ! Init debug print statements: - if (present(debug)) verbose = debug - - ! Initialize MODIS optical-depth bin boundaries for joint-histogram. (defined in cosp_config.F90) - if (.not. allocated(modis_histTau)) then - allocate(modis_histTau(ntau+1),modis_histTauEdges(2,ntau),modis_histTauCenters(ntau)) - numMODISTauBins = ntau - modis_histTau = tau_binBounds - modis_histTauEdges = tau_binEdges - modis_histTauCenters = tau_binCenters - endif - - ! Set up vertical grid used by CALIPSO and CLOUDSAT L3 - use_vgrid = lusevgrid - - if (use_vgrid) then - Nlvgrid = Nvgrid - allocate(vgrid_zl(Nlvgrid),vgrid_zu(Nlvgrid),vgrid_z(Nlvgrid),dz(Nlvgrid)) - ! CloudSat grid requested - if (luseCSATvgrid) zstep = 480._wp - ! Other grid requested. Constant vertical spacing with top at 20 km - if (.not. luseCSATvgrid) zstep = 20000._wp/Nvgrid - do i=1,Nvgrid - vgrid_zl(Nlvgrid-i+1) = (i-1)*zstep - vgrid_zu(Nlvgrid-i+1) = i*zstep - enddo - vgrid_z = (vgrid_zl+vgrid_zu)/2._wp - dz = zstep - else - Nlvgrid = Nlevels - allocate(vgrid_zl(Nlvgrid),vgrid_zu(Nlvgrid),vgrid_z(Nlvgrid),dz(Nlvgrid)) - vgrid_zl = 0._wp - vgrid_zu = 0._wp - vgrid_z = 0._wp - dz = 0._wp - endif - - ! Initialize simulators - if (Lisccp) call cosp_isccp_init(isccp_top_height,isccp_top_height_direction) - if (Lmodis) call cosp_modis_init() - if (Lmisr) call cosp_misr_init() - - if (Lrttov) then - if (present(unitn)) then - call cosp_rttov_init(Lrttov,Nlevels,rttov_Ninstruments, & - rttov_instrument_namelists, & - rttov_configs,unitn=unitn, & - debug=verbose) - else - call cosp_rttov_init(Lrttov,Nlevels,rttov_Ninstruments, & - rttov_instrument_namelists, & - rttov_configs,debug=verbose) - end if - endif - - if (Lcloudsat) call cosp_cloudsat_init(cloudsat_radar_freq,cloudsat_k2, & - cloudsat_use_gas_abs,cloudsat_do_ray,R_UNDEF,N_HYDRO, surface_radar, & - rcfg,cloudsat_micro_scheme) - if (Lcalipso) call cosp_calipso_init() - if (LgrLidar532) call cosp_grLidar532_init() - if (Latlid) call cosp_atlid_init() - if (Lparasol) call cosp_parasol_init() - - linitialization = .FALSE. - END SUBROUTINE COSP_INIT - - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE cosp_errorCheck - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - subroutine cosp_errorCheck(cospgridIN, cospIN, Lisccp_subcolumn, Lisccp_column, & - Lmisr_subcolumn, Lmisr_column, Lmodis_subcolumn, Lmodis_column, Lcloudsat_subcolumn, & - Lcloudsat_column, Lcalipso_subcolumn, Lcalipso_column, Latlid_subcolumn, & - Latlid_column, LgrLidar532_subcolumn, LgrLidar532_column, & - Lrttov_column, Lparasol_subcolumn, Lparasol_column, Lradar_lidar_tcc, & - Llidar_only_freq_cloud, Lcloudsat_tcc, Lcloudsat_tcc2, Lcloudsat_modis_wr, & - cospOUT, errorMessage, nError) - - ! Inputs - type(cosp_column_inputs),intent(in) :: & - cospgridIN ! Model grid inputs to COSP - type(cosp_optical_inputs),intent(in) :: & - cospIN ! Derived (optical) input to COSP - - ! Outputs - logical,intent(inout) :: & - Lisccp_subcolumn, & ! ISCCP subcolumn simulator on/off switch - Lisccp_column, & ! ISCCP column simulator on/off switch - Lmisr_subcolumn, & ! MISR subcolumn simulator on/off switch - Lmisr_column, & ! MISR column simulator on/off switch - Lmodis_subcolumn, & ! MODIS subcolumn simulator on/off switch - Lmodis_column, & ! MODIS column simulator on/off switch - Lcloudsat_subcolumn, & ! CLOUDSAT subcolumn simulator on/off switch - Lcloudsat_column, & ! CLOUDSAT column simulator on/off switch - Lcalipso_subcolumn, & ! CALIPSO subcolumn simulator on/off switch - Lcalipso_column, & ! CALIPSO column simulator on/off switch - Latlid_subcolumn, & ! EarthCare subcolumn simulator on/off switch - Latlid_column, & ! EarthCare column simulator on/off switch - LgrLidar532_subcolumn, & ! Ground Lidar subcolumn simulator on/off switch - LgrLidar532_column, & ! Ground Lidar column simulator on/off switch - Lparasol_subcolumn, & ! PARASOL subcolumn simulator on/off switch - Lparasol_column, & ! PARASOL column simulator on/off switch - Lrttov_column, & ! RTTOV column simulator on/off switch - Lcloudsat_tcc, & ! - Lcloudsat_tcc2, & ! - Lradar_lidar_tcc, & ! On/Off switch for joint Calipso/Cloudsat product - Llidar_only_freq_cloud, & ! On/Off switch for joint Calipso/Cloudsat product - Lcloudsat_modis_wr ! On/Off switch for joint CloudSat/MODIS warm rain product - type(cosp_outputs),intent(inout) :: & - cospOUT ! COSP Outputs - character(len=256),dimension(100) :: errorMessage - integer,intent(out) :: nError - - ! Local variables - logical :: alloc_status - integer :: i - - nError = 0 - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! PART 0: Ensure that the inputs needed by the requested simulators are allocated. - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! ISCCP simulator - if (Lisccp_subcolumn .or. Lisccp_column) then - alloc_status = .true. - if (.not. allocated(cospgridIN%skt)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospgridIN%skt has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%qv)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospgridIN%qv has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%at)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospgridIN%at has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%frac_out)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospIN%frac_out has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%tau_067)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospIN%tau_067 has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%emiss_11)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospIN%emiss_11 has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%phalf)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospgridIN%phalf has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%sunlit)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospgridIN%sunlit has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%pfull)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (ISCCP simulator): cospgridIN%pfull has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - Lisccp_subcolumn = .false. - Lisccp_column = .false. - if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF - if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF - if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF - if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF - if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF - if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF - if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF - if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF - if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF - endif - endif - - ! MISR simulator - if (Lmisr_subcolumn .or. Lmisr_column) then - alloc_status = .true. - if (.not. allocated(cospIN%tau_067)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (MISR simulator): cospIN%tau_067 has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%sunlit)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (MISR simulator): cospgridIN%sunlit has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%hgt_matrix)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (MISR simulator): cospgridIN%hgt_matrix has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%at)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (MISR simulator): cospgridIN%at has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - Lmisr_subcolumn = .false. - Lmisr_column = .false. - if (associated(cospOUT%misr_fq)) cospOUT%misr_fq(:,:,:) = R_UNDEF - if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(:,:) = R_UNDEF - if (associated(cospOUT%misr_meanztop)) cospOUT%misr_meanztop(:) = R_UNDEF - if (associated(cospOUT%misr_cldarea)) cospOUT%misr_cldarea(:) = R_UNDEF - endif - endif - - ! EarthCare Lidar simulator. - if (Latlid_subcolumn .or. Latlid_column) then - alloc_status = .true. - if (.not. allocated(cospIN%beta_mol_atlid)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospIN%beta_mol_atlid has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%betatot_atlid)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospIN%betatot_atlid has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%tau_mol_atlid)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospIN%tau_mol_atlid has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%tautot_atlid)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospIN%tautot_atlid has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - Latlid_subcolumn = .false. - Latlid_column = .false. - if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%atlid_beta_mol)) cospOUT%atlid_beta_mol(:,:) = R_UNDEF - if (associated(cospOUT%atlid_beta_tot)) cospOUT%atlid_beta_tot(:,:,:) = R_UNDEF - endif - - ! EarthCare column simulator requires additional inputs not required by the subcolumn simulator. - alloc_status = .true. - if (.not. allocated(cospgridIN%hgt_matrix)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospgridIN%hgt_matrix has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%hgt_matrix_half)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospgridIN%hgt_matrix_half has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%phalf)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (EarthCare Lidar simulator): cospgridIN%phalf has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - Latlid_column = .false. - if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF - endif - endif - - ! Ground Lidar simulator. - if (LgrLidar532_subcolumn .or. LgrLidar532_column) then - alloc_status = .true. - if (.not. allocated(cospIN%beta_mol_grLidar532)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospIN%beta_mol_grLidar532 has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%betatot_grLidar532)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospIN%betatot_grLidar532 has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%tau_mol_grLidar532)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospIN%tau_mol_grLidar532 has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%tautot_grLidar532)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospIN%tautot_grLidar532 has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - LgrLidar532_subcolumn = .false. - LgrLidar532_column = .false. - if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_beta_mol)) cospOUT%grLidar532_beta_mol(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_beta_tot)) cospOUT%grLidar532_beta_tot(:,:,:) = R_UNDEF - endif - - ! Ground Lidar column simulator requires additional inputs not required by the subcolumn simulator. - alloc_status = .true. - if (.not. allocated(cospgridIN%hgt_matrix)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospgridIN%hgt_matrix has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%hgt_matrix_half)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospgridIN%hgt_matrix_half has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%phalf)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Ground Lidar simulator): cospgridIN%phalf has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - LgrLidar532_column = .false. - if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF - endif - endif - - ! Calipso Lidar simulator - if (Lcalipso_subcolumn .or. Lcalipso_column) then - alloc_status = .true. - if (.not. allocated(cospIN%beta_mol_calipso)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospIN%beta_mol_calipso has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%betatot_calipso)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospIN%betatot_calipso has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%betatot_liq_calipso)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator):'//& - ' cospIN%betatot_liq_calipso has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%betatot_ice_calipso)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator):'//& - ' cospIN%betatot_ice_calipso has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%tau_mol_calipso)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospIN%tau_mol_calipso has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%tautot_calipso)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospIN%tautot_calipso has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%tautot_liq_calipso)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator):'//& - ' cospIN%tautot_liq has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%tautot_ice_calipso)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator):'//& - ' cospIN%tautot_ice has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - Lcalipso_subcolumn = .false. - Lcalipso_column = .false. - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_beta_mol)) cospOUT%calipso_beta_mol(:,:) = R_UNDEF - if (associated(cospOUT%calipso_beta_tot)) cospOUT%calipso_beta_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_betaperp_tot)) cospOUT%calipso_betaperp_tot(:,:,:) = R_UNDEF - ! Also, turn-off joint-products - if (Lradar_lidar_tcc) then - Lradar_lidar_tcc = .false. - if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF - endif - if (Lcloudsat_tcc) then - Lcloudsat_tcc = .false. - if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF - endif - if (Lcloudsat_tcc2) then - Lcloudsat_tcc2 = .false. - if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF - endif - if (Llidar_only_freq_cloud) then - Llidar_only_freq_cloud = .false. - if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF - endif - endif - - ! Calipso column simulator requires additional inputs not required by the subcolumn simulator. - alloc_status = .true. - if (.not. allocated(cospgridIN%hgt_matrix)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator):'//& - ' cospgridIN%hgt_matrix has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%hgt_matrix_half)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator):'//& - ' cospgridIN%hgt_matrix_half has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%at)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospgridIN%at has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%surfelev)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospgridIN%surfelev has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%phalf)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Calipso Lidar simulator): cospgridIN%phalf has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - Lcalipso_column = .false. - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (Lcloudsat_tcc) then - Lcloudsat_tcc = .false. - if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF - endif - if (Lcloudsat_tcc2) then - Lcloudsat_tcc2 = .false. - if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF - endif - ! Also, turn-off joint-products - if (Lradar_lidar_tcc) then - Lradar_lidar_tcc = .false. - if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF - endif - if (Llidar_only_freq_cloud) then - Llidar_only_freq_cloud = .false. - if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF - endif - endif - endif - - ! PARASOL simulator - if (Lparasol_subcolumn .or. Lparasol_column) then - alloc_status = .true. - if (.not. allocated(cospIN%tautot_S_liq)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (PARASOL simulator): cospIN%tautot_S_liq has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%tautot_S_ice)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (PARASOL simulator): cospIN%tautot_S_ice has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - Lparasol_subcolumn = .false. - Lparasol_column = .false. - if (associated(cospOUT%parasolPix_refl)) cospOUT%parasolPix_refl(:,:,:) = R_UNDEF - if (associated(cospOUT%parasolGrid_refl)) cospOUT%parasolGrid_refl(:,:) = R_UNDEF - endif - - ! PARASOL column simulator requires additional inputs not required by the subcolumn simulator. - alloc_status = .true. - if (.not. allocated(cospgridIN%land)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (PARASOL simulator): cospgridIN%land has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - Lparasol_column = .false. - if (associated(cospOUT%parasolGrid_refl)) cospOUT%parasolGrid_refl(:,:) = R_UNDEF - endif - endif - - ! Cloudsat radar simulator - if (Lcloudsat_subcolumn .or. Lcloudsat_column) then - alloc_status = .true. - if (.not. allocated(cospIN%z_vol_cloudsat)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Cloudsat radar simulator):'//& - ' cospIN%z_vol_cloudsat has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%kr_vol_cloudsat)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Cloudsat radar simulator):'//& - ' cospIN%kr_vol_cloudsat has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%g_vol_cloudsat)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Cloudsat radar simulator):'//& - ' cospIN%g_vol_cloudsat has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%hgt_matrix)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Cloudsat radar simulator):'//& - ' cospgridIN%hgt_matrix has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%surfelev)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Cloudsat radar simulator):'//& - ' cospgridIN%surfelev has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - Lcloudsat_subcolumn = .false. - Lcloudsat_column = .false. - if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF - if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(:,:,:) = R_UNDEF - if (Lcloudsat_tcc) then - Lcloudsat_tcc = .false. - if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF - endif - if (Lcloudsat_tcc2) then - Lcloudsat_tcc2 = .false. - if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF - endif - ! Also, turn-off joint-products - if (Lradar_lidar_tcc) then - Lradar_lidar_tcc = .false. - if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF - endif - if (Llidar_only_freq_cloud) then - Llidar_only_freq_cloud = .false. - if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF - endif - if (Lcloudsat_modis_wr) then - Lcloudsat_modis_wr = .false. - if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF - if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF - endif - endif - - ! Cloudsat column simulator requires additional inputs not required by the subcolumn simulator. - alloc_status = .true. - if (.not. allocated(cospgridIN%hgt_matrix_half)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (Cloudsat radar simulator):'//& - ' cospgridIN%hgt_matrix_half has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - Lcloudsat_column = .false. - if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF - if (Lcloudsat_tcc) then - Lcloudsat_tcc = .false. - if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF - endif - if (Lcloudsat_tcc2) then - Lcloudsat_tcc2 = .false. - if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF - endif - ! Also, turn-off joint-products - if (Lradar_lidar_tcc) then - Lradar_lidar_tcc = .false. - if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF - endif - if (Llidar_only_freq_cloud) then - Llidar_only_freq_cloud = .false. - if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF - endif - if (Lcloudsat_modis_wr) then - Lcloudsat_modis_wr = .false. - if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF - if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF - endif - endif - endif - - ! MODIS simulator - if (Lmodis_subcolumn .or. Lmodis_column) then - alloc_status = .true. - if (.not. allocated(cospIN%fracLiq)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (MODIS simulator): cospIN%fracLiq has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%tau_067)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (MODIS simulator): cospIN%tau_067 has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%asym)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (MODIS simulator): cospIN%asym has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospIN%ss_alb)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (MODIS simulator): cospIN%ss_alb has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%sunlit)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (MODIS simulator): cospgridIN%sunlit has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - Lmodis_subcolumn = .false. - Lmodis_column = .false. - if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & - cospOUT%modis_Cloud_Fraction_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & - cospOUT%modis_Cloud_Fraction_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & - cospOUT%modis_Cloud_Fraction_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & - cospOUT%modis_Cloud_Fraction_High_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & - cospOUT%modis_Cloud_Fraction_Mid_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & - cospOUT%modis_Cloud_Fraction_Low_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & - cospOUT%modis_Optical_Thickness_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & - cospOUT%modis_Optical_Thickness_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & - cospOUT%modis_Optical_Thickness_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & - cospOUT%modis_Optical_Thickness_Total_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & - cospOUT%modis_Optical_Thickness_Water_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & - cospOUT%modis_Optical_Thickness_Ice_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & - cospOUT%modis_Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & - cospOUT%modis_Liquid_Water_Path_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & - cospOUT%modis_Ice_Water_Path_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) & - cospOUT%modis_LWP_vs_ReffLIQ(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_IWP_vs_ReffICE)) & - cospOUT%modis_IWP_vs_ReffICE(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) & - cospOUT%modis_Optical_Thickness_vs_ReffICE(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) & - cospOUT%modis_Optical_Thickness_vs_ReffLIQ(:,:,:) = R_UNDEF - ! Also, turn-off joint-products - if (Lcloudsat_modis_wr) then - Lcloudsat_modis_wr = .false. - if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF - if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF - endif - endif - endif - - ! RTTOV - if (Lrttov_column) then - alloc_status = .true. -! if (.not. allocated(cospgridIN%emis_in)) then -! nError=nError+1 -! errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%emis_in has not been allocated' -! alloc_status = .false. -! endif -! if (.not. allocated(cospgridIN%refl_in)) then -! nError=nError+1 -! errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%refl_in has not been allocated' -! alloc_status = .false. -! endif - if (.not. allocated(cospgridIN%hgt_matrix_half)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%hgt_matrix_half has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%u_sfc)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%u_sfc has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%v_sfc)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%v_sfc has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%skt)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%skt has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%phalf)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%phalf has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%qv)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%qv has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%at)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%at has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%rttov_sfcmask)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV simulator): cospgridIN%rttov_sfcmask has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%lat)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%lat has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%lon)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%lon has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%pfull)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%pfull has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%phalf)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%phalf has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%at)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%at has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%qv)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%qv has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%o3)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%o3 has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%tca)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%tca has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%sza)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%sza has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%cloudIce)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%cloudIce has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%cloudLiq)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%cloudLiq has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%fl_rain)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%fl_rain has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%fl_snow)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%fl_snow has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%rttov_date)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%rttov_date has not been allocated' - alloc_status = .false. - endif - if (.not. allocated(cospgridIN%rttov_time)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable (RTTOV): cospgridIN%rttov_time has not been allocated' - alloc_status = .false. - endif - if (.not. alloc_status) then - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - endif - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! PART 1: Check input array values for out-of-bounds values. When an out-of-bound value - ! is encountered, COSP outputs that are dependent on that input are filled with - ! an undefined value (set in cosp_config.f90) and if necessary, that simulator - ! is turned off. - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if (any([Lisccp_subcolumn, Lisccp_column, Lmisr_subcolumn, Lmisr_column, & - Lmodis_subcolumn, Lmodis_column, Lcloudsat_modis_wr])) then - if (any(cospgridIN%sunlit .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%sunlit contains values out of range (0 or 1)' - Lisccp_subcolumn = .false. - Lisccp_column = .false. - Lmisr_subcolumn = .false. - Lmisr_column = .false. - Lmodis_subcolumn = .false. - Lmodis_column = .false. - Lcloudsat_modis_wr = .false. - if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF - if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF - if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF - if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF - if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF - if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF - if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF - if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF - if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF - if (associated(cospOUT%misr_fq)) cospOUT%misr_fq(:,:,:) = R_UNDEF - if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(:,:) = R_UNDEF - if (associated(cospOUT%misr_meanztop)) cospOUT%misr_meanztop(:) = R_UNDEF - if (associated(cospOUT%misr_cldarea)) cospOUT%misr_cldarea(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & - cospOUT%modis_Cloud_Fraction_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & - cospOUT%modis_Cloud_Fraction_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & - cospOUT%modis_Cloud_Fraction_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & - cospOUT%modis_Cloud_Fraction_High_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & - cospOUT%modis_Cloud_Fraction_Mid_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & - cospOUT%modis_Cloud_Fraction_Low_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & - cospOUT%modis_Optical_Thickness_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & - cospOUT%modis_Optical_Thickness_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & - cospOUT%modis_Optical_Thickness_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & - cospOUT%modis_Optical_Thickness_Total_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & - cospOUT%modis_Optical_Thickness_Water_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & - cospOUT%modis_Optical_Thickness_Ice_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & - cospOUT%modis_Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & - cospOUT%modis_Liquid_Water_Path_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & - cospOUT%modis_Ice_Water_Path_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) & - cospOUT%modis_LWP_vs_ReffLIQ(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_IWP_vs_ReffICE)) & - cospOUT%modis_IWP_vs_ReffICE(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) & - cospOUT%modis_Optical_Thickness_vs_ReffICE(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) & - cospOUT%modis_Optical_Thickness_vs_ReffLIQ(:,:,:) = R_UNDEF - if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF - if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF - endif - endif - - if (any([Lisccp_subcolumn, Lisccp_column, Lmisr_subcolumn, Lmisr_column, Lrttov_column,& - Lcalipso_column, Lcloudsat_column, Lradar_lidar_tcc,Llidar_only_freq_cloud, & - Lcloudsat_tcc, Lcloudsat_tcc2, Lcloudsat_modis_wr])) then - if (any(cospgridIN%at .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%at contains values out of range (at<0), expected units (K)' - Lisccp_subcolumn = .false. - Lisccp_column = .false. - Lmisr_subcolumn = .false. - Lmisr_column = .false. - Lrttov_column = .false. - Lcalipso_column = .false. - Lcloudsat_column = .false. - Lradar_lidar_tcc = .false. - Llidar_only_freq_cloud = .false. - Lcloudsat_tcc = .false. - Lcloudsat_tcc2 = .false. - Lcloudsat_modis_wr = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF - if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF - if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF - if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF - if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF - if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF - if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF - if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF - if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF - if (associated(cospOUT%misr_fq)) cospOUT%misr_fq(:,:,:) = R_UNDEF - if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(:,:) = R_UNDEF - if (associated(cospOUT%misr_meanztop)) cospOUT%misr_meanztop(:) = R_UNDEF - if (associated(cospOUT%misr_cldarea)) cospOUT%misr_cldarea(:) = R_UNDEF - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF - if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF - if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF - if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF - if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF - endif - endif - if (any([Lisccp_subcolumn, Lisccp_column, Lrttov_column])) then - if (any(cospgridIN%pfull .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%pfull contains values out of range' - Lisccp_subcolumn = .false. - Lisccp_column = .false. - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF - if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF - if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF - if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF - if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF - if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF - if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF - if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF - if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF - endif - endif - if (any([Lisccp_subcolumn,Lisccp_column,Lmodis_subcolumn,Lmodis_column,Lcalipso_column,Lrttov_column,& - LgrLidar532_column,Latlid_column])) then - if (any(cospgridIN%phalf .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%phalf contains values out of range' - Lisccp_subcolumn = .false. - Lisccp_column = .false. - Lmodis_subcolumn = .false. - Lmodis_column = .false. - Lcalipso_column = .false. - Lrttov_column = .false. - Latlid_column = .false. - LgrLidar532_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF - if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF - if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF - if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF - if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF - if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF - if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF - if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF - if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & - cospOUT%modis_Cloud_Fraction_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & - cospOUT%modis_Cloud_Fraction_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & - cospOUT%modis_Cloud_Fraction_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & - cospOUT%modis_Cloud_Fraction_High_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & - cospOUT%modis_Cloud_Fraction_Mid_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & - cospOUT%modis_Cloud_Fraction_Low_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & - cospOUT%modis_Optical_Thickness_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & - cospOUT%modis_Optical_Thickness_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & - cospOUT%modis_Optical_Thickness_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & - cospOUT%modis_Optical_Thickness_Total_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & - cospOUT%modis_Optical_Thickness_Water_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & - cospOUT%modis_Optical_Thickness_Ice_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & - cospOUT%modis_Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & - cospOUT%modis_Liquid_Water_Path_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & - cospOUT%modis_Ice_Water_Path_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) & - cospOUT%modis_LWP_vs_ReffLIQ(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_IWP_vs_ReffICE)) & - cospOUT%modis_IWP_vs_ReffICE(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) & - cospOUT%modis_Optical_Thickness_vs_ReffICE(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) & - cospOUT%modis_Optical_Thickness_vs_ReffLIQ(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - endif - endif - if (any([Lisccp_subcolumn,Lisccp_column,Lrttov_column])) then - if (any(cospgridIN%qv .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%qv contains values out of range' - Lisccp_subcolumn = .false. - Lisccp_column = .false. - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF - if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF - if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF - if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF - if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF - if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF - if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF - if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF - if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF - endif - endif - if (any([Lmisr_subcolumn,Lmisr_column,Lcloudsat_subcolumn,Lcloudsat_column,Lcalipso_column,Lradar_lidar_tcc,& - Llidar_only_freq_cloud,LgrLidar532_column,Latlid_column,Lcloudsat_tcc, Lcloudsat_tcc2, & - Lcloudsat_modis_wr])) then - if (any(cospgridIN%hgt_matrix .lt. -300)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%hgt_matrix contains values out of range' - Lmisr_subcolumn = .false. - Lmisr_column = .false. - Lcloudsat_subcolumn = .false. - Lcloudsat_column = .false. - Lcalipso_column = .false. - Lradar_lidar_tcc = .false. - Llidar_only_freq_cloud = .false. - Lcloudsat_tcc = .false. - Lcloudsat_tcc2 = .false. - Latlid_column = .false. - LgrLidar532_column = .false. - Lcloudsat_modis_wr = .false. - if (associated(cospOUT%misr_fq)) cospOUT%misr_fq(:,:,:) = R_UNDEF - if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(:,:) = R_UNDEF - if (associated(cospOUT%misr_meanztop)) cospOUT%misr_meanztop(:) = R_UNDEF - if (associated(cospOUT%misr_cldarea)) cospOUT%misr_cldarea(:) = R_UNDEF - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF - if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF - if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF - if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF - if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF - endif - endif - if (any([Lrttov_column,Lcloudsat_column,Lcalipso_column,Lradar_lidar_tcc,Llidar_only_freq_cloud, & - LgrLidar532_column, Latlid_column, Lcloudsat_tcc, Lcloudsat_tcc2, Lcloudsat_modis_wr])) then - if (any(cospgridIN%hgt_matrix_half .lt. -300)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%hgt_matrix_half contains values out of range' - Lrttov_column = .false. - Lcloudsat_column = .false. - Lcalipso_column = .false. - Lradar_lidar_tcc = .false. - Llidar_only_freq_cloud = .false. - Lcloudsat_tcc = .false. - Lcloudsat_tcc2 = .false. - Latlid_column = .false. - LgrLidar532_column = .false. - Lcloudsat_modis_wr = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF - if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF - if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF - if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF - if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF - endif - endif - if (any([Lrttov_column,Lcalipso_column,Lparasol_column])) then - if (any(cospgridIN%land .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%land contains values out of range' - Lrttov_column = .false. - Lcalipso_column = .false. - Lparasol_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - if (associated(cospOUT%parasolGrid_refl)) cospOUT%parasolGrid_refl(:,:) = R_UNDEF - endif - endif - if (any([Lisccp_subcolumn,Lisccp_column,Lrttov_column])) then - if (any(cospgridIN%skt .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%skt contains values out of range' - Lisccp_subcolumn = .false. - Lisccp_column = .false. - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF - if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF - if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF - if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF - if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF - if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF - if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF - if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF - if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF - endif - endif - - ! RTTOV Inputs - if (Lrttov_column) then - if (any(cospgridIN%co2 .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%co2 contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%ch4 .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%ch4 contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%n2o .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%n2o contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%co.lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%co contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%o3 .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%o3 contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif -! if (any(cospgridIN%emis_in .lt. 0. .OR. cospgridIN%emis_in .gt. 1)) then -! nError=nError+1 -! errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%emis_in contains values out of range' -! Lrttov_column = .false. -! if (allocated(cospOUT%rttov_outputs)) then -! do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument -! if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 -! if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF -! end do -! end if -! endif -! if (any(cospgridIN%refl_in .lt. 0. .OR. cospgridIN%refl_in .gt. 1)) then -! nError=nError+1 -! errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%refl_in contains values out of range' -! Lrttov_column = .false. -! if (allocated(cospOUT%rttov_outputs)) then -! do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument -! if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 -! if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF -! if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF -! end do -! end if -! endif - if (any(cospgridIN%rttov_sfcmask .lt. 0 .or. cospgridIN%rttov_sfcmask .gt. 2)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospgridIN%rttov_sfcmask contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%u_sfc .lt. -100. .OR. cospgridIN%u_sfc .gt. 100.)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%u_sfc contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%v_sfc .lt. -100. .OR. cospgridIN%v_sfc .gt. 100.)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%v_sfc contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%lat .lt. -90 .OR. cospgridIN%lat .gt. 90)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%lat contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%lon .lt. -180 .OR. cospgridIN%lon .gt. 360)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%lon contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%tca .lt. 0 .OR. cospgridIN%tca .gt. 1)) then ! tca on [0,1] - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tca contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%rttov_time(:,1) .lt. 0 .OR. cospgridIN%rttov_time(:,1) .gt. 24)) then ! rttov_time(1), hour on [0,24] - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%rttov_time(1) contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%rttov_time(:,2) .lt. 0 .OR. cospgridIN%rttov_time(:,2) .gt. 60)) then ! rttov_time(2), minute on [0,60] - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%rttov_time(2) contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%rttov_time(:,3) .lt. 0 .OR. cospgridIN%rttov_time(:,3) .gt. 60)) then ! rttov_time(3), second on [0,60] - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%rttov_time(3) contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%rttov_date(:,1) .lt. 0)) then ! rttov_date(1), year on [0,inf] - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%rttov_date(1) contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%rttov_date(:,2) .lt. 0 .OR. cospgridIN%rttov_date(:,2) .gt. 12)) then ! rttov_date(2), month on [0,12] - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%rttov_date(2) contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - if (any(cospgridIN%rttov_date(:,3) .lt. 1 .OR. cospgridIN%rttov_date(:,3) .gt. 31)) then ! rttov_date(3), day on [1,31] - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%rttov_date(3) contains values out of range' - Lrttov_column = .false. - if (allocated(cospOUT%rttov_outputs)) then - do i=1,cospOUT % Ninst_rttov ! Iterate over each instrument - if (associated(cospOUT%rttov_outputs(i)%channel_indices)) cospOUT%rttov_outputs(i)%channel_indices(:) = 0 - if (associated(cospOUT%rttov_outputs(i)%bt_total)) cospOUT%rttov_outputs(i)%bt_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_clear)) cospOUT%rttov_outputs(i)%bt_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total)) cospOUT%rttov_outputs(i)%rad_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_clear)) cospOUT%rttov_outputs(i)%rad_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_cloudy)) cospOUT%rttov_outputs(i)%rad_cloudy(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_total)) cospOUT%rttov_outputs(i)%refl_total(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%refl_clear)) cospOUT%rttov_outputs(i)%refl_clear(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%bt_total_pc)) cospOUT%rttov_outputs(i)%bt_total_pc(:,:) = R_UNDEF - if (associated(cospOUT%rttov_outputs(i)%rad_total_pc)) cospOUT%rttov_outputs(i)%rad_total_pc(:,:) = R_UNDEF - end do - end if - endif - endif - - ! COSP_INPUTS - if (any([Lisccp_subcolumn,Lisccp_column])) then - if (cospIN%emsfc_lw .lt. 0. .OR. cospIN%emsfc_lw .gt. 1.) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%emsfc_lw contains values out of range' - Lisccp_subcolumn = .false. - Lisccp_column = .false. - if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF - if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF - if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF - if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF - if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF - if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF - if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF - if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF - if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF - endif - endif - if (any([Lisccp_subcolumn,Lisccp_column,Lmisr_subcolumn,Lmisr_column,Lmodis_subcolumn,Lmodis_column])) then - if (any(cospIN%tau_067 .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tau_067 contains values out of range' - Lisccp_subcolumn = .false. - Lisccp_column = .false. - Lmisr_subcolumn = .false. - Lmisr_column = .false. - Lmodis_subcolumn = .false. - Lmodis_column = .false. - if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF - if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF - if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF - if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF - if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF - if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF - if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF - if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF - if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF - if (associated(cospOUT%misr_fq)) cospOUT%misr_fq(:,:,:) = R_UNDEF - if (associated(cospOUT%misr_dist_model_layertops)) cospOUT%misr_dist_model_layertops(:,:) = R_UNDEF - if (associated(cospOUT%misr_meanztop)) cospOUT%misr_meanztop(:) = R_UNDEF - if (associated(cospOUT%misr_cldarea)) cospOUT%misr_cldarea(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & - cospOUT%modis_Cloud_Fraction_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & - cospOUT%modis_Cloud_Fraction_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & - cospOUT%modis_Cloud_Fraction_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & - cospOUT%modis_Cloud_Fraction_High_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & - cospOUT%modis_Cloud_Fraction_Mid_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & - cospOUT%modis_Cloud_Fraction_Low_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & - cospOUT%modis_Optical_Thickness_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & - cospOUT%modis_Optical_Thickness_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & - cospOUT%modis_Optical_Thickness_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & - cospOUT%modis_Optical_Thickness_Total_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & - cospOUT%modis_Optical_Thickness_Water_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & - cospOUT%modis_Optical_Thickness_Ice_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & - cospOUT%modis_Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & - cospOUT%modis_Liquid_Water_Path_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & - cospOUT%modis_Ice_Water_Path_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) & - cospOUT%modis_LWP_vs_ReffLIQ(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_IWP_vs_ReffICE)) & - cospOUT%modis_IWP_vs_ReffICE(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) & - cospOUT%modis_Optical_Thickness_vs_ReffICE(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) & - cospOUT%modis_Optical_Thickness_vs_ReffLIQ(:,:,:) = R_UNDEF - endif - endif - if (any([Lisccp_subcolumn,Lisccp_column])) then - if (any(cospIN%emiss_11 .lt. 0. .OR. cospIN%emiss_11 .gt. 1)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%emiss_11 contains values out of range' - Lisccp_subcolumn = .false. - Lisccp_column = .false. - if (associated(cospOUT%isccp_totalcldarea)) cospOUT%isccp_totalcldarea(:) = R_UNDEF - if (associated(cospOUT%isccp_meantb)) cospOUT%isccp_meantb(:) = R_UNDEF - if (associated(cospOUT%isccp_meantbclr)) cospOUT%isccp_meantbclr(:) = R_UNDEF - if (associated(cospOUT%isccp_meanptop)) cospOUT%isccp_meanptop(:) = R_UNDEF - if (associated(cospOUT%isccp_meantaucld)) cospOUT%isccp_meantaucld(:) = R_UNDEF - if (associated(cospOUT%isccp_meanalbedocld)) cospOUT%isccp_meanalbedocld(:) = R_UNDEF - if (associated(cospOUT%isccp_boxtau)) cospOUT%isccp_boxtau(:,:) = R_UNDEF - if (associated(cospOUT%isccp_boxptop)) cospOUT%isccp_boxptop(:,:) = R_UNDEF - if (associated(cospOUT%isccp_fq)) cospOUT%isccp_fq(:,:,:) = R_UNDEF - endif - endif - if (any([Lmodis_subcolumn,Lmodis_column])) then - if (any(cospIN%asym .lt. -1. .OR. cospIN%asym .gt. 1)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%asym contains values out of range' - Lmodis_subcolumn = .false. - Lmodis_column = .false. - if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & - cospOUT%modis_Cloud_Fraction_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & - cospOUT%modis_Cloud_Fraction_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & - cospOUT%modis_Cloud_Fraction_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & - cospOUT%modis_Cloud_Fraction_High_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & - cospOUT%modis_Cloud_Fraction_Mid_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & - cospOUT%modis_Cloud_Fraction_Low_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & - cospOUT%modis_Optical_Thickness_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & - cospOUT%modis_Optical_Thickness_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & - cospOUT%modis_Optical_Thickness_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & - cospOUT%modis_Optical_Thickness_Total_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & - cospOUT%modis_Optical_Thickness_Water_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & - cospOUT%modis_Optical_Thickness_Ice_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & - cospOUT%modis_Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & - cospOUT%modis_Liquid_Water_Path_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & - cospOUT%modis_Ice_Water_Path_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) & - cospOUT%modis_LWP_vs_ReffLIQ(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_IWP_vs_ReffICE)) & - cospOUT%modis_IWP_vs_ReffICE(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) & - cospOUT%modis_Optical_Thickness_vs_ReffICE(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) & - cospOUT%modis_Optical_Thickness_vs_ReffLIQ(:,:,:) = R_UNDEF - endif - if (any(cospIN%ss_alb .lt. 0 .OR. cospIN%ss_alb .gt. 1)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%ss_alb contains values out of range' - Lmodis_subcolumn = .false. - Lmodis_column = .false. - if (associated(cospOUT%modis_Cloud_Fraction_Total_Mean)) & - cospOUT%modis_Cloud_Fraction_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Water_Mean)) & - cospOUT%modis_Cloud_Fraction_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Ice_Mean)) & - cospOUT%modis_Cloud_Fraction_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_High_Mean)) & - cospOUT%modis_Cloud_Fraction_High_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Mid_Mean)) & - cospOUT%modis_Cloud_Fraction_Mid_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Fraction_Low_Mean)) & - cospOUT%modis_Cloud_Fraction_Low_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_Mean)) & - cospOUT%modis_Optical_Thickness_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_Mean)) & - cospOUT%modis_Optical_Thickness_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_Mean)) & - cospOUT%modis_Optical_Thickness_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Total_LogMean)) & - cospOUT%modis_Optical_Thickness_Total_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Water_LogMean)) & - cospOUT%modis_Optical_Thickness_Water_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_Ice_LogMean)) & - cospOUT%modis_Optical_Thickness_Ice_LogMean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Water_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Water_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Particle_Size_Ice_Mean)) & - cospOUT%modis_Cloud_Particle_Size_Ice_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Cloud_Top_Pressure_Total_Mean)) & - cospOUT%modis_Cloud_Top_Pressure_Total_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Liquid_Water_Path_Mean)) & - cospOUT%modis_Liquid_Water_Path_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Ice_Water_Path_Mean)) & - cospOUT%modis_Ice_Water_Path_Mean(:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Liq(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice)) & - cospOUT%modis_Optical_Thickness_vs_Cloud_Top_Pressure_Ice(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_LWP_vs_ReffLIQ)) & - cospOUT%modis_LWP_vs_ReffLIQ(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_IWP_vs_ReffICE)) & - cospOUT%modis_IWP_vs_ReffICE(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffICE)) & - cospOUT%modis_Optical_Thickness_vs_ReffICE(:,:,:) = R_UNDEF - if (associated(cospOUT%modis_Optical_Thickness_vs_ReffLIQ)) & - cospOUT%modis_Optical_Thickness_vs_ReffLIQ(:,:,:) = R_UNDEF - endif - endif - if (any([Latlid_subcolumn,Latlid_column])) then - if (any(cospIN%betatot_atlid .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%betatot_atlid contains values out of range' - Latlid_subcolumn = .false. - Latlid_column = .false. - if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%atlid_beta_tot)) cospOUT%atlid_beta_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_beta_mol)) cospOUT%atlid_beta_mol(:,:) = R_UNDEF - endif - if (any(cospIN%beta_mol_atlid .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%beta_mol_atlid contains values out of range' - Latlid_subcolumn = .false. - Latlid_column = .false. - if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%atlid_beta_tot)) cospOUT%atlid_beta_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_beta_mol)) cospOUT%atlid_beta_mol(:,:) = R_UNDEF - endif - if (any(cospIN%tautot_atlid .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tautot_atlid contains values out of range' - Latlid_subcolumn = .false. - Latlid_column = .false. - if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%atlid_beta_tot)) cospOUT%atlid_beta_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_beta_mol)) cospOUT%atlid_beta_mol(:,:) = R_UNDEF - endif - if (any(cospIN%tau_mol_atlid .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tau_mol_atlid contains values out of range' - Latlid_subcolumn = .false. - Latlid_column = .false. - if (associated(cospOUT%atlid_cfad_sr)) cospOUT%atlid_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_lidarcld)) cospOUT%atlid_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%atlid_cldlayer)) cospOUT%atlid_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%atlid_beta_tot)) cospOUT%atlid_beta_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%atlid_beta_mol)) cospOUT%atlid_beta_mol(:,:) = R_UNDEF - endif - endif - - if (any([LgrLidar532_subcolumn,LgrLidar532_column])) then - if (any(cospIN%betatot_grLidar532 .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%betatot_grLidar532 contains values out of range' - LgrLidar532_subcolumn = .false. - LgrLidar532_column = .false. - if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_beta_tot)) cospOUT%grLidar532_beta_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_beta_mol)) cospOUT%grLidar532_beta_mol(:,:) = R_UNDEF - endif - if (any(cospIN%beta_mol_grLidar532 .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%beta_mol_grLidar532 contains values out of range' - LgrLidar532_subcolumn = .false. - LgrLidar532_column = .false. - if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_beta_tot)) cospOUT%grLidar532_beta_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_beta_mol)) cospOUT%grLidar532_beta_mol(:,:) = R_UNDEF - endif - if (any(cospIN%tautot_grLidar532 .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tautot_grLidar532 contains values out of range' - LgrLidar532_subcolumn = .false. - LgrLidar532_column = .false. - if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_beta_tot)) cospOUT%grLidar532_beta_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_beta_mol)) cospOUT%grLidar532_beta_mol(:,:) = R_UNDEF - endif - if (any(cospIN%tau_mol_grLidar532 .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tau_mol_grLidar532 contains values out of range' - LgrLidar532_subcolumn = .false. - LgrLidar532_column = .false. - if (associated(cospOUT%grLidar532_cfad_sr)) cospOUT%grLidar532_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_lidarcld)) cospOUT%grLidar532_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_cldlayer)) cospOUT%grLidar532_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_beta_tot)) cospOUT%grLidar532_beta_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%grLidar532_beta_mol)) cospOUT%grLidar532_beta_mol(:,:) = R_UNDEF - endif - endif - - if (any([Lcalipso_subcolumn,Lcalipso_column])) then - if (any(cospIN%betatot_calipso .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%betatot_calipso contains values out of range' - Lcalipso_subcolumn = .false. - Lcalipso_column = .false. - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - endif - if (any(cospIN%betatot_liq_calipso .lt. 0)) then - nError=nError+1 - errorMessage(nError) = ('ERROR: COSP input variable: cospIN%betatot_liq_calipso contains values out of range') - Lcalipso_subcolumn = .false. - Lcalipso_column = .false. - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - endif - if (any(cospIN%betatot_ice_calipso .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%betatot_ice_calipso contains values out of range' - Lcalipso_subcolumn = .false. - Lcalipso_column = .false. - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - endif - if (any(cospIN%tautot_calipso .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tautot_calipso contains values out of range' - Lcalipso_subcolumn = .false. - Lcalipso_column = .false. - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - endif - if (any(cospIN%tautot_liq_calipso .lt. 0)) then - nError=nError+1 - errorMessage(nError) = ('ERROR: COSP input variable: cospIN%tautot_liq_calipso contains values out of range') - Lcalipso_subcolumn = .false. - Lcalipso_column = .false. - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - endif - if (any(cospIN%tautot_ice_calipso .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tautot_ice_calipso contains values out of range' - Lcalipso_subcolumn = .false. - Lcalipso_column = .false. - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - endif - if (any(cospIN%tau_mol_calipso .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tau_mol_calipso contains values out of range' - Lcalipso_subcolumn = .false. - Lcalipso_column = .false. - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - endif - endif - if (any([Lcalipso_subcolumn,Lcalipso_column,Lcloudsat_column,Lradar_lidar_tcc, & - Llidar_only_freq_cloud, Lcloudsat_tcc, Lcloudsat_tcc2])) then - if (any(cospIN%beta_mol_calipso .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%beta_mol_calipso contains values out of range' - Lcalipso_subcolumn = .false. - Lcalipso_column = .false. - Lcloudsat_column = .false. - Lradar_lidar_tcc = .false. - Llidar_only_freq_cloud = .false. - Lcloudsat_tcc = .false. - Lcloudsat_tcc2 = .false. - if (associated(cospOUT%calipso_cfad_sr)) cospOUT%calipso_cfad_sr(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcld)) cospOUT%calipso_lidarcld(:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldphase)) cospOUT%calipso_lidarcldphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayer)) cospOUT%calipso_cldlayer(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldlayerphase)) cospOUT%calipso_cldlayerphase(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtmp)) cospOUT%calipso_lidarcldtmp(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_srbval)) cospOUT%calipso_srbval(:) = R_UNDEF - if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF - if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF - if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF - if (associated(cospOUT%calipso_lidarcldtype)) cospOUT%calipso_lidarcldtype(:,:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtype)) cospOUT%calipso_cldtype(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypetemp)) cospOUT%calipso_cldtypetemp(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanz)) cospOUT%calipso_cldtypemeanz(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldtypemeanzse)) cospOUT%calipso_cldtypemeanzse(:,:) = R_UNDEF - if (associated(cospOUT%calipso_cldthinemis)) cospOUT%calipso_cldthinemis(:) = R_UNDEF - endif - endif - if (any([Lparasol_subcolumn,Lparasol_column])) then - if (any(cospIN%tautot_S_liq .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tautot_S_liq contains values out of range' - Lparasol_subcolumn = .false. - Lparasol_column = .false. - if (associated(cospOUT%parasolPix_refl)) cospOUT%parasolPix_refl(:,:,:) = R_UNDEF - if (associated(cospOUT%parasolGrid_refl)) cospOUT%parasolGrid_refl(:,:) = R_UNDEF - endif - if (any(cospIN%tautot_S_ice .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%tautot_S_ice contains values out of range' - Lparasol_subcolumn = .false. - Lparasol_column = .false. - if (associated(cospOUT%parasolPix_refl)) cospOUT%parasolPix_refl(:,:,:) = R_UNDEF - if (associated(cospOUT%parasolGrid_refl)) cospOUT%parasolGrid_refl(:,:) = R_UNDEF - endif - endif - if (any([Lcloudsat_subcolumn,Lcloudsat_column,Lradar_lidar_tcc,Llidar_only_freq_cloud, & - Lcloudsat_tcc, Lcloudsat_tcc2, Lcloudsat_modis_wr])) then - if (any(cospIN%z_vol_cloudsat .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%z_vol_cloudsat contains values out of range' - Lcloudsat_subcolumn = .false. - Lcloudsat_column = .false. - Lradar_lidar_tcc = .false. - Llidar_only_freq_cloud = .false. - Lcloudsat_tcc = .false. - Lcloudsat_tcc2 = .false. - Lcloudsat_modis_wr = .false. - if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF - if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF - if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF - if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF - if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF - endif - if (any(cospIN%kr_vol_cloudsat .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%kr_vol_cloudsat contains values out of range' - Lcloudsat_subcolumn = .false. - Lcloudsat_column = .false. - Lradar_lidar_tcc = .false. - Llidar_only_freq_cloud = .false. - Lcloudsat_tcc = .false. - Lcloudsat_tcc2 = .false. - Lcloudsat_modis_wr = .false. - if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF - if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF - if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF - if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF - if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF - endif - if (any(cospIN%g_vol_cloudsat .lt. 0)) then - nError=nError+1 - errorMessage(nError) = 'ERROR: COSP input variable: cospIN%g_vol_cloudsat contains values out of range' - Lcloudsat_subcolumn = .false. - Lcloudsat_column = .false. - Lradar_lidar_tcc = .false. - Llidar_only_freq_cloud = .false. - Lcloudsat_tcc = .false. - Lcloudsat_tcc2 = .false. - Lcloudsat_modis_wr = .false. - if (associated(cospOUT%cloudsat_cfad_ze)) cospOUT%cloudsat_cfad_ze(:,:,:) = R_UNDEF - if (associated(cospOUT%cloudsat_Ze_tot)) cospOUT%cloudsat_Ze_tot(:,:,:) = R_UNDEF - if (associated(cospOUT%lidar_only_freq_cloud)) cospOUT%lidar_only_freq_cloud(:,:) = R_UNDEF - if (associated(cospOUT%radar_lidar_tcc)) cospOUT%radar_lidar_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc)) cospOUT%cloudsat_tcc(:) = R_UNDEF - if (associated(cospOUT%cloudsat_tcc2)) cospOUT%cloudsat_tcc2(:) = R_UNDEF - if (associated(cospOUT%cfodd_ntotal)) cospOUT%cfodd_ntotal(:,:,:,:) = R_UNDEF - if (associated(cospOUT%wr_occfreq_ntotal)) cospOUT%wr_occfreq_ntotal(:,:) = R_UNDEF - endif - endif - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! Part 2: Check input fields array size for consistency. This needs to be done for each - ! simulator - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! ISCCP - if (Lisccp_subcolumn .or. Lisccp_column) then - if (size(cospIN%frac_out,1) .ne. cospIN%Npoints .OR. & - size(cospIN%tau_067,1) .ne. cospIN%Npoints .OR. & - size(cospIN%emiss_11,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%skt) .ne. cospIN%Npoints .OR. & - size(cospgridIN%qv,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%at,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%phalf,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%sunlit) .ne. cospIN%Npoints .OR. & - size(cospgridIN%pfull,1) .ne. cospIN%Npoints) then - Lisccp_subcolumn = .false. - Lisccp_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(isccp_simulator): The number of points in the input fields are inconsistent' - endif - if (size(cospIN%frac_out,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%tau_067,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%emiss_11,2) .ne. cospIN%Ncolumns) then - Lisccp_subcolumn = .false. - Lisccp_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(isccp_simulator): The number of sub-columns in the input fields are inconsistent' - endif - if (size(cospIN%frac_out,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%tau_067,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%emiss_11,3) .ne. cospIN%Nlevels .OR. & - size(cospgridIN%qv,2) .ne. cospIN%Nlevels .OR. & - size(cospgridIN%at,2) .ne. cospIN%Nlevels .OR. & - size(cospgridIN%pfull,2) .ne. cospIN%Nlevels .OR. & - size(cospgridIN%phalf,2) .ne. cospIN%Nlevels+1) then - Lisccp_subcolumn = .false. - Lisccp_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(isccp_simulator): The number of levels in the input fields are inconsistent' - endif - endif - - ! MISR - if (Lmisr_subcolumn .or. Lmisr_column) then - if (size(cospIN%tau_067,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%sunlit) .ne. cospIN%Npoints .OR. & - size(cospgridIN%hgt_matrix,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%at,1) .ne. cospIN%Npoints) then - Lmisr_subcolumn = .false. - Lmisr_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(misr_simulator): The number of points in the input fields are inconsistent' - endif - if (size(cospIN%tau_067,2) .ne. cospIN%Ncolumns) then - Lmisr_subcolumn = .false. - Lmisr_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(misr_simulator): The number of sub-columns in the input fields are inconsistent' - endif - if (size(cospIN%tau_067,3) .ne. cospIN%Nlevels .OR. & - size(cospgridIN%hgt_matrix,2) .ne. cospIN%Nlevels .OR. & - size(cospgridIN%at,2) .ne. cospIN%Nlevels) then - Lmisr_subcolumn = .false. - Lmisr_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(misr_simulator): The number of levels in the input fields are inconsistent' - endif - endif - - ! MODIS - if (Lmodis_subcolumn .or. Lmodis_column) then - if (size(cospIN%fracLiq,1) .ne. cospIN%Npoints .OR. & - size(cospIN%tau_067,1) .ne. cospIN%Npoints .OR. & - size(cospIN%asym,1) .ne. cospIN%Npoints .OR. & - size(cospIN%ss_alb,1) .ne. cospIN%Npoints) then - Lmodis_subcolumn = .false. - Lmodis_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(modis_simulator): The number of points in the input fields are inconsistent' - endif - if (size(cospIN%fracLiq,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%tau_067,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%asym,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%ss_alb,2) .ne. cospIN%Ncolumns) then - Lmodis_subcolumn = .false. - Lmodis_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(modis_simulator): The number of sub-columns in the input fields are inconsistent' - endif - if (size(cospIN%fracLiq,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%tau_067,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%asym,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%ss_alb,3) .ne. cospIN%Nlevels) then - Lmodis_subcolumn = .false. - Lmodis_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(modis_simulator): The number of levels in the input fields are inconsistent' - endif - endif - - ! CLOUDSAT - if (Lcloudsat_subcolumn .or. Lcloudsat_column) then - if (size(cospIN%z_vol_cloudsat,1) .ne. cospIN%Npoints .OR. & - size(cospIN%kr_vol_cloudsat,1) .ne. cospIN%Npoints .OR. & - size(cospIN%g_vol_cloudsat,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%hgt_matrix,1) .ne. cospIN%Npoints) then - Lcloudsat_subcolumn = .false. - Lcloudsat_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(cloudsat_simulator): The number of points in the input fields are inconsistent' - endif - if (size(cospIN%z_vol_cloudsat,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%kr_vol_cloudsat,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%g_vol_cloudsat,2) .ne. cospIN%Ncolumns) then - Lcloudsat_subcolumn = .false. - Lcloudsat_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(cloudsat_simulator): The number of sub-columns in the input fields are inconsistent' - endif - if (size(cospIN%z_vol_cloudsat,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%kr_vol_cloudsat,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%g_vol_cloudsat,3) .ne. cospIN%Nlevels .OR. & - size(cospgridIN%hgt_matrix,2) .ne. cospIN%Nlevels) then - Lcloudsat_subcolumn = .false. - Lcloudsat_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(cloudsat_simulator): The number of levels in the input fields are inconsistent' - endif - endif - - ! GROUND LIDAR @ 532nm - if (LgrLidar532_subcolumn .or. LgrLidar532_column) then - if (size(cospIN%beta_mol_grLidar532,1) .ne. cospIN%Npoints .OR. & - size(cospIN%betatot_grLidar532,1) .ne. cospIN%Npoints .OR. & - size(cospIN%tau_mol_grLidar532,1) .ne. cospIN%Npoints .OR. & - size(cospIN%tautot_grLidar532,1) .ne. cospIN%Npoints) then - LgrLidar532_subcolumn = .false. - LgrLidar532_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(grLidar532_simulator): The number of points in the input fields are inconsistent' - endif - if (size(cospIN%betatot_grLidar532,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%tautot_grLidar532,2) .ne. cospIN%Ncolumns) then - LgrLidar532_subcolumn = .false. - LgrLidar532_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(grLidar532_simulator): The number of sub-columns in the input fields are inconsistent' - endif - if (size(cospIN%beta_mol_grLidar532,2) .ne. cospIN%Nlevels .OR. & - size(cospIN%betatot_grLidar532,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%tau_mol_grLidar532,2) .ne. cospIN%Nlevels .OR. & - size(cospIN%tautot_grLidar532,3) .ne. cospIN%Nlevels) then - LgrLidar532_subcolumn = .false. - LgrLidar532_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(grLidar532_simulator): The number of levels in the input fields are inconsistent' - endif - endif - - ! ATLID - if (Latlid_subcolumn .or. Latlid_column) then - if (size(cospIN%beta_mol_atlid,1) .ne. cospIN%Npoints .OR. & - size(cospIN%betatot_atlid,1) .ne. cospIN%Npoints .OR. & - size(cospIN%tau_mol_atlid,1) .ne. cospIN%Npoints .OR. & - size(cospIN%tautot_atlid,1) .ne. cospIN%Npoints) then - Latlid_subcolumn = .false. - Latlid_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(atlid_simulator): The number of points in the input fields are inconsistent' - endif - if (size(cospIN%betatot_atlid,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%tautot_atlid,2) .ne. cospIN%Ncolumns) then - Latlid_subcolumn = .false. - Latlid_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(atlid_simulator): The number of sub-columns in the input fields are inconsistent' - endif - if (size(cospIN%beta_mol_atlid,2) .ne. cospIN%Nlevels .OR. & - size(cospIN%betatot_atlid,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%tau_mol_atlid,2) .ne. cospIN%Nlevels .OR. & - size(cospIN%tautot_atlid,3) .ne. cospIN%Nlevels) then - Latlid_subcolumn = .false. - Latlid_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(atlid_simulator): The number of levels in the input fields are inconsistent' - endif - endif - - ! CALIPSO - if (Lcalipso_subcolumn .or. Lcalipso_column) then - if (size(cospIN%beta_mol_calipso,1) .ne. cospIN%Npoints .OR. & - size(cospIN%betatot_calipso,1) .ne. cospIN%Npoints .OR. & - size(cospIN%betatot_liq_calipso,1) .ne. cospIN%Npoints .OR. & - size(cospIN%betatot_ice_calipso,1) .ne. cospIN%Npoints .OR. & - size(cospIN%tau_mol_calipso,1) .ne. cospIN%Npoints .OR. & - size(cospIN%tautot_calipso,1) .ne. cospIN%Npoints .OR. & - size(cospIN%tautot_liq_calipso,1) .ne. cospIN%Npoints .OR. & - size(cospIN%tautot_ice_calipso,1) .ne. cospIN%Npoints) then - Lcalipso_subcolumn = .false. - Lcalipso_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(calipso_simulator): The number of points in the input fields are inconsistent' - endif - if (size(cospIN%betatot_calipso,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%betatot_liq_calipso,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%betatot_ice_calipso,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%tautot_calipso,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%tautot_liq_calipso,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%tautot_ice_calipso,2) .ne. cospIN%Ncolumns) then - Lcalipso_subcolumn = .false. - Lcalipso_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(calipso_simulator): The number of sub-columns in the input fields are inconsistent' - endif - if (size(cospIN%beta_mol_calipso,2) .ne. cospIN%Nlevels .OR. & - size(cospIN%betatot_calipso,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%betatot_liq_calipso,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%betatot_ice_calipso,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%tau_mol_calipso,2) .ne. cospIN%Nlevels .OR. & - size(cospIN%tautot_calipso,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%tautot_liq_calipso,3) .ne. cospIN%Nlevels .OR. & - size(cospIN%tautot_ice_calipso,3) .ne. cospIN%Nlevels) then - Lcalipso_subcolumn = .false. - Lcalipso_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(calipso_simulator): The number of levels in the input fields are inconsistent' - endif - endif - - ! PARASOL - if (Lparasol_subcolumn .or. Lparasol_column) then - if (size(cospIN%tautot_S_liq,1) .ne. cospIN%Npoints .OR. & - size(cospIN%tautot_S_ice,1) .ne. cospIN%Npoints) then - Lparasol_subcolumn = .false. - Lparasol_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(parasol_simulator): The number of points in the input fields are inconsistent' - endif - if (size(cospIN%tautot_S_liq,2) .ne. cospIN%Ncolumns .OR. & - size(cospIN%tautot_S_ice,2) .ne. cospIN%Ncolumns) then - Lparasol_subcolumn = .false. - Lparasol_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(parasol_simulator): The number of levels in the input fields are inconsistent' - endif - endif - - ! RTTOV - if (Lrttov_column) then - if (size(cospgridIN%pfull,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%at,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%qv,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%hgt_matrix_half,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%u_sfc) .ne. cospIN%Npoints .OR. & - size(cospgridIN%v_sfc) .ne. cospIN%Npoints .OR. & - size(cospgridIN%skt) .ne. cospIN%Npoints .OR. & - size(cospgridIN%phalf,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%cloudIce,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%cloudLiq,1) .ne. cospIN%Npoints .OR. & - size(cospgridIN%rttov_sfcmask) .ne. cospIN%Npoints .OR. & - size(cospgridIN%lon) .ne. cospIN%Npoints .OR. & - size(cospgridIN%lat) .ne. cospIN%Npoints) then - Lrttov_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(rttov_simulator): The number of points in the input fields are inconsistent' - endif - if (size(cospgridIN%pfull,2) .ne. cospIN%Nlevels .OR. & - size(cospgridIN%at,2) .ne. cospIN%Nlevels .OR. & - size(cospgridIN%qv,2) .ne. cospIN%Nlevels .OR. & - size(cospgridIN%hgt_matrix_half,2) .ne. cospIN%Nlevels .OR. & - size(cospgridIN%phalf,2) .ne. cospIN%Nlevels+1) then - Lrttov_column = .false. - nError=nError+1 - errorMessage(nError) = 'ERROR(rttov_simulator): The number of levels in the input fields are inconsistent' - endif - endif - end subroutine cosp_errorCheck - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! END MODULE - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -END MODULE MOD_COSP diff --git a/src/cosp_config.F90.bak b/src/cosp_config.F90.bak deleted file mode 100755 index d100e1f7da..0000000000 --- a/src/cosp_config.F90.bak +++ /dev/null @@ -1,500 +0,0 @@ -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -! Copyright (c) 2015, Regents of the University of Colorado -! All rights reserved. -! -! Redistribution and use in source and binary forms, with or without modification, are -! permitted provided that the following conditions are met: -! -! 1. Redistributions of source code must retain the above copyright notice, this list of -! conditions and the following disclaimer. -! -! 2. Redistributions in binary form must reproduce the above copyright notice, this list -! of conditions and the following disclaimer in the documentation and/or other -! materials provided with the distribution. -! -! 3. Neither the name of the copyright holder nor the names of its contributors may be -! used to endorse or promote products derived from this software without specific prior -! written permission. -! -! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL -! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT -! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -! -! History: -! Jul 2007 - A. Bodas-Salcedo - Initial version -! Jul 2008 - A. Bodas-Salcedo - Added definitions of ISCCP axes -! Oct 2008 - H. Chepfer - Added PARASOL_NREFL -! Jun 2010 - R. Marchand - Modified to support quickbeam V3, added ifdef for -! hydrometeor definitions -! May 2015 - D. Swales - Tidied up. Set up appropriate fields during initialization. -! June 2015- D. Swales - Moved hydrometeor class variables to hydro_class_init in -! the module quickbeam_optics. -! Mar 2016 - D. Swales - Added scops_ccfrac. Was previously hardcoded in prec_scops.f90. -! Mar 2018 - R. Guzman - Added LIDAR_NTYPE for the OPAQ diagnostics -! Apr 2018 - R. Guzman - Added parameters for GROUND LIDAR and ATLID simulators -! Nov 2018 - T. Michibata - Added CloudSat+MODIS Warmrain Diagnostics -! Mar 2024 - C. Wall - Added MODIS joint-histogram diagnostics -! -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -MODULE MOD_COSP_CONFIG - USE COSP_KINDS, ONLY: wp,dp - IMPLICIT NONE - - ! ##################################################################################### - ! Common COSP information - ! ##################################################################################### - character(len=32) :: & - COSP_VERSION ! COSP Version ID (set in cosp_interface_init) - real(wp),parameter :: & - R_UNDEF = -1.0E30, & ! Missing value - R_GROUND = -1.0E20, & ! Flag for below ground results - scops_ccfrac = 0.05 ! Fraction of column (or subcolumn) covered with convective - ! precipitation (default is 5%). *NOTE* This quantity may vary - ! between modeling centers. - logical :: & - use_vgrid ! True=Use new grid for L3 CLOUDAT and CALIPSO - integer,parameter :: & - SR_BINS = 15, & ! Number of bins (backscattering coefficient) in CALOPSO LIDAR simulator. - N_HYDRO = 9 ! Number of hydrometeor classes used by quickbeam radar simulator. - - ! #################################################################################### - ! Joint histogram bin-boundaries - ! tau is used by ISCCP and MISR - ! pres is used by ISCCP - ! hgt is used by MISR - ! ReffLiq is used by MODIS - ! ReffIce is used by MODIS - ! *NOTE* ALL JOINT-HISTOGRAM BIN BOUNDARIES ARE DECLARED AND DEFINED HERE IN - ! COSP_CONFIG, WITH THE EXCEPTION OF THE TAU AXIS USED BY THE MODIS SIMULATOR, - ! WHICH IS SET DURING INITIALIZATION IN COSP_INTERFACE_INIT. - ! #################################################################################### - ! Optical depth bin axis - integer,parameter :: & - ntau=7 - real(wp),parameter,dimension(ntau+1) :: & - tau_binBounds = (/0.0, 0.3, 1.3, 3.6, 9.4, 23., 60., 10000./) - real(wp),parameter,dimension(ntau) :: & - tau_binCenters = (/0.15, 0.80, 2.45, 6.5, 16.2, 41.5, 100.0/) - real(wp),parameter,dimension(2,ntau) :: & - tau_binEdges = reshape(source=(/0.0, 0.3, 0.3, 1.3, 1.3, 3.6, 3.6, & - 9.4, 9.4, 23.0, 23.0, 60.0, 60.0, 100000.0/), & - shape=(/2,ntau/)) - - ! Optical depth bin axes (ONLY USED BY MODIS SIMULATOR IN v1.4) - integer :: l,k - integer,parameter :: & - ntauV1p4 = 6 - real(wp),parameter,dimension(ntauV1p4+1) :: & - tau_binBoundsV1p4 = (/0.3, 1.3, 3.6, 9.4, 23., 60., 10000./) - real(wp),parameter,dimension(2,ntauV1p4) :: & - tau_binEdgesV1p4 = reshape(source =(/tau_binBoundsV1p4(1),((tau_binBoundsV1p4(k),l=1,2), & - k=2,ntauV1p4),100000._wp/),shape = (/2,ntauV1p4/)) - real(wp),parameter,dimension(ntauV1p4) :: & - tau_binCentersV1p4 = (tau_binEdgesV1p4(1,:)+tau_binEdgesV1p4(2,:))/2._wp - - ! Cloud-top height pressure bin axis - integer,parameter :: & - npres = 7 - real(wp),parameter,dimension(npres+1) :: & - pres_binBounds = (/0., 180., 310., 440., 560., 680., 800., 10000./) - real(wp),parameter,dimension(npres) :: & - pres_binCenters = (/90000., 74000., 62000., 50000., 37500., 24500., 9000./) - real(wp),parameter,dimension(2,npres) :: & - pres_binEdges = reshape(source=(/100000.0, 80000.0, 80000.0, 68000.0, 68000.0, & - 56000.0, 56000.0, 44000.0, 44000.0, 31000.0, & - 31000.0, 18000.0, 18000.0, 0.0/), & - shape=(/2,npres/)) - - ! Cloud-top height bin axis #1 - integer,parameter :: & - nhgt = 16 - real(wp),parameter,dimension(nhgt+1) :: & - hgt_binBounds = (/-.99,0.,0.5,1.,1.5,2.,2.5,3.,4.,5.,7.,9.,11.,13.,15.,17.,99./) - real(wp),parameter,dimension(nhgt) :: & - hgt_binCenters = 1000*(/0.,0.25,0.75,1.25,1.75,2.25,2.75,3.5,4.5,6.,8.,10.,12., & - 14.5,16.,18./) - real(wp),parameter,dimension(2,nhgt) :: & - hgt_binEdges = 1000.0*reshape(source=(/-99.0, 0.0, 0.0, 0.5, 0.5, 1.0, 1.0, 1.5, & - 1.5, 2.0, 2.0, 2.5, 2.5, 3.0, 3.0, 4.0, & - 4.0, 5.0, 5.0, 7.0, 7.0, 9.0, 9.0,11.0, & - 11.0,13.0,13.0,15.0,15.0,17.0,17.0,99.0/),& - shape=(/2,nhgt/)) - - ! Liquid and Ice particle bins for MODIS joint histogram of optical-depth and particle - ! size - ! Bin edges match Pincus et al. 2023 observational data (doi:10.5194/essd-15-2483-2023) - ! Additional Re bins to capture all simulated clouds - integer :: i,j - integer,parameter :: & - nReffLiq = 8, & ! Number of ReffLiq bins for tau/ReffLiq and LWP/ReffLiq joint-histogram - nReffIce = 8 ! Number of ReffIce bins for tau/ReffICE and IWP/ReffIce joint-histogram - real(wp),parameter,dimension(nReffLiq+1) :: & - reffLIQ_binBounds = (/0.0, 4.0e-6, 8e-6, 1.0e-5, 1.25e-5, 1.5e-5, 2.0e-5, 3.0e-5, 1.0e-2/) - real(wp),parameter,dimension(nReffIce+1) :: & - reffICE_binBounds = (/0.0,5.0e-6, 1.0e-5, 2.0e-5, 3.0e-5, 4.0e-5, 5.0e-5, 6.0e-5, 1.0e-2/) - real(wp),parameter,dimension(2,nReffICE) :: & - reffICE_binEdges = reshape(source=(/reffICE_binBounds(1),((reffICE_binBounds(k), & - l=1,2),k=2,nReffICE),reffICE_binBounds(nReffICE+1)/), & - shape = (/2,nReffICE/)) - real(wp),parameter,dimension(2,nReffLIQ) :: & - reffLIQ_binEdges = reshape(source=(/reffLIQ_binBounds(1),((reffLIQ_binBounds(k), & - l=1,2),k=2,nReffLIQ),reffLIQ_binBounds(nReffLIQ+1)/), & - shape = (/2,nReffLIQ/)) - real(wp),parameter,dimension(nReffICE) :: & - reffICE_binCenters = (reffICE_binEdges(1,:)+reffICE_binEdges(2,:))/2._wp - real(wp),parameter,dimension(nReffLIQ) :: & - reffLIQ_binCenters = (reffLIQ_binEdges(1,:)+reffLIQ_binEdges(2,:))/2._wp - - ! LWP and IWP bins for MODIS joint histogram of (1) LWP and droplet size - ! and (2) IWP and particle size - integer, parameter :: & - nLWP = 7, & ! Number of bins for LWP/ReffLiq joint-histogram - nIWP = 7 ! Number of bins for IWP/ReffIce joint-histogram - real(wp),parameter,dimension(nLWP+1) :: & - LWP_binBounds = (/0., 0.01, 0.03, 0.06, 0.10, 0.15, 0.25, 20.0/) ! kg/m2 - real(wp),parameter,dimension(nIWP+1) :: & - IWP_binBounds = (/0., 0.02, 0.05, 0.10, 0.20, 0.40, 1.00, 20.0/) ! kg/m2 - real(wp),parameter,dimension(2,nLWP) :: & - LWP_binEdges = reshape(source=(/LWP_binBounds(1),((LWP_binBounds(k), & - l=1,2),k=2,nLWP),LWP_binBounds(nLWP+1)/), & - shape = (/2,nLWP/)) - real(wp),parameter,dimension(2,nIWP) :: & - IWP_binEdges = reshape(source=(/IWP_binBounds(1),((IWP_binBounds(k), & - l=1,2),k=2,nIWP),IWP_binBounds(nIWP+1)/), & - shape = (/2,nIWP/)) - real(wp),parameter,dimension(nLWP) :: & - LWP_binCenters = (LWP_binEdges(1,:)+LWP_binEdges(2,:))/2._wp - real(wp),parameter,dimension(nIWP) :: & - IWP_binCenters = (IWP_binEdges(1,:)+IWP_binEdges(2,:))/2._wp - ! #################################################################################### - ! Constants used by RTTOV. - ! #################################################################################### - ! None - ! #################################################################################### - ! Constants used by the PARASOL simulator. - ! #################################################################################### - integer,parameter :: & - PARASOL_NREFL = 5, & ! Number of angles in LUT - PARASOL_NTAU = 7 ! Number of optical depths in LUT - real(wp),parameter,dimension(PARASOL_NREFL) :: & - PARASOL_SZA = (/0.0, 20.0, 40.0, 60.0, 80.0/) - REAL(WP),parameter,dimension(PARASOL_NTAU) :: & - PARASOL_TAU = (/0., 1., 5., 10., 20., 50., 100./) - - ! LUTs - REAL(WP),parameter,dimension(PARASOL_NREFL,PARASOL_NTAU) :: & - ! LUT for liquid particles - rlumA = reshape(source=(/ 0.03, 0.03, 0.03, 0.03, 0.03, & - 0.090886, 0.072185, 0.058410, 0.052498, 0.034730, & - 0.283965, 0.252596, 0.224707, 0.175844, 0.064488, & - 0.480587, 0.436401, 0.367451, 0.252916, 0.081667, & - 0.695235, 0.631352, 0.509180, 0.326551, 0.098215, & - 0.908229, 0.823924, 0.648152, 0.398581, 0.114411, & - 1.0, 0.909013, 0.709554, 0.430405, 0.121567/), & - shape=(/PARASOL_NREFL,PARASOL_NTAU/)), & - ! LUT for ice particles - rlumB = reshape(source=(/ 0.03, 0.03, 0.03, 0.03, 0.03, & - 0.092170, 0.087082, 0.083325, 0.084935, 0.054157, & - 0.311941, 0.304293, 0.285193, 0.233450, 0.089911, & - 0.511298, 0.490879, 0.430266, 0.312280, 0.107854, & - 0.712079, 0.673565, 0.563747, 0.382376, 0.124127, & - 0.898243, 0.842026, 0.685773, 0.446371, 0.139004, & - 0.976646, 0.912966, 0.737154, 0.473317, 0.145269/), & - shape=(/PARASOL_NREFL,PARASOL_NTAU/)) - - ! #################################################################################### - ! ISCCP simulator tau/CTP joint histogram information - ! #################################################################################### - integer,parameter :: & - numISCCPTauBins = ntau, & ! Number of optical depth bins - numISCCPPresBins = npres ! Number of pressure bins - real(wp),parameter,dimension(ntau+1) :: & - isccp_histTau = tau_binBounds ! Joint-histogram boundaries (optical depth) - real(wp),parameter,dimension(npres+1) :: & - isccp_histPres = pres_binBounds ! Joint-histogram boundaries (cloud pressure) - real(wp),parameter,dimension(ntau) :: & - isccp_histTauCenters = tau_binCenters ! Joint histogram bin centers (optical depth) - real(wp),parameter,dimension(npres) :: & - isccp_histPresCenters = pres_binCenters ! Joint histogram bin centers (cloud pressure) - real(wp),parameter,dimension(2,ntau) :: & - isccp_histTauEdges = tau_binEdges ! Joint histogram bin edges (optical depth) - real(wp),parameter,dimension(2,npres) :: & - isccp_histPresEdges = pres_binEdges ! Joint histogram bin edges (cloud pressure) - - ! #################################################################################### - ! MISR simulator tau/CTH joint histogram information - ! #################################################################################### - integer,parameter :: & - numMISRHgtBins = nhgt, & ! Number of cloud-top height bins - numMISRTauBins = ntau ! Number of optical depth bins - ! Joint histogram boundaries - real(wp),parameter,dimension(numMISRHgtBins+1) :: & - misr_histHgt = hgt_binBounds ! Joint-histogram boundaries (cloud height) - real(wp),parameter,dimension(numMISRTauBins+1) :: & - misr_histTau = tau_binBounds ! Joint-histogram boundaries (optical-depth) - real(wp),parameter,dimension(numMISRHgtBins) :: & - misr_histHgtCenters = hgt_binCenters ! Joint-histogram bin centers (cloud height) - real(wp),parameter,dimension(2,numMISRHgtBins) :: & - misr_histHgtEdges = hgt_BinEdges ! Joint-histogram bin edges (cloud height) - - ! #################################################################################### - ! MODIS simulator tau/CTP joint histogram information - ! #################################################################################### - integer,parameter :: & - numMODISPresBins = npres ! Number of pressure bins for joint-histogram - real(wp),parameter,dimension(numMODISPresBins + 1) :: & - modis_histPres = 100*pres_binBounds ! Joint-histogram boundaries (cloud pressure) - real(wp),parameter,dimension(2, numMODISPresBins) :: & - modis_histPresEdges = 100*pres_binEdges ! Joint-histogram bin edges (cloud pressure) - real(wp),parameter,dimension(numMODISPresBins) :: & - modis_histPresCenters = 100*pres_binCenters ! Joint-histogram bin centers (cloud pressure) - - ! For the MODIS simulator we want to preserve the ability for cospV1.4.0 to use the - ! old histogram bin boundaries for optical depth, so these are set up in initialization. - integer :: & - numMODISTauBins ! Number of tau bins for joint-histogram - real(wp),allocatable,dimension(:) :: & - modis_histTau ! Joint-histogram boundaries (optical depth) - real(wp),allocatable,dimension(:,:) :: & - modis_histTauEdges ! Joint-histogram bin edges (optical depth) - real(wp),allocatable,dimension(:) :: & - modis_histTauCenters ! Joint-histogram bin centers (optical depth) - - ! #################################################################################### - ! MODIS simulator tau/ReffICE and tau/ReffLIQ joint-histogram information - ! #################################################################################### - ! Ice - integer,parameter :: & - numMODISReffIceBins = nReffIce ! Number of bins for joint-histogram - real(wp),parameter,dimension(nReffIce+1) :: & - modis_histReffIce = reffICE_binBounds ! Effective radius bin boundaries - real(wp),parameter,dimension(nReffIce) :: & - modis_histReffIceCenters = reffICE_binCenters ! Effective radius bin centers - real(wp),parameter,dimension(2,nReffICE) :: & - modis_histReffIceEdges = reffICE_binEdges ! Effective radius bin edges - - ! Liquid - integer,parameter :: & - numMODISReffLiqBins = nReffLiq ! Number of bins for joint-histogram - real(wp),parameter,dimension(nReffLiq+1) :: & - modis_histReffLiq = reffLIQ_binBounds ! Effective radius bin boundaries - real(wp),parameter,dimension(nReffLiq) :: & - modis_histReffLiqCenters = reffLIQ_binCenters ! Effective radius bin centers - real(wp),parameter,dimension(2,nReffLiq) :: & - modis_histReffLiqEdges = reffLIQ_binEdges ! Effective radius bin edges - ! #################################################################################### - ! MODIS simulator LWP/ReffLIQ and IWP/ReffIce joint-histogram information - ! #################################################################################### - ! Liquid - integer,parameter :: & - numMODISLWPBins = nLWP ! Number of bins for joint-histogram - real(wp),parameter,dimension(nLWP+1) :: & - modis_histLWP = LWP_binBounds ! LWP bin boundaries - real(wp),parameter,dimension(nLWP) :: & - modis_histLWPCenters = LWP_binCenters ! LWP bin centers - real(wp),parameter,dimension(2,nLWP) :: & - modis_histLWPEdges = LWP_binEdges ! LWP bin edges - - ! Ice - integer,parameter :: & - numMODISIWPBins = nIWP ! Number of bins for joint-histogram - real(wp),parameter,dimension(nIWP+1) :: & - modis_histIWP = IWP_binBounds ! IWP bin boundaries - real(wp),parameter,dimension(nIWP) :: & - modis_histIWPCenters = IWP_binCenters ! IWP bin centers - real(wp),parameter,dimension(2,nIWP) :: & - modis_histIWPEdges = IWP_binEdges ! IWP bin edges - - ! #################################################################################### - ! CLOUDSAT reflectivity histogram information - ! #################################################################################### - integer,parameter :: & - CLOUDSAT_DBZE_BINS = 15, & ! Number of dBZe bins in histogram (cfad) - CLOUDSAT_DBZE_MIN = -100, & ! Minimum value for radar reflectivity - CLOUDSAT_DBZE_MAX = 80, & ! Maximum value for radar reflectivity - CLOUDSAT_CFAD_ZE_MIN = -50, & ! Lower value of the first CFAD Ze bin - CLOUDSAT_CFAD_ZE_WIDTH = 5 ! Bin width (dBZe) - - real(wp),parameter,dimension(CLOUDSAT_DBZE_BINS+1) :: & - cloudsat_histRef = (/CLOUDSAT_DBZE_MIN,(/(i, i=int(CLOUDSAT_CFAD_ZE_MIN+CLOUDSAT_CFAD_ZE_WIDTH),& - int(CLOUDSAT_CFAD_ZE_MIN+(CLOUDSAT_DBZE_BINS-1)*CLOUDSAT_CFAD_ZE_WIDTH), & - int(CLOUDSAT_CFAD_ZE_WIDTH))/),CLOUDSAT_DBZE_MAX/) - real(wp),parameter,dimension(2,CLOUDSAT_DBZE_BINS) :: & - cloudsat_binEdges = reshape(source=(/cloudsat_histRef(1),((cloudsat_histRef(k), & - l=1,2),k=2,CLOUDSAT_DBZE_BINS),cloudsat_histRef(CLOUDSAT_DBZE_BINS+1)/),& - shape = (/2,CLOUDSAT_DBZE_BINS/)) - real(wp),parameter,dimension(CLOUDSAT_DBZE_BINS) :: & - cloudsat_binCenters = (cloudsat_binEdges(1,:)+cloudsat_binEdges(2,:))/2._wp - - ! Parameters for Cloudsat near-surface precipitation diagnostics. - ! Precipitation classes. - integer, parameter :: & - nCloudsatPrecipClass = 10 - integer, parameter :: & - pClass_noPrecip = 0, & ! No precipitation - pClass_Rain1 = 1, & ! Rain possible - pClass_Rain2 = 2, & ! Rain probable - pClass_Rain3 = 3, & ! Rain certain - pClass_Snow1 = 4, & ! Snow possible - pClass_Snow2 = 5, & ! Snow certain - pClass_Mixed1 = 6, & ! Mixed-precipitation possible - pClass_Mixed2 = 7, & ! Mixed-precipitation certain - pClass_Rain4 = 8, & ! Heavy rain - pClass_default = 9 ! Default - ! Reflectivity bin boundaries, used by decision tree to classify precipitation type. - real(wp), dimension(4),parameter :: & - Zenonbinval =(/0._wp, -5._wp, -7.5_wp, -15._wp/) - real(wp), dimension(6),parameter :: & - Zbinvallnd = (/10._wp, 5._wp, 2.5_wp, -2.5_wp, -5._wp, -15._wp/) - ! Vertical level index(Nlvgrid) for Cloudsat precipitation occurence/frequency diagnostics. - ! Level 39 of Nlvgrid(40) is 480-960m. - integer, parameter :: & - cloudsat_preclvl = 39 - - ! #################################################################################### - ! CLOUDSAT and MODIS joint product information (2018.11.22) - ! #################################################################################### - ! @ COSP_DIAG_WARMRAIN: - integer, parameter :: CFODD_NCLASS = 3 ! # of classes for CFODD (classified by MODIS Reff) - integer, parameter :: WR_NREGIME = 3 ! # of warm-rain regimes (non-precip/drizzling/raining) - integer, parameter :: SGCLD_CLR = 0 ! sub-grid cloud ID (fracout): clear-sky - integer, parameter :: SGCLD_ST = 1 ! sub-grid cloud ID (fracout): stratiform - integer, parameter :: SGCLD_CUM = 2 ! sub-grid cloud ID (fracout): cumulus - real(wp),parameter :: CWP_THRESHOLD = 0.00 ! cloud water path threshold - real(wp),parameter :: COT_THRESHOLD = 0.30 ! cloud optical thickness threshold - real(wp),parameter,dimension(CFODD_NCLASS+1) :: & - CFODD_BNDRE = (/5.0e-6, 12.0e-6, 18.0e-6, 35.0e-6/) ! Reff bnds - real(wp),parameter,dimension(2) :: & - CFODD_BNDZE = (/-15.0, 0.0/) ! dBZe bnds (cloud/drizzle/precip) - real(wp),parameter :: CFODD_DBZE_MIN = -30.0 ! Minimum value of CFODD dBZe bin - real(wp),parameter :: CFODD_DBZE_MAX = 20.0 ! Maximum value of CFODD dBZe bin - real(wp),parameter :: CFODD_ICOD_MIN = 0.0 ! Minimum value of CFODD ICOD bin - real(wp),parameter :: CFODD_ICOD_MAX = 60.0 ! Maximum value of CFODD ICOD bin - real(wp),parameter :: CFODD_DBZE_WIDTH = 2.0 ! Bin width (dBZe) - real(wp),parameter :: CFODD_ICOD_WIDTH = 2.0 ! Bin width (ICOD) - integer,parameter :: & - CFODD_NDBZE = INT( (CFODD_DBZE_MAX-CFODD_DBZE_MIN)/CFODD_DBZE_WIDTH ) ! Number of CFODD dBZe bins - integer,parameter :: & - CFODD_NICOD = INT( (CFODD_ICOD_MAX-CFODD_ICOD_MIN)/CFODD_ICOD_WIDTH ) ! Number of CFODD ICOD bins - real(wp),parameter,dimension(CFODD_NDBZE+1) :: & - CFODD_HISTDBZE = (/int(CFODD_DBZE_MIN),(/(i, i=int(CFODD_DBZE_MIN+CFODD_DBZE_WIDTH), & - int(CFODD_DBZE_MIN+(CFODD_NDBZE-1)*CFODD_DBZE_WIDTH), & - int(CFODD_DBZE_WIDTH))/),int(CFODD_DBZE_MAX)/) - real(wp),parameter,dimension(CFODD_NICOD+1) :: & - CFODD_HISTICOD = (/int(CFODD_ICOD_MIN),(/(i, i=int(CFODD_ICOD_MIN+CFODD_ICOD_WIDTH), & - int(CFODD_ICOD_MIN+(CFODD_NICOD-1)*CFODD_ICOD_WIDTH), & - int(CFODD_ICOD_WIDTH))/),int(CFODD_ICOD_MAX)/) - real(wp),parameter,dimension(2,CFODD_NDBZE) :: & - CFODD_HISTDBZEedges = reshape(source=(/CFODD_HISTDBZE(1),((CFODD_HISTDBZE(k), & - l=1,2),k=2,CFODD_NDBZE),CFODD_HISTDBZE(CFODD_NDBZE+1)/), & - shape = (/2,CFODD_NDBZE/)) - real(wp),parameter,dimension(CFODD_NDBZE) :: & - CFODD_HISTDBZEcenters = (CFODD_HISTDBZEedges(1,:)+CFODD_HISTDBZEedges(2,:))/2._wp - real(wp),parameter,dimension(2,CFODD_NICOD) :: & - CFODD_HISTICODedges = reshape(source=(/CFODD_HISTICOD(1),((CFODD_HISTICOD(k), & - l=1,2),k=2,CFODD_NICOD),CFODD_HISTICOD(CFODD_NICOD+1)/), & - shape = (/2,CFODD_NICOD/)) - real(wp),parameter,dimension(CFODD_NICOD) :: & - CFODD_HISTICODcenters = (CFODD_HISTICODedges(1,:)+CFODD_HISTICODedges(2,:))/2._wp - - ! #################################################################################### - ! Parameters used by the CALIPSO LIDAR simulator - ! #################################################################################### - ! CALISPO backscatter histogram bins - real(wp),parameter :: & - S_cld = 5.0, & ! Threshold for cloud detection - S_att = 0.01, & ! - S_cld_att = 30. ! Threshold for undefined cloud phase detection - real(wp),parameter,dimension(SR_BINS+1) :: & - calipso_histBsct = (/-1.,0.01,1.2,3.0,5.0,7.0,10.0,15.0,20.0,25.0,30.0,40.0,50.0, & - 60.0,80.0,999./) ! Backscatter histogram bins - real(wp),parameter,dimension(2,SR_BINS) :: & - calipso_binEdges = reshape(source=(/calipso_histBsct(1),((calipso_histBsct(k), & - l=1,2),k=2,SR_BINS),calipso_histBsct(SR_BINS+1)/), & - shape = (/2,SR_BINS/)) - real(wp),parameter,dimension(SR_BINS) :: & - calipso_binCenters = (calipso_binEdges(1,:)+calipso_binEdges(2,:))/2._wp - - integer,parameter :: & - LIDAR_NTEMP = 40, & - LIDAR_NCAT = 4, & ! Number of categories for cloudtop heights (high/mid/low/tot) - LIDAR_NTYPE = 3 ! Number of categories for OPAQ (opaque/thin cloud + z_opaque) - real(wp),parameter,dimension(LIDAR_NTEMP) :: & - LIDAR_PHASE_TEMP= & - (/-91.5,-88.5,-85.5,-82.5,-79.5,-76.5,-73.5,-70.5,-67.5,-64.5, & - -61.5,-58.5,-55.5,-52.5,-49.5,-46.5,-43.5,-40.5,-37.5,-34.5, & - -31.5,-28.5,-25.5,-22.5,-19.5,-16.5,-13.5,-10.5, -7.5, -4.5, & - -1.5, 1.5, 4.5, 7.5, 10.5, 13.5, 16.5, 19.5, 22.5, 25.5/) - real(wp),parameter,dimension(2,LIDAR_NTEMP) :: & - LIDAR_PHASE_TEMP_BNDS=reshape(source= & - (/-273.15, -90., -90., -87., -87., -84., -84., -81., -81., -78., & - -78., -75., -75., -72., -72., -69., -69., -66., -66., -63., & - -63., -60., -60., -57., -57., -54., -54., -51., -51., -48., & - -48., -45., -45., -42., -42., -39., -39., -36., -36., -33., & - -33., -30., -30., -27., -27., -24., -24., -21., -21., -18., & - -18., -15., -15., -12., -12., -9., -9., -6., -6., -3., & - -3., 0., 0., 3., 3., 6., 6., 9., 9., 12., & - 12., 15., 15., 18., 18., 21., 21., 24., 24., 100. /), & - shape=(/2,40/)) - - ! #################################################################################### - ! Parameters used by the GROUND LIDAR simulator - ! #################################################################################### - ! GROUND LIDAR backscatter histogram bins -! real(wp),parameter :: & -! S_cld = 5.0, & ! Threshold for cloud detection -! S_att = 0.01, & ! -! S_cld_att = 30. ! Threshold for undefined cloud phase detection - real(wp),parameter,dimension(SR_BINS+1) :: & - grLidar532_histBsct = (/-1.,0.01,1.2,3.0,5.0,7.0,10.0,15.0,20.0,25.0,30.0,40.0,50.0, & - 60.0,80.0,999./) ! Backscatter histogram bins - real(wp),parameter,dimension(2,SR_BINS) :: & - grLidar532_binEdges = reshape(source=(/grLidar532_histBsct(1),((grLidar532_histBsct(k), & - l=1,2),k=2,SR_BINS),grLidar532_histBsct(SR_BINS+1)/), & - shape = (/2,SR_BINS/)) - real(wp),parameter,dimension(SR_BINS) :: & - grLidar532_binCenters = (grLidar532_binEdges(1,:)+grLidar532_binEdges(2,:))/2._wp - -! integer,parameter :: & -! LIDAR_NCAT = 4 ! Number of categories for cloudtop heights (high/mid/low/tot) - - ! #################################################################################### - ! Parameters used by the ATLID LIDAR simulator - ! #################################################################################### - ! ATLID LIDAR backscatter histogram bins - real(wp),parameter :: & - S_cld_atlid = 1.74, & ! Threshold for cloud detection - S_att_atlid = 0.01, & ! - S_cld_att_atlid = 6.67 ! Threshold for undefined cloud phase detection - real(wp),parameter,dimension(SR_BINS+1) :: & - atlid_histBsct = (/-1.,0.01,1.03,1.38,1.74,2.07,2.62,3.65,4.63,5.63,6.67,8.8,11.25, & - 13.2,17.2,999./) ! Backscatter histogram bins - real(wp),parameter,dimension(2,SR_BINS) :: & - atlid_binEdges = reshape(source=(/atlid_histBsct(1),((atlid_histBsct(k), & - l=1,2),k=2,SR_BINS),atlid_histBsct(SR_BINS+1)/), & - shape = (/2,SR_BINS/)) - real(wp),parameter,dimension(SR_BINS) :: & - atlid_binCenters = (atlid_binEdges(1,:)+atlid_binEdges(2,:))/2._wp - -! integer,parameter :: & -! LIDAR_NCAT = 4 ! Number of categories for cloudtop heights (high/mid/low/tot) - - ! #################################################################################### - ! New vertical grid used by CALIPSO and CLOUDSAT L3 (set up during initialization) - ! #################################################################################### - integer :: & - Nlvgrid ! Number of levels in New grid - real(wp),dimension(:),allocatable :: & - vgrid_zl, & ! New grid bottoms - vgrid_zu, & ! New grid tops - vgrid_z, & ! New grid center - dz ! dZ - -END MODULE MOD_COSP_CONFIG diff --git a/src/cosp_stats.F90.bak b/src/cosp_stats.F90.bak deleted file mode 100755 index 4619bca2ba..0000000000 --- a/src/cosp_stats.F90.bak +++ /dev/null @@ -1,781 +0,0 @@ -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -! Copyright (c) 2015, Regents of the University of Colorado -! All rights reserved. -! -! Redistribution and use in source and binary forms, with or without modification, are -! permitted provided that the following conditions are met: -! -! 1. Redistributions of source code must retain the above copyright notice, this list of -! conditions and the following disclaimer. -! -! 2. Redistributions in binary form must reproduce the above copyright notice, this list -! of conditions and the following disclaimer in the documentation and/or other -! materials provided with the distribution. -! -! 3. Neither the name of the copyright holder nor the names of its contributors may be -! used to endorse or promote products derived from this software without specific prior -! written permission. -! -! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL -! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT -! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -! -! History: -! Jul 2007 - A. Bodas-Salcedo - Initial version -! Jul 2008 - A. Bodas-Salcedo - Added capability of producing outputs in standard grid -! Oct 2008 - J.-L. Dufresne - Bug fixed. Assignment of Npoints,Nlevels,Nhydro,Ncolumns -! in COSP_STATS -! Oct 2008 - H. Chepfer - Added PARASOL reflectance arguments -! Jun 2010 - T. Yokohata, T. Nishimura and K. Ogochi - Added NEC SXs optimisations -! Jan 2013 - G. Cesana - Added betaperp and temperature arguments -! - Added phase 3D/3Dtemperature/Map output variables in diag_lidar -! May 2015 - D. Swales - Modified for cosp2.0 -! Nov 2018 - T. Michibata - Added CloudSat+MODIS Warmrain Diagnostics -! Jun 2025 - J.K. Shaw. - Added COSP-RTTOV integration and swathing -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -MODULE MOD_COSP_STATS - USE COSP_KINDS, ONLY: wp - USE MOD_COSP_CONFIG, & - ONLY: R_UNDEF, R_GROUND, & - SGCLD_CLR, SGCLD_ST, & - SGCLD_CUM, & - CWP_THRESHOLD, COT_THRESHOLD, & - CFODD_NDBZE, CFODD_NICOD, & - CFODD_BNDRE, CFODD_BNDZE, & - CFODD_NCLASS, & - CFODD_DBZE_MIN, CFODD_DBZE_MAX, & - CFODD_ICOD_MIN, CFODD_ICOD_MAX, & - CFODD_DBZE_WIDTH, CFODD_ICOD_WIDTH, & - CFODD_HISTDBZE, CFODD_HISTICOD, & - WR_NREGIME, VGRID_ZU, & - VGRID_ZL, VGRID_Z, & - DZ - USE COSP_PHYS_CONSTANTS, ONLY: tmelt, radius_earth - USE COSP_MATH_CONSTANTS, ONLY: pi - USE MOD_COSP_RTTOV_UTIL, ONLY: rttov_cfg - IMPLICIT NONE - - ! ###################################################################################### - ! Quickbeam parameters - integer,parameter :: & - maxhclass = 20, & ! Qucikbeam maximum number of hydrometeor classes. - nRe_types = 550, & ! Quickbeam maximum number or Re size bins allowed in N and Z_scaled look up table. - nd = 85, & ! Qucikbeam number of discrete particles used in construction DSDs. - mt_ntt = 39, & ! Quickbeam number of temperatures in mie LUT. - Re_BIN_LENGTH = 10, & ! Quickbeam minimum Re interval in scale LUTs - Re_MAX_BIN = 250 ! Quickbeam maximum Re interval in scale LUTs - real(wp),parameter :: & - dmin = 0.1, & ! Quickbeam minimum size of discrete particle - dmax = 10000. ! Quickbeam maximum size of discrete particle - - ! ###################################################################################### - ! TYPE cosp_column_inputs - ! ###################################################################################### - type cosp_column_inputs - integer :: & - Npoints, & ! Number of gridpoints. - Ncolumns, & ! Number of columns. - Nlevels ! Number of levels. - - integer,allocatable,dimension(:) :: & - sunlit ! Sunlit flag (0-1) - - real(wp),allocatable,dimension(:,:) :: & - at, & ! Temperature (K) - pfull, & ! Pressure (Pa) - phalf, & ! Pressure at half-levels (Pa) - qv, & ! Specific humidity (kg/kg) - co2, & ! CO2 (kg/kg) - ch4, & ! Methane (kg/kg) - n2o, & ! N2O (kg/kg) - co, & ! CO (kg/kg) - so2, & ! SO2 (kg/kg) - hgt_matrix, & ! Height of atmosphere layer (km) - hgt_matrix_half ! Height of bottom interface of atm layer(km) - ! First level contains the bottom of the top layer. - ! Last level contains the bottom of the surface layer. - - real(wp),allocatable,dimension(:) :: & - land, & ! Land/Sea mask (0 for ocean, 1 for land) - skt, & ! Surface temperature (K) - surfelev ! Surface Elevation (m) - ! Fields used ONLY by RTTOV - real(wp),allocatable,dimension(:) :: & - u_sfc, & ! Surface u-wind (m/s) - v_sfc, & ! Surface v-wind (m/s) - t2m, & ! 2-meter temperature (K) - q2m, & ! 2-meter specific humidity (kg/kg) - lat, & ! Latitude (deg) - lon, & ! Longitude (deg) - sza, & ! Solar Zenith Angle in degrees - psfc, & ! Surface pressure (Pa) - rttov_sfcmask ! Mask for RTTOV surface types (0 for ocean, 1 for land, 2 for sea ice) - - real(wp),allocatable,dimension(:,:) :: & - o3, & ! Ozone (kg/kg) - tca, & ! Total layer cloud fraction (0-1) - cloudIce, & ! Cloud ice water mixing ratio (kg/kg) - cloudLiq, & ! Cloud liquid water mixing ratio (kg/kg) - DeffLiq, & ! Cloud liquid effective diameter (um) - DeffIce, & ! Cloud ice effective diameter (um) - rttov_date, & ! Date of the profile as year (e.g. 2013), month (1-12), and day (1-31) - rttov_time, & ! Time of profile as hour, minute, second. - emis_in, & ! Surface emissivity (point,channel) (1) - refl_in, & ! Surface reflectance (point,channel) (1) - fl_rain, & ! Precipitation (rain) flux (kg/m2/s) - fl_snow ! Precipitation (snow) flux (kg/m2/s) - end type cosp_column_inputs - - - ! ###################################################################################### - ! TYPE swath_inputs - ! ###################################################################################### - type swath_inputs - - integer :: & - N_inst_swaths = 0 - real(wp),dimension(20) :: & - inst_localtimes, & - inst_localtime_widths - - end type swath_inputs - - type radar_cfg - ! Radar properties - real(wp) :: freq,k2 - integer :: nhclass ! Number of hydrometeor classes in use - integer :: use_gas_abs, do_ray - logical :: radar_at_layer_one ! If true radar is assume to be at the edge - ! of the first layer, if the first layer is the - ! surface than a ground-based radar. If the - ! first layer is the top-of-atmosphere, then - ! a space borne radar. - - ! Variables used to store Z scale factors - character(len=240) :: scale_LUT_file_name - logical :: load_scale_LUTs, update_scale_LUTs - logical, dimension(maxhclass,nRe_types) :: N_scale_flag - logical, dimension(maxhclass,mt_ntt,nRe_types) :: Z_scale_flag,Z_scale_added_flag - real(wp),dimension(maxhclass,mt_ntt,nRe_types) :: Ze_scaled,Zr_scaled,kr_scaled - real(wp),dimension(maxhclass,nd,nRe_types) :: fc, rho_eff - real(wp),dimension(Re_MAX_BIN) :: base_list,step_list - - end type radar_cfg - - ! ###################################################################################### - ! TYPE cosp_optical_inputs - ! ###################################################################################### - type cosp_optical_inputs - integer :: & - Npoints, & ! Number of gridpoints. - Ncolumns, & ! Number of columns. - Nlevels, & ! Number of levels. - Npart, & ! Number of cloud meteors for LIDAR simulators. - Nrefl, & ! Number of reflectances for PARASOL simulator - Ninst_rttov ! Number of RTTOV instruments - real(wp),pointer :: & - emis_grey => null() ! Greybody (spectrally flat) emissivity value for RTTOV - real(wp) :: & - emsfc_lw ! Surface emissivity @ 11micron - real(wp),allocatable,dimension(:,:,:) :: & - frac_out, & ! Cloud fraction - tau_067, & ! Optical depth @ 0.67micron - emiss_11, & ! Emissivity @ 11 micron - fracLiq, & ! Fraction of optical-depth due to liquid (MODIS) - asym, & ! Assymetry parameter @ 3.7micron (MODIS) - ss_alb, & ! Single-scattering albedo @ 3.7micron (MODIS) - betatot_calipso, & ! Lidar backscatter coefficient (calipso @ 532nm) - betatot_grLidar532, & ! Lidar backscatter coefficient (ground-lidar @ 532nm) - betatot_atlid, & ! Lidar backscatter coefficient (atlid @ 355nm) - betatot_ice_calipso, & ! Lidar backscatter coefficient ICE (calipso @ 532nm) - betatot_liq_calipso, & ! Lidar backscatter coefficient LIQUID (calipso @ 532nm) - tautot_calipso, & ! Lidar Optical thickness (calipso @ 532nm) - tautot_grLidar532, & ! Lidar Optical thickness (ground-lidar @ 532nm) - tautot_atlid, & ! Lidar Optical thickness (atlid @ 355nm) - tautot_ice_calipso, & ! Lidar Ice Optical thickness (calipso @ 532nm) - tautot_liq_calipso, & ! Lidar Liquid Optical thickness (calipso @ 532nm) - z_vol_cloudsat, & ! Effective reflectivity factor (mm^6/m^3) - kr_vol_cloudsat, & ! Attenuation coefficient hydro (dB/km) - g_vol_cloudsat ! Attenuation coefficient gases (dB/km) - real(wp),allocatable,dimension(:,:) :: & - beta_mol_calipso, & ! Lidar molecular backscatter coefficient (calipso @ 532nm) - beta_mol_grLidar532, & ! Lidar molecular backscatter coefficient (ground-lidar @ 532nm) - beta_mol_atlid, & ! Lidar molecular backscatter coefficient (atlid @ 355nm) - tau_mol_calipso, & ! Lidar molecular optical depth (calipso @ 532nm) - tau_mol_grLidar532, & ! Lidar molecular optical depth (ground-lidar @ 532nm) - tau_mol_atlid, & ! Lidar molecular optical depth (atlid @ 355nm) - tautot_S_liq, & ! Parasol Liquid water optical thickness, from TOA to SFC - tautot_S_ice, & ! Parasol Ice water optical thickness, from TOA to SFC - fracPrecipIce ! Fraction of precipitation which is frozen (1). - type(radar_cfg) :: & - rcfg_cloudsat ! Radar configuration information (CLOUDSAT) - type(rttov_cfg),dimension(:),pointer :: & - cfg_rttov ! RTTOV configuration information (multiple instruments) - type(swath_inputs),dimension(6) :: & ! Could be a pointer but fine - cospswathsIN - end type cosp_optical_inputs - - -CONTAINS - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - !---------- SUBROUTINE COSP_CHANGE_VERTICAL_GRID ---------------- - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -SUBROUTINE COSP_CHANGE_VERTICAL_GRID(Npoints,Ncolumns,Nlevels,zfull,zhalf,y,Nglevels,newgrid_bot,newgrid_top,r,log_units) - implicit none - ! Input arguments - integer,intent(in) :: Npoints !# of grid points - integer,intent(in) :: Nlevels !# of levels - integer,intent(in) :: Ncolumns !# of columns - real(wp),dimension(Npoints,Nlevels),intent(in) :: zfull ! Height at model levels [m] (Bottom of model layer) - real(wp),dimension(Npoints,Nlevels),intent(in) :: zhalf ! Height at half model levels [m] (Bottom of model layer) - real(wp),dimension(Npoints,Ncolumns,Nlevels),intent(in) :: y ! Variable to be changed to a different grid - integer,intent(in) :: Nglevels !# levels in the new grid - real(wp),dimension(Nglevels),intent(in) :: newgrid_bot ! Lower boundary of new levels [m] - real(wp),dimension(Nglevels),intent(in) :: newgrid_top ! Upper boundary of new levels [m] - logical,optional,intent(in) :: log_units ! log units, need to convert to linear units - ! Output - real(wp),dimension(Npoints,Ncolumns,Nglevels),intent(out) :: r ! Variable on new grid - - ! Local variables - integer :: i,j,k - logical :: lunits - integer :: l - real(wp) :: w ! Weight - real(wp) :: dbb, dtb, dbt, dtt ! Distances between edges of both grids - integer :: Nw ! Number of weights - real(wp) :: wt ! Sum of weights - real(wp),dimension(Nlevels) :: oldgrid_bot,oldgrid_top ! Lower and upper boundaries of model grid - real(wp) :: yp ! Local copy of y at a particular point. - ! This allows for change of units. - - lunits=.false. - if (present(log_units)) lunits=log_units - - r = 0._wp - - do i=1,Npoints - ! Calculate tops and bottoms of new and old grids - oldgrid_bot = zhalf(i,:) - oldgrid_top(1:Nlevels-1) = oldgrid_bot(2:Nlevels) - oldgrid_top(Nlevels) = zfull(i,Nlevels) + zfull(i,Nlevels) - zhalf(i,Nlevels) ! Top level symmetric - l = 0 ! Index of level in the old grid - ! Loop over levels in the new grid - do k = 1,Nglevels - Nw = 0 ! Number of weigths - wt = 0._wp ! Sum of weights - ! Loop over levels in the old grid and accumulate total for weighted average - do - l = l + 1 - w = 0.0 ! Initialise weight to 0 - if (l > Nlevels) exit - ! Distances between edges of both grids - dbb = oldgrid_bot(l) - newgrid_bot(k) - dtb = oldgrid_top(l) - newgrid_bot(k) - dbt = oldgrid_bot(l) - newgrid_top(k) - dtt = oldgrid_top(l) - newgrid_top(k) - if (dbt >= 0.0) exit ! Do next level in the new grid - if (dtb > 0.0) then - if (dbb <= 0.0) then - if (dtt <= 0) then - w = dtb - else - w = newgrid_top(k) - newgrid_bot(k) - endif - else - if (dtt <= 0) then - w = oldgrid_top(l) - oldgrid_bot(l) - else - w = -dbt - endif - endif - ! If layers overlap (w/=0), then accumulate - if (w /= 0.0) then - Nw = Nw + 1 - wt = wt + w - do j=1,Ncolumns - if (lunits) then - if (y(i,j,l) /= R_UNDEF) then - yp = 10._wp**(y(i,j,l)/10._wp) - else - yp = 0._wp - endif - else - yp = y(i,j,l) - endif - r(i,j,k) = r(i,j,k) + w*yp - enddo - endif - endif - enddo - l = l - 2 - if (l < 1) l = 0 - ! Calculate average in new grid - if (Nw > 0) then - do j=1,Ncolumns - r(i,j,k) = r(i,j,k)/wt - enddo - endif - enddo - enddo - - ! Set points under surface to R_UNDEF, and change to dBZ if necessary - do k=1,Nglevels - do j=1,Ncolumns - do i=1,Npoints - if (newgrid_top(k) > zhalf(i,1)) then ! Level above model bottom level - if (lunits) then - if (r(i,j,k) <= 0.0) then - r(i,j,k) = R_UNDEF - else - r(i,j,k) = 10._wp*log10(r(i,j,k)) - endif - endif - else ! Level below surface - r(i,j,k) = R_GROUND - endif - enddo - enddo - enddo - -END SUBROUTINE COSP_CHANGE_VERTICAL_GRID - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - !------------- SUBROUTINE COSP_LIDAR_ONLY_CLOUD ----------------- - ! (c) 2008, Lawrence Livermore National Security Limited Liability Corporation. - ! All rights reserved. - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - SUBROUTINE COSP_LIDAR_ONLY_CLOUD(Npoints, Ncolumns, Nlevels, beta_tot, beta_mol, & - Ze_tot, lidar_only_freq_cloud, tcc, radar_tcc, radar_tcc2) - ! Inputs - integer,intent(in) :: & - Npoints, & ! Number of horizontal gridpoints - Ncolumns, & ! Number of subcolumns - Nlevels ! Number of vertical layers - real(wp),dimension(Npoints,Nlevels),intent(in) :: & - beta_mol ! Molecular backscatter - real(wp),dimension(Npoints,Ncolumns,Nlevels),intent(in) :: & - beta_tot, & ! Total backscattered signal - Ze_tot ! Radar reflectivity - ! Outputs - real(wp),dimension(Npoints,Nlevels),intent(out) :: & - lidar_only_freq_cloud - real(wp),dimension(Npoints),intent(out) ::& - tcc, & ! - radar_tcc, & ! - radar_tcc2 ! - - ! local variables - real(wp) :: sc_ratio - real(wp),parameter :: & - s_cld=5.0, & - s_att=0.01 - integer :: flag_sat,flag_cld,pr,i,j,flag_radarcld,flag_radarcld_no1km,j_1km - - lidar_only_freq_cloud = 0._wp - tcc = 0._wp - radar_tcc = 0._wp - radar_tcc2 = 0._wp - do pr=1,Npoints - do i=1,Ncolumns - flag_sat = 0 - flag_cld = 0 - flag_radarcld = 0 !+JEK - flag_radarcld_no1km=0 !+JEK - ! look for j_1km from bottom to top - j = 1 - do while (Ze_tot(pr,i,j) .eq. R_GROUND) - j = j+1 - enddo - j_1km = j+1 !this is the vertical index of 1km above surface - - do j=1,Nlevels - sc_ratio = beta_tot(pr,i,j)/beta_mol(pr,j) - if ((sc_ratio .le. s_att) .and. (flag_sat .eq. 0)) flag_sat = j - if (Ze_tot(pr,i,j) .lt. -30.) then !radar can't detect cloud - if ( (sc_ratio .gt. s_cld) .or. (flag_sat .eq. j) ) then !lidar sense cloud - lidar_only_freq_cloud(pr,j)=lidar_only_freq_cloud(pr,j)+1. !top->surf - flag_cld=1 - endif - else !radar sense cloud (z%Ze_tot(pr,i,j) .ge. -30.) - flag_cld=1 - flag_radarcld=1 - if (j .gt. j_1km) flag_radarcld_no1km=1 - endif - enddo !levels - if (flag_cld .eq. 1) tcc(pr)=tcc(pr)+1._wp - if (flag_radarcld .eq. 1) radar_tcc(pr)=radar_tcc(pr)+1. - if (flag_radarcld_no1km .eq. 1) radar_tcc2(pr)=radar_tcc2(pr)+1. - enddo !columns - enddo !points - lidar_only_freq_cloud=lidar_only_freq_cloud/Ncolumns - tcc=tcc/Ncolumns - radar_tcc=radar_tcc/Ncolumns - radar_tcc2=radar_tcc2/Ncolumns - - ! Unit conversion - where(lidar_only_freq_cloud /= R_UNDEF) & - lidar_only_freq_cloud = lidar_only_freq_cloud*100._wp - where(tcc /= R_UNDEF) tcc = tcc*100._wp - where(radar_tcc /= R_UNDEF) radar_tcc = radar_tcc*100._wp - where(radar_tcc2 /= R_UNDEF) radar_tcc2 = radar_tcc2*100._wp - - END SUBROUTINE COSP_LIDAR_ONLY_CLOUD - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - !----------------------- SUBROUTINE COSP_DIAG_WARMRAIN ------------------------ - ! (c) 2018, Research Institute for Applied Mechanics (RIAM), Kyushu Univ. - ! All rights reserved. - ! * Purpose: 1) Diagnose Contoured Frequency by Optical Depth Diagram (CFODD) - ! from CloudSat Radar and MODIS retrievals. - ! 2) Diagnose Warm-Rain Occurrence Frequency (nonprecip/drizzle/rain) - ! from CloudSat Radar. - ! * History: Jan 2018 (T.Michibata): Test run - ! May 2018 (T.Michibata): update for COSP2 - ! Sep 2018 (T.Michibata): modified I/O - ! Nov 2018 (T.Michibata): minor revisions - ! May 2020 (T.Michibata and X.Jing): bug-fix for frac_out dimsize - ! Apr 2022 (T.Michibata): bug-fix for non-sunlit columns - ! * References: Michibata et al. (GMD'19, doi:10.5194/gmd-12-4297-2019) - ! Michibata et al. (GRL'20, doi:10.1029/2020GL088340) - ! Suzuki et al. (JAS'10, doi:10.1175/2010JAS3463.1) - ! Suzuki et al. (JAS'15, doi:10.1175/JAS-D-14-0265.1) - ! Jing et al. (JCLIM'19, doi:10.1175/jcli-d-18-0789.1) - ! * Contact: Takuro Michibata (RIAM, Kyushu University, Japan). - ! E-mail: michibata@riam.kyushu-u.ac.jp - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - SUBROUTINE COSP_DIAG_WARMRAIN( Npoints, Ncolumns, Nlevels, & !! in - temp, zlev, & !! in - lwp, liqcot, liqreff, liqcfrc, & !! in - iwp, icecot, icereff, icecfrc, & !! in - fracout, dbze, & !! in - cfodd_ntotal, & !! inout - wr_occfreq_ntotal ) !! inout - - ! Inputs - integer, intent(in) :: & - Npoints, & ! Number of horizontal gridpoints - Ncolumns, & ! Number of subcolumns - Nlevels ! Number of vertical layers - real(wp), dimension(Npoints), intent(in) :: & - lwp, & ! MODIS LWP [kg m-2] - liqcot, & ! MODIS liq. COT - liqreff, & ! MODIS liq. Reff [m] - liqcfrc ! MODIS liq. cloud fraction - real(wp), dimension(Npoints), intent(in) :: & - iwp, & ! MODIS IWP [kg m-2] - icecot, & ! MODIS ice COT - icereff, & ! MODIS ice Reff [m] - icecfrc ! MODIS ice cloud fraction - real(wp), dimension(Npoints,Nlevels), intent(in) :: & - zlev ! altitude [m] for model level - real(wp), dimension(Npoints,1,Nlevels),intent(in) :: & - temp ! temperature [K] - real(wp), dimension(Npoints,Ncolumns,Nlevels),intent(in) :: & - fracout, & ! SCOPS subcolumn retrieval - dbze ! Radar reflectivity [dBZe] - - ! Outputs - real(wp),dimension(Npoints,CFODD_NDBZE,CFODD_NICOD,CFODD_NCLASS),intent(inout) :: & - cfodd_ntotal ! # of CFODD samples for each ICOD/dBZe bin - real(wp),dimension(Npoints,WR_NREGIME),intent(inout) :: & - wr_occfreq_ntotal ! # of SLWC samples - - ! Local variables - integer :: i, j, k - integer :: kctop, kcbtm - integer :: icls - integer :: iregime - real(wp) :: cmxdbz - real(wp) :: diagcgt !! diagnosed cloud geometric thickness [m] - real(wp) :: diagicod !! diagnosed in-cloud optical depth - real(wp) :: cbtmh !! diagnosed in-cloud optical depth - real(wp), dimension(Npoints,Ncolumns,Nlevels) :: icod !! in-cloud optical depth (ICOD) - logical :: octop, ocbtm, oslwc - integer, dimension(Npoints,Ncolumns,Nlevels) :: fracout_int !! fracout (decimal to integer) - fracout_int(:,:,:) = 0 - where ((fracout(:,:,:) .ge. 0.5_wp) .and. (fracout(:,:,:) .lt. 1.5_wp )) fracout_int(:,:,:) = 1 - where ((fracout(:,:,:) .ge. 1.5_wp) .and. (fracout(:,:,:) .lt. 2.5_wp )) fracout_int(:,:,:) = 2 - !! initialize - do i = 1, Npoints - if ( lwp(i) .eq. R_UNDEF ) then ! for non-sunlit columns - cfodd_ntotal(i,:,:,:) = R_UNDEF - wr_occfreq_ntotal(i,:) = R_UNDEF - icod(i,:,:) = R_UNDEF - else - cfodd_ntotal(i,:,:,:) = 0._wp - wr_occfreq_ntotal(i,:) = 0._wp - icod(i,:,:) = 0._wp - endif - enddo - - do i = 1, Npoints - !! check by MODIS retrieval - if ( ( lwp(i) .le. CWP_THRESHOLD .and. lwp(i) .ne. R_UNDEF ) .or. & - & liqcot(i) .le. COT_THRESHOLD .or. & - & liqreff(i) .lt. CFODD_BNDRE(1) .or. & - & liqreff(i) .gt. CFODD_BNDRE(4) .or. & - & iwp(i) .gt. CWP_THRESHOLD .or. & !! exclude ice cloud - & icecot(i) .gt. COT_THRESHOLD .or. & !! exclude ice cloud - & icereff(i) .gt. CFODD_BNDRE(1) ) then !! exclude ice cloud - cycle - else - !! retrieve the CFODD array based on Reff - icls = 0 - if ( liqreff(i) .ge. CFODD_BNDRE(1) .and. liqreff(i) .lt. CFODD_BNDRE(2) ) then - icls = 1 - elseif( liqreff(i) .ge. CFODD_BNDRE(2) .and. liqreff(i) .lt. CFODD_BNDRE(3) ) then - icls = 2 - elseif( liqreff(i) .ge. CFODD_BNDRE(3) .and. liqreff(i) .le. CFODD_BNDRE(4) ) then - icls = 3 - endif - endif - - !CDIR NOLOOPCHG - do j = 1, Ncolumns, 1 - octop = .true. !! initialize - ocbtm = .true. !! initialize - kcbtm = 0 !! initialize - kctop = 0 !! initialize - !CDIR NOLOOPCHG - do k = Nlevels, 1, -1 !! scan from cloud-bottom to cloud-top - if ( dbze(i,j,k) .eq. R_GROUND .or. & - dbze(i,j,k) .eq. R_UNDEF ) cycle - if ( ocbtm .and. & - & fracout_int(i,j,k) .ne. SGCLD_CLR .and. & - & dbze(i,j,k) .ge. CFODD_DBZE_MIN ) then - ocbtm = .false. !! cloud bottom detected - kcbtm = k - kctop = k - endif - if ( octop .and. & !! scan cloud-top - & .not. ocbtm .and. & !! cloud-bottom already detected - & fracout_int(i,j,k) .ne. SGCLD_CLR .and. & !! exclude clear sky - & dbze(i,j,k) .ge. CFODD_DBZE_MIN ) then - kctop = k !! update - endif - enddo !! k loop - if( ocbtm ) cycle !! cloud wasn't detected in this subcolumn - !! check SLWC? - if( temp(i,1,kctop) .lt. tmelt ) cycle !! return to the j (subcolumn) loop - oslwc = .true. - cmxdbz = CFODD_DBZE_MIN !! initialized - - !CDIR NOLOOPCHG - do k = kcbtm, kctop, -1 - cmxdbz = max( cmxdbz, dbze(i,j,k) ) !! column maximum dBZe update - if ( fracout_int(i,j,k) .eq. SGCLD_CLR .or. & - & fracout_int(i,j,k) .eq. SGCLD_CUM .or. & - & dbze (i,j,k) .lt. CFODD_DBZE_MIN ) then - oslwc = .false. - endif - enddo - if ( .not. oslwc ) cycle !! return to the j (subcolumn) loop - - !! warm-rain occurrence frequency - iregime = 0 - if( cmxdbz .lt. CFODD_BNDZE(1) ) then - iregime = 1 !! non-precipitating - elseif( cmxdbz .ge. CFODD_BNDZE(1) .and. cmxdbz .lt. CFODD_BNDZE(2) ) then - iregime = 2 !! drizzling - elseif( cmxdbz .ge. CFODD_BNDZE(2) ) then - iregime = 3 !! raining - endif - wr_occfreq_ntotal(i,iregime) = wr_occfreq_ntotal(i,iregime) + 1._wp - - !! retrievals of ICOD and dBZe bin for CFODD plane - diagcgt = zlev(i,kctop) - zlev(i,kcbtm) - cbtmh = zlev(i,kcbtm) - !CDIR NOLOOPCHG - do k = kcbtm, kctop, -1 - if( k .eq. kcbtm ) then - diagicod = liqcot(i) - else - diagicod = liqcot(i) * ( 1._wp - ( (zlev(i,k)-cbtmh)/diagcgt)**(5._wp/3._wp) ) - endif - icod(i,j,k) = min( diagicod, CFODD_ICOD_MAX ) - enddo - - enddo ! j (Ncolumns) - - !! # of samples for CFODD (joint 2d-histogram dBZe vs ICOD) - call hist2d( dbze(i,1:Ncolumns,1:Nlevels), icod(i,1:Ncolumns,1:Nlevels), & - & Ncolumns*Nlevels, & - & CFODD_HISTDBZE, CFODD_NDBZE, CFODD_HISTICOD, CFODD_NICOD, & - & cfodd_ntotal( i, 1:CFODD_NDBZE, 1:CFODD_NICOD, icls ) ) - - enddo ! i (Npoints) - - RETURN - END SUBROUTINE COSP_DIAG_WARMRAIN - - ! ###################################################################################### - ! FUNCTION hist1D - ! ###################################################################################### - function hist1d(Npoints,var,nbins,bins) - ! Inputs - integer,intent(in) :: & - Npoints, & ! Number of points in input array - Nbins ! Number of bins for sorting - real(wp),intent(in),dimension(Npoints) :: & - var ! Input variable to be sorted - real(wp),intent(in),dimension(Nbins+1) :: & - bins ! Histogram bins [lowest,binTops] - ! Outputs - real(wp),dimension(Nbins) :: & - hist1d ! Output histogram - ! Local variables - integer :: ij - - do ij=2,Nbins+1 - hist1D(ij-1) = count(var .ge. bins(ij-1) .and. var .lt. bins(ij)) - if (count(var .eq. R_GROUND) .ge. 1) hist1D(ij-1)=R_UNDEF - enddo - - end function hist1D - - ! ###################################################################################### - ! SUBROUTINE hist2D - ! ###################################################################################### - subroutine hist2D(var1,var2,npts,bin1,nbin1,bin2,nbin2,jointHist) - implicit none - - ! INPUTS - integer, intent(in) :: & - npts, & ! Number of data points to be sorted - nbin1, & ! Number of bins in histogram direction 1 - nbin2 ! Number of bins in histogram direction 2 - real(wp),intent(in),dimension(npts) :: & - var1, & ! Variable 1 to be sorted into bins - var2 ! variable 2 to be sorted into bins - real(wp),intent(in),dimension(nbin1+1) :: & - bin1 ! Histogram bin 1 boundaries - real(wp),intent(in),dimension(nbin2+1) :: & - bin2 ! Histogram bin 2 boundaries - ! OUTPUTS - real(wp),intent(out),dimension(nbin1,nbin2) :: & - jointHist - - ! LOCAL VARIABLES - integer :: ij,ik - - do ij=2,nbin1+1 - do ik=2,nbin2+1 - jointHist(ij-1,ik-1)=count(var1 .ge. bin1(ij-1) .and. var1 .lt. bin1(ij) .and. & - var2 .ge. bin2(ik-1) .and. var2 .lt. bin2(ik)) - enddo - enddo - end subroutine hist2D - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE cosp_cleanUp - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - subroutine cosp_cleanUp() - deallocate(vgrid_zl,vgrid_zu,vgrid_z,dz) - end subroutine cosp_cleanUp - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE compute_orbitmasks - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - subroutine compute_orbitmasks(Npoints,Nlocaltimes,localtimes,localtime_widths, & - lat,lon,month,day,hour,minute,swath_mask_out,Nswathed_out) - - ! Inputs - integer,intent(in) :: & - Npoints, & - Nlocaltimes - - real(wp),dimension(Nlocaltimes),intent(in) :: & - localtimes, & - localtime_widths - - real(wp),dimension(Npoints),intent(in) :: & - lat, & - lon, & - month, & - day, & - hour, & - minute - - ! Output - logical,dimension(Npoints),intent(out) :: & - swath_mask_out ! Mask of reals over all gridcells - integer,intent(out) :: & - Nswathed_out - - ! Local variables - integer :: i ! iterator - - real(wp),dimension(Npoints,Nlocaltimes) :: & - sat_lon, & ! Central longitude of the instrument. - dlon, & ! distance to satellite longitude in degrees - dx ! distance to satellite longitude in km? - - logical,dimension(Npoints,Nlocaltimes) :: & - swath_mask_all ! Mask of logicals over all local times, gridcells - - integer, dimension(Npoints) :: & - rttov_DOY ! Array of day of year values - real(wp), dimension(Npoints) :: & - localtime_offsets ! Offset values to avoid striping with hourly RT calls. [hours] - ! Compute the day of the year and determine the localtime offset - do i=1,Npoints - call get_DOY(int(month(i)), int(day(i)), rttov_DOY(i)) - end do - localtime_offsets = (mod(rttov_DOY(:), 5) - 2) / 5.0 ! Need to cast to real - - ! Iterate over local times - swath_mask_all(:,:) = .false. - do i=1,Nlocaltimes - ! Calculate the central longitude for each gridcell and orbit - sat_lon(:,i) = 15.0 * (localtimes(i) + localtime_offsets - (hour + minute / 60)) - ! Calculate distance (in degrees) from each grid cell to the satellite central long - dlon(:,i) = mod((lon - sat_lon(:,i) + 180.0), 360.0) - 180.0 - ! calculate distance to satellite in km. Remember to convert to radians for cos/sine calls - dx(:,i) = dlon(:,i) * (pi/180.0) * COS(lat * pi / 180) * radius_earth - ! Determine if a gridcell falls in the swath width - where (abs(dx(:,i))<(localtime_widths(i)*0.5)) - swath_mask_all(:,i) = .true. - end where - end do - - ! Mask is true where values should be calculated - swath_mask_out = ANY( swath_mask_all(:,:),2) ! Compute mask by collapsing the localtimes dimension - Nswathed_out = count(swath_mask_out) ! Number of gridcells that should be calculated. - - end subroutine compute_orbitmasks - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE get_DOY - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - subroutine get_DOY(month, day, DOY) - - integer,intent(in) :: & - month, & - day - integer,intent(out) :: & - DOY - - ! This subroutine does not handle leap years because it is not relevant to the purpose. - ! Simple look-up table for DOY. - if (month .eq. 1) DOY = day - if (month .eq. 2) DOY = 31 + day - if (month .eq. 3) DOY = 59 + day - if (month .eq. 4) DOY = 90 + day - if (month .eq. 5) DOY = 120 + day - if (month .eq. 6) DOY = 151 + day - if (month .eq. 7) DOY = 181 + day - if (month .eq. 8) DOY = 212 + day - if (month .eq. 9) DOY = 243 + day - if (month .eq. 10) DOY = 273 + day - if (month .eq. 11) DOY = 304 + day - if (month .eq. 12) DOY = 334 + day - - end subroutine get_DOY - -END MODULE MOD_COSP_STATS diff --git a/src/simulator/cosp_cloudsat_interface.F90.bak b/src/simulator/cosp_cloudsat_interface.F90.bak deleted file mode 100644 index ff61417104..0000000000 --- a/src/simulator/cosp_cloudsat_interface.F90.bak +++ /dev/null @@ -1,234 +0,0 @@ -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -! Copyright (c) 2015, Regents of the University of Colorado -! All rights reserved. -! -! Redistribution and use in source and binary forms, with or without modification, are -! permitted provided that the following conditions are met: -! -! 1. Redistributions of source code must retain the above copyright notice, this list of -! conditions and the following disclaimer. -! -! 2. Redistributions in binary form must reproduce the above copyright notice, this list -! of conditions and the following disclaimer in the documentation and/or other -! materials provided with the distribution. -! -! 3. Neither the name of the copyright holder nor the names of its contributors may be -! used to endorse or promote products derived from this software without specific prior -! written permission. -! -! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL -! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT -! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -! -! History -! May 2015 - D. Swales - Original version -! Jun 2025 - J.K. Shaw - Added COSP-RTTOV integration and swathing -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -MODULE MOD_COSP_CLOUDSAT_INTERFACE - USE COSP_KINDS, ONLY: wp - USE quickbeam, ONLY: quickbeam_init,Re_MAX_BIN,Re_BIN_LENGTH, & - maxhclass, nRe_types, nd, mt_ntt - use mod_cosp_stats, ONLY: radar_cfg,compute_orbitmasks,cosp_optical_inputs,cosp_column_inputs - IMPLICIT NONE - - ! Directory where LUTs will be stored - character(len=120) :: RADAR_SIM_LUT_DIRECTORY = './' - logical :: RADAR_SIM_LOAD_scale_LUTs_flag = .false. - logical :: RADAR_SIM_UPDATE_scale_LUTs_flag = .false. - - ! Module variables - real(wp),dimension(:,:),target,allocatable :: & - temp_hgt_matrix - real(wp),dimension(:,:,:),target,allocatable :: & - temp_z_vol_cloudsat, & - temp_kr_vol_cloudsat, & - temp_g_vol_cloudsat - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! TYPE cloudsat_IN - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - type cloudsat_IN - integer :: & - Npoints ! Number of horizontal grid-points - integer,pointer :: & - Nlevels, & ! Number of vertical levels - Ncolumns ! Number of subcolumns - real(wp),pointer :: & - hgt_matrix(:,:), & ! Height of hydrometeors (km) - z_vol(:,:,:), & ! Effective reflectivity factor (mm^6/m^3) - kr_vol(:,:,:), & ! Attenuation coefficient hydro (dB/km) - g_vol(:,:,:), & ! Attenuation coefficient gases (dB/km) - g_to_vol_in(:,:) ! Gaseous atteunation, radar to vol (dB) - type(radar_cfg),pointer :: rcfg ! Radar simulator configuration - end type cloudsat_IN - -CONTAINS - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE cosp_cloudsat_in - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - SUBROUTINE COSP_CLOUDSAT_INIT(radar_freq,k2,use_gas_abs,do_ray,undef,nhydro, & - surface_radar,rcfg,cloudsat_micro_scheme,load_LUT) - ! INPUTS - real(wp),intent(in) :: & - radar_freq, & ! Radar frequency (GHz) - k2, & ! |K|^2, the dielectric constant - undef ! Undefined - integer,intent(in) :: & - use_gas_abs, & ! 1 = do gaseous abs calcs, 0=no gasesous absorbtion calculated, - ! 2 = calculate absorption for first profile on all profiles - do_ray, & ! - nhydro, & ! - surface_radar - logical,intent(in),optional :: & - load_LUT - character(len=64),intent(in) :: & - cloudsat_micro_scheme - - ! OUTPUTS - type(radar_cfg) :: & - rcfg ! - - ! LOCAL VARIABLES - character(len=240) :: LUT_file_name - logical :: local_load_LUT - integer :: j - - if (present(load_LUT)) then - local_load_LUT = load_LUT - else - local_load_LUT = RADAR_SIM_LOAD_scale_LUTs_flag - endif - - ! LUT file name - LUT_file_name = trim(RADAR_SIM_LUT_DIRECTORY) // & - trim(cloudsat_micro_scheme) - - ! Initialize for NEW radar-configurarion derived type (radar_cfg) - rcfg%freq = radar_freq - rcfg%k2 = k2 - rcfg%use_gas_abs = use_gas_abs - rcfg%do_ray = do_ray - rcfg%nhclass = nhydro - rcfg%load_scale_LUTs = local_load_LUT - rcfg%update_scale_LUTs = .false. - rcfg%scale_LUT_file_name = LUT_file_name - rcfg%N_scale_flag = .false. - rcfg%fc = undef - rcfg%rho_eff = undef - rcfg%Z_scale_flag = .false. - rcfg%Ze_scaled = 0._wp - rcfg%Zr_scaled = 0._wp - rcfg%kr_scaled = 0._wp - - ! Set up Re bin "structure" for z_scaling - rcfg%base_list(1)=0 - do j=1,Re_MAX_BIN - rcfg%step_list(j)=0.1_wp+0.1_wp*((j-1)**1.5_wp) - if(rcfg%step_list(j)>Re_BIN_LENGTH) then - rcfg%step_list(j)=Re_BIN_LENGTH - endif - if(j>1) then - rcfg%base_list(j)=rcfg%base_list(j-1)+floor(Re_BIN_LENGTH/rcfg%step_list(j-1)) - endif - enddo - - ! Set flag denoting position of radar - if (surface_radar == 1) then - rcfg%radar_at_layer_one = .false. - else - rcfg%radar_at_layer_one = .true. - endif - - END SUBROUTINE COSP_CLOUDSAT_INIT - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE COSP_ASSIGN_cloudsatIN - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - SUBROUTINE COSP_ASSIGN_cloudsatIN(cospIN, cospgridIN, Npoints, cloudsatIN, & - CSCAL_MASK_INDICES, CSCAL_SWATH_MASK) - type(cosp_optical_inputs),intent(in),target :: cospIN ! Optical inputs to COSP simulator - type(cosp_column_inputs), intent(in),target :: cospgridIN ! Host model inputs to COSP - integer,intent(in),target :: & - Npoints - type(cloudsat_IN),intent(inout) :: & - cloudsatIN - integer,dimension(:),allocatable,intent(out) :: & ! Array containing the indices of the swath masks, already allocated? - CSCAL_MASK_INDICES - logical,dimension(:),allocatable,intent(inout) :: & ! Mask of reals over all local times - CSCAL_SWATH_MASK - - ! Local variables - integer, target :: & - N_CLOUDSAT_SWATHED, & - i - - if (cospIN % cospswathsIN(3) % N_inst_swaths .gt. 0) then - if (.not.allocated(CSCAL_SWATH_MASK)) allocate(CSCAL_SWATH_MASK(Npoints)) - ! Do swathing to figure out which cells to simulate on - call compute_orbitmasks(Npoints, & - cospIN % cospswathsIN(3) % N_inst_swaths, & - cospIN % cospswathsIN(3) % inst_localtimes, & - cospIN % cospswathsIN(3) % inst_localtime_widths, & - cospgridIN%lat, cospgridIN%lon, & - cospgridIN%rttov_date(:,2), cospgridIN%rttov_date(:,3), & ! Time fields: month, dayofmonth - cospgridIN%rttov_time(:,1), cospgridIN%rttov_time(:,2), & ! Time fields: hour, minute - CSCAL_SWATH_MASK,N_CLOUDSAT_SWATHED) ! Output: logical mask array - cloudsatIN%Npoints = N_CLOUDSAT_SWATHED - cloudsatIN%Ncolumns => cospIN%Ncolumns - if (.not. allocated(CSCAL_MASK_INDICES)) allocate(CSCAL_MASK_INDICES(cloudsatIN%Npoints)) - CSCAL_MASK_INDICES = pack((/ (i, i = 1, Npoints ) /),mask = CSCAL_SWATH_MASK) - if (cloudsatIN%Npoints .gt. 0) then - ! Allocate swathed arrays. - allocate(temp_z_vol_cloudsat(cloudsatIN%Npoints,cospIN%Ncolumns,cospIN%Nlevels), & - temp_kr_vol_cloudsat(cloudsatIN%Npoints,cospIN%Ncolumns,cospIN%Nlevels), & - temp_g_vol_cloudsat(cloudsatIN%Npoints,cospIN%Ncolumns,cospIN%Nlevels), & - temp_hgt_matrix(cloudsatIN%Npoints,cospIN%Nlevels)) - ! Encode step: Read only appropriate values into the new temp arrays. - temp_z_vol_cloudsat = cospIN%z_vol_cloudsat(int(CSCAL_MASK_INDICES),:,:) - temp_kr_vol_cloudsat = cospIN%kr_vol_cloudsat(int(CSCAL_MASK_INDICES),:,:) - temp_g_vol_cloudsat = cospIN%g_vol_cloudsat(int(CSCAL_MASK_INDICES),:,:) - temp_hgt_matrix = cospgridIN%hgt_matrix(int(CSCAL_MASK_INDICES),:) - ! Reassign swathed values. - cloudsatIN%Nlevels => cospIN%Nlevels - cloudsatIN%z_vol => temp_z_vol_cloudsat - cloudsatIN%kr_vol => temp_kr_vol_cloudsat - cloudsatIN%g_vol => temp_g_vol_cloudsat - cloudsatIN%rcfg => cospIN%rcfg_cloudsat - cloudsatIN%hgt_matrix => temp_hgt_matrix - end if - else - cloudsatIN%Npoints = Npoints - cloudsatIN%Ncolumns => cospIN%Ncolumns - cloudsatIN%Nlevels => cospIN%Nlevels - cloudsatIN%z_vol => cospIN%z_vol_cloudsat - cloudsatIN%kr_vol => cospIN%kr_vol_cloudsat - cloudsatIN%g_vol => cospIN%g_vol_cloudsat - cloudsatIN%rcfg => cospIN%rcfg_cloudsat - cloudsatIN%hgt_matrix => cospgridIN%hgt_matrix - end if - - END SUBROUTINE COSP_ASSIGN_cloudsatIN - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! SUBROUTINE COSP_ASSIGN_cloudsatIN_CLEAN - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - SUBROUTINE COSP_ASSIGN_cloudsatIN_CLEAN() - ! Deallocate temporary arrays - if (allocated(temp_z_vol_cloudsat)) deallocate(temp_z_vol_cloudsat) - if (allocated(temp_kr_vol_cloudsat)) deallocate(temp_kr_vol_cloudsat) - if (allocated(temp_g_vol_cloudsat)) deallocate(temp_g_vol_cloudsat) - if (allocated(temp_hgt_matrix)) deallocate(temp_hgt_matrix) - - END SUBROUTINE COSP_ASSIGN_cloudsatIN_CLEAN - - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - ! END MODULE - !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -END MODULE MOD_COSP_CLOUDSAT_INTERFACE diff --git a/src/simulator/quickbeam/quickbeam.F90.bak b/src/simulator/quickbeam/quickbeam.F90.bak deleted file mode 100644 index 06d78b9a82..0000000000 --- a/src/simulator/quickbeam/quickbeam.F90.bak +++ /dev/null @@ -1,605 +0,0 @@ -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -! Copyright (c) 2015, Regents of the University of Colorado -! All rights reserved. -! -! Redistribution and use in source and binary forms, with or without modification, are -! permitted provided that the following conditions are met: -! -! 1. Redistributions of source code must retain the above copyright notice, this list of -! conditions and the following disclaimer. -! -! 2. Redistributions in binary form must reproduce the above copyright notice, this list -! of conditions and the following disclaimer in the documentation and/or other -! materials provided with the distribution. -! -! 3. Neither the name of the copyright holder nor the names of its contributors may be -! used to endorse or promote products derived from this software without specific prior -! written permission. -! -! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL -! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT -! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -! -! History -! 11/2005: John Haynes - Created -! 09/2006 placed into subroutine form (Roger Marchand,JMH) -! 08/2007 added equivalent volume spheres, Z and N scalling most distrubtion types (Roger Marchand) -! 01/2008 'Do while' to determine if hydrometeor(s) present in volume -! changed for vectorization purposes (A. Bodas-Salcedo) -! -! 07/2010 V3.0 ... Modified to load or save scale factors to disk as a Look-Up Table (LUT) -! ... All hydrometeor and radar simulator properties now included in hp structure -! ... hp structure should be initialized by call to radar_simulator_init prior -! ... to calling this subroutine. -! Also ... Support of Morrison 2-moment style microphyscis (Np_matrix) added -! ... Changes implement by Roj Marchand following work by Laura Fowler -! -! 10/2011 Modified ngate loop to go in either direction depending on flag -! hp%radar_at_layer_one. This affects the direction in which attenuation is summed. -! -! Also removed called to AVINT for gas and hydrometeor attenuation and replaced with simple -! summation. (Roger Marchand) -! May 2015 - D. Swales - Modified for COSPv2.0 -! Jun 2025 - J.K. Shaw - Parameters and DDT moved to cosp_stats.F90 for interface swathing -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -module quickbeam - USE COSP_KINDS, ONLY: wp - USE MOD_COSP_CONFIG, ONLY: R_UNDEF,cloudsat_histRef,use_vgrid,vgrid_zl,vgrid_zu,& - pClass_noPrecip, pClass_Rain1, pClass_Rain2, pClass_Rain3,& - pClass_Snow1, pClass_Snow2, pClass_Mixed1, pClass_Mixed2, & - pClass_Rain4, pClass_default, Zenonbinval, Zbinvallnd, & - N_HYDRO,nCloudsatPrecipClass,cloudsat_preclvl - - USE MOD_COSP_STATS, ONLY: COSP_LIDAR_ONLY_CLOUD,hist1D,COSP_CHANGE_VERTICAL_GRID, & - maxhclass,nRe_types,nd,mt_ntt,Re_BIN_LENGTH,Re_MAX_BIN, & - dmin,dmax,radar_cfg - implicit none -contains - ! ###################################################################################### - ! SUBROUTINE quickbeam_subcolumn - ! ###################################################################################### - subroutine quickbeam_subcolumn(rcfg,nprof,ngate,hgt_matrix,z_vol,kr_vol,g_vol,dBZe,Ze_non) - - ! INPUTS - type(radar_cfg),intent(inout) :: & - rcfg ! Derived type for radar simulator setup - integer,intent(in) :: & - nprof, & ! Number of hydrometeor profiles - ngate ! Number of vertical layers - real(wp),intent(in),dimension(nprof,ngate) :: & - hgt_matrix, & ! Height of hydrometeors (km) - z_vol, & ! Effective reflectivity factor (mm^6/m^3) - kr_vol, & ! Attenuation coefficient hydro (dB/km) - g_vol ! Attenuation coefficient gases (dB/km) - - ! OUTPUTS - real(wp), intent(out),dimension(nprof,ngate) :: & - Ze_non, & ! Radar reflectivity without attenuation (dBZ) - dBZe ! Effective radar reflectivity factor (dBZ) - - ! LOCAL VARIABLES - integer :: k,pr,start_gate,end_gate,d_gate - real(wp),dimension(nprof,ngate) :: & - g_to_vol, & ! Gaseous atteunation, radar to vol (dB) - a_to_vol ! Hydromets attenuation, radar to vol (dB) - - ! Load scaling matricies from disk -- but only the first time this subroutine is called - if(rcfg%load_scale_LUTs) then - call load_scale_LUTs(rcfg) - rcfg%load_scale_LUTs=.false. - rcfg%Z_scale_added_flag = .false. ! will be set true if scaling Look Up Tables are modified during run - endif - - ! Initialization - g_to_vol = 0._wp - a_to_vol = 0._wp - - ! Loop over each range gate (ngate) ... starting with layer closest to the radar ! - if(rcfg%radar_at_layer_one) then - start_gate = 1 - end_gate = ngate - d_gate = 1 - else - start_gate = ngate - end_gate = 1 - d_gate = -1 - endif - do k=start_gate,end_gate,d_gate - ! Loop over each profile (nprof) - do pr=1,nprof - ! Attenuation due to hydrometeors between radar and volume - - ! NOTE old scheme integrates attenuation only for the layers ABOVE - ! the current layer ... i.e. 1 to k-1 rather than 1 to k ... - ! which may be a problem. ROJ - ! in the new scheme I assign half the attenuation to the current layer - if(d_gate==1) then - ! dheight calcuations assumes hgt_matrix points are the cell mid-points. - if (k>2) then - ! add to previous value to half of above layer + half of current layer - a_to_vol(pr,k)= a_to_vol(pr,k-1) + & - (kr_vol(pr,k-1)+kr_vol(pr,k))*(hgt_matrix(pr,k-1)-hgt_matrix(pr,k)) - else - a_to_vol(pr,k)= kr_vol(pr,k)*(hgt_matrix(pr,k)-hgt_matrix(pr,k+1)) - endif - else ! d_gate==-1 - if(k1) then - ! Add to previous value to half of above layer + half of current layer - g_to_vol(pr,k) = g_to_vol(pr,k-1) + & - 0.5*(g_vol(pr,k-1)+g_vol(pr,k))*(hgt_matrix(pr,k-1)-hgt_matrix(pr,k)) - else - g_to_vol(pr,k)= 0.5_wp*g_vol(pr,k)*(hgt_matrix(pr,k)-hgt_matrix(pr,k+1)) - endif - else ! d_gate==-1 - if (k 0._wp) - Ze_non(1:nprof,1:ngate) = 10._wp*log10(z_vol(1:nprof,1:ngate)) - dBZe(1:nprof,1:ngate) = Ze_non(1:nprof,1:ngate)-a_to_vol(1:nprof,1:ngate)-g_to_vol(1:nprof,1:ngate) - elsewhere - dBZe(1:nprof,1:ngate) = R_UNDEF - Ze_non(1:nprof,1:ngate) = R_UNDEF - end where - - ! Save any updates made - if (rcfg%update_scale_LUTs) call save_scale_LUTs(rcfg) - - end subroutine quickbeam_subcolumn - ! ###################################################################################### - ! SUBROUTINE quickbeam_column - ! ###################################################################################### - subroutine quickbeam_column(npoints, ncolumns, nlevels, llm, DBZE_BINS, platform, & - Ze_tot, Ze_tot_non, land, surfelev, t2m, fracPrecipIce, zlev, zlev_half, cfad_ze, & - cloudsat_precip_cover, cloudsat_pia) - ! Inputs - integer,intent(in) :: & - npoints, & ! Number of horizontal grid points - ncolumns, & ! Number of subcolumns - nlevels, & ! Number of vertical layers in OLD grid - llm, & ! Number of vertical layers in NEW grid - DBZE_BINS ! Number of bins for cfad. - character(len=*),intent(in) :: & - platform ! Name of platform (e.g. cloudsat) - real(wp),dimension(Npoints),intent(in) :: & - land, & ! Land/Sea mask. (1/0) - surfelev, & ! Surface Elevation (m) - t2m ! Near-surface temperature - real(wp),dimension(Npoints,Ncolumns),intent(in) :: & - fracPrecipIce ! Fraction of precipitation which is frozen. (1) - real(wp),intent(in),dimension(npoints,ncolumns,Nlevels) :: & - Ze_tot, & ! Effective reflectivity factor (dBZ) - Ze_tot_non ! Effective reflectivity factor w/o attenuation (dBZ) - real(wp),intent(in),dimension(npoints,Nlevels) :: & - zlev ! Model full levels - real(wp),intent(in),dimension(npoints,Nlevels) :: & - zlev_half ! Model half levels - - ! Outputs - real(wp),intent(inout),dimension(npoints,DBZE_BINS,llm) :: & - cfad_ze ! - real(wp),dimension(Npoints,nCloudsatPrecipClass),intent(out) :: & - cloudsat_precip_cover ! Model precip rate in by CloudSat precip flag - real(wp),dimension(Npoints),intent(out) :: & - cloudsat_pia ! Cloudsat path integrated attenuation - - ! Local variables - integer :: i,j - real(wp) :: zstep - real(wp),dimension(npoints,ncolumns,llm) :: ze_toti,ze_noni - logical :: lcloudsat = .false. - - ! Which platforms to create diagnostics for? - if (platform .eq. 'cloudsat') lcloudsat=.true. - - ! Create Cloudsat diagnostics. - if (lcloudsat) then - cloudsat_precip_cover = 0._wp - cloudsat_pia = 0._wp - if (use_vgrid) then - ! Regrid in the vertical (*NOTE* This routine requires SFC-2-TOA ordering, so flip - ! inputs and outputs to maintain TOA-2-SFC ordering convention in COSP2.) - call cosp_change_vertical_grid(Npoints,Ncolumns,Nlevels,zlev(:,nlevels:1:-1),& - zlev_half(:,nlevels:1:-1),Ze_tot(:,:,nlevels:1:-1),llm,vgrid_zl(llm:1:-1),& - vgrid_zu(llm:1:-1),Ze_toti(:,:,llm:1:-1),log_units=.true.) - - ! Effective reflectivity histogram - do i=1,Npoints - do j=1,llm - cfad_ze(i,:,j) = hist1D(Ncolumns,Ze_toti(i,:,j),DBZE_BINS,cloudsat_histRef) - enddo - enddo - where(cfad_ze .ne. R_UNDEF) cfad_ze = cfad_ze/Ncolumns - - ! Compute cloudsat near-surface precipitation diagnostics - ! First, regrid in the vertical Ze_tot_non. - call cosp_change_vertical_grid(Npoints,Ncolumns,Nlevels,zlev(:,nlevels:1:-1),& - zlev_half(:,nlevels:1:-1),Ze_tot_non(:,:,nlevels:1:-1),llm,vgrid_zl(llm:1:-1),& - vgrid_zu(llm:1:-1),Ze_noni(:,:,llm:1:-1),log_units=.true.) - ! Compute the zstep distance between two atmopsheric layers - zstep = vgrid_zl(1)-vgrid_zl(2) - ! Now call routine to generate diagnostics. - call cloudsat_precipOccurence(Npoints, Ncolumns, llm, N_HYDRO, Ze_toti, Ze_noni, & - land, surfelev, t2m, fracPrecipIce, cloudsat_precip_cover, cloudsat_pia, zstep) - else - ! Effective reflectivity histogram - do i=1,Npoints - do j=1,llm - cfad_ze(i,:,j) = hist1D(Ncolumns,Ze_tot(i,:,j),DBZE_BINS,cloudsat_histRef) - enddo - enddo - where(cfad_ze .ne. R_UNDEF) cfad_ze = cfad_ze/Ncolumns - endif - endif - - end subroutine quickbeam_column - ! ############################################################################################## - ! ############################################################################################## - ! ###################################################################################### - ! SUBROUTINE cloudsat_precipOccurence - ! - ! Notes from July 2016: Add precip flag also looped over subcolumns - ! Modified by Tristan L'Ecuyer (TSL) to add precipitation flagging - ! based on CloudSat's 2C-PRECIP-COLUMN algorithm (Haynes et al, JGR, 2009). - ! To mimic the satellite algorithm, this code applies thresholds to non-attenuated - ! reflectivities, Ze_non, consistent with those outlined in Haynes et al, JGR (2009). - ! - ! Procedures/Notes: - ! - ! (1) If the 2-way attenuation exceeds 40 dB, the pixel will be flagged as 'heavy rain' - ! consistent with the multiple-scattering analysis of Battaglia et al, JGR (2008). - ! (2) Rain, snow, and mixed precipitation scenes are separated according to the fraction - ! of the total precipitation hydrometeor mixing ratio that exists as ice. - ! (3) The entire analysis is applied to the range gate from 480-960 m to be consistent with - ! CloudSat's 720 m ground-clutter. - ! (4) Only a single flag is assigned to each model grid since there is no variation in - ! hydrometeor contents across a single model level. Unlike CFADs, whose variation enters - ! due to differening attenuation corrections from hydrometeors aloft, the non-attenuated - ! reflectivities used in the computation of this flag cannot vary across sub-columns. - ! - ! radar_prec_flag = 1-Rain possible 2-Rain probable 3-Rain certain - ! 4-Snow possible 5-Snow certain - ! 6-Mixed possible 7-Mixed certain - ! 8-Heavy Rain - ! 9- default value - ! - ! Modified by Dustin Swales (University of Colorado) for use with COSP2. - ! *NOTE* All inputs (Ze_out, Ze_non_out, fracPrecipIce) are at a single level from the - ! statistical output grid used by Cloudsat. This level is controlled by the - ! parameter cloudsat_preclvl, defined in src/cosp_config.F90 - ! ###################################################################################### - subroutine cloudsat_precipOccurence(Npoints, Ncolumns, llm, Nhydro, Ze_out, Ze_non_out, & - land, surfelev, t2m, fracPrecipIce, cloudsat_precip_cover, cloudsat_pia, zstep) - - ! Inputs - integer,intent(in) :: & - Npoints, & ! Number of columns - Ncolumns, & ! Numner of subcolumns - Nhydro, & ! Number of hydrometeor types - llm ! Number of levels - real(wp),dimension(Npoints),intent(in) :: & - land, & ! Land/Sea mask. (1/0) - surfelev, & ! Surface Elevation (m) - t2m ! Near-surface temperature - real(wp),dimension(Npoints,Ncolumns,llm),intent(in) :: & - Ze_out, & ! Effective reflectivity factor (dBZ) - Ze_non_out ! Effective reflectivity factor, w/o attenuation (dBZ) - real(wp),dimension(Npoints,Ncolumns),intent(in) :: & - fracPrecipIce ! Fraction of precipitation which is frozen. (1) - real(wp),intent(in) :: & - zstep ! Distance between two atmopsheric layers (m) - - ! Outputs - real(wp),dimension(Npoints,nCloudsatPrecipClass),intent(out) :: & - cloudsat_precip_cover ! Model precip rate in by CloudSat precip flag - real(wp),dimension(Npoints),intent(out) :: & - cloudsat_pia ! Cloudsat path integrated attenuation - - ! Local variables - integer,dimension(Npoints,Ncolumns) :: & - cloudsat_pflag, & ! Subcolumn precipitation flag - cloudsat_precip_pia ! Subcolumn path integrated attenutation. - integer,dimension(Npoints) :: & - cloudsat_preclvl_index ! Altitude index for precip flags calculation - ! in 40-level grid (one layer above surfelev) - integer :: pr,i,k - real(wp) :: Zmax - - ! Initialize - cloudsat_pflag(:,:) = pClass_default - cloudsat_precip_pia(:,:) = 0._wp - cloudsat_precip_cover(:,:) = 0._wp - cloudsat_pia(:) = 0._wp - cloudsat_preclvl_index(:) = 0._wp - - ! Computing altitude index for precip flags calculation - cloudsat_preclvl_index(:) = cloudsat_preclvl - floor( surfelev(:)/zstep ) - - ! ###################################################################################### - ! SUBCOLUMN processing - ! ###################################################################################### - do i=1, Npoints - do pr=1,Ncolumns - ! Compute precipitation flag - ! ################################################################################ - ! 1) Oceanic points. - ! ################################################################################ - if (land(i) .eq. 0) then - - ! 1a) Compute the PIA in all profiles containing hydrometeors - if ( (Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.-100) .and. (Ze_out(i,pr,cloudsat_preclvl_index(i)).gt.-100) ) then - if ( (Ze_non_out(i,pr,cloudsat_preclvl_index(i)).lt.100) .and. (Ze_out(i,pr,cloudsat_preclvl_index(i)).lt.100) ) then - cloudsat_precip_pia(i,pr) = Ze_non_out(i,pr,cloudsat_preclvl_index(i)) - Ze_out(i,pr,cloudsat_preclvl_index(i)) - endif - endif - - ! Snow - if(fracPrecipIce(i,pr).gt.0.9) then - if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(2)) then - cloudsat_pflag(i,pr) = pClass_Snow2 ! TSL: Snow certain - endif - if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(4).and. & - Ze_non_out(i,pr,cloudsat_preclvl_index(i)).le.Zenonbinval(2)) then - cloudsat_pflag(i,pr) = pClass_Snow1 ! TSL: Snow possible - endif - endif - - ! Mixed - if(fracPrecipIce(i,pr).gt.0.1.and.fracPrecipIce(i,pr).le.0.9) then - if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(2)) then - cloudsat_pflag(i,pr) = pClass_Mixed2 ! TSL: Mixed certain - endif - if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(4).and. & - Ze_non_out(i,pr,cloudsat_preclvl_index(i)).le.Zenonbinval(2)) then - cloudsat_pflag(i,pr) = pClass_Mixed1 ! TSL: Mixed possible - endif - endif - - ! Rain - if(fracPrecipIce(i,pr).le.0.1) then - if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(1)) then - cloudsat_pflag(i,pr) = pClass_Rain3 ! TSL: Rain certain - endif - if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(3).and. & - Ze_non_out(i,pr,cloudsat_preclvl_index(i)).le.Zenonbinval(1)) then - cloudsat_pflag(i,pr) = pClass_Rain2 ! TSL: Rain probable - endif - if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).gt.Zenonbinval(4).and. & - Ze_non_out(i,pr,cloudsat_preclvl_index(i)).le.Zenonbinval(3)) then - cloudsat_pflag(i,pr) = pClass_Rain1 ! TSL: Rain possible - endif - if(cloudsat_precip_pia(i,pr).gt.40) then - cloudsat_pflag(i,pr) = pClass_Rain4 ! TSL: Heavy Rain - endif - endif - - ! No precipitation - if(Ze_non_out(i,pr,cloudsat_preclvl_index(i)).le.-15) then - cloudsat_pflag(i,pr) = pClass_noPrecip ! TSL: Not Raining - endif - endif ! Ocean points - - ! ################################################################################ - ! 2) Land points. - ! *NOTE* For land points we go up a layer higher, so cloudsat_preclvl_index(i)-1 - ! - ! ################################################################################ - if (land(i) .eq. 1) then - ! 2a) Compute the PIA in all profiles containing hydrometeors - if ( (Ze_non_out(i,pr,cloudsat_preclvl_index(i)-1).gt.-100) .and. (Ze_out(i,pr,cloudsat_preclvl_index(i)-1).gt.-100) ) then - if ( (Ze_non_out(i,pr,cloudsat_preclvl_index(i)-1).lt.100) .and. (Ze_out(i,pr,cloudsat_preclvl_index(i)-1).lt.100) ) then - cloudsat_precip_pia(i,pr) = Ze_non_out(i,pr,cloudsat_preclvl_index(i)-1) - Ze_out(i,pr,cloudsat_preclvl_index(i)-1) - endif - endif - - ! Find Zmax, the maximum reflectivity value in the attenuated profile (Ze_out); - Zmax=maxval(Ze_out(i,pr,:)) - - ! Snow (T<273) - if(t2m(i) .lt. 273._wp) then - if(Ze_out(i,pr,cloudsat_preclvl_index(i)-1) .gt. Zbinvallnd(5)) then - cloudsat_pflag(i,pr) = pClass_Snow2 ! JEK: Snow certain - endif - if(Ze_out(i,pr,cloudsat_preclvl_index(i)-1) .gt. Zbinvallnd(6) .and. & - Ze_out(i,pr,cloudsat_preclvl_index(i)-1).le.Zbinvallnd(5)) then - cloudsat_pflag(i,pr) = pClass_Snow1 ! JEK: Snow possible - endif - endif - - ! Mized phase (273275) - if(t2m(i) .gt. 275) then - if ((Zmax .gt. Zbinvallnd(1) .and. cloudsat_precip_pia(i,pr).gt.30) .or. & - (Ze_out(i,pr,cloudsat_preclvl_index(i)-1) .gt. Zbinvallnd(2))) then - cloudsat_pflag(i,pr) = pClass_Rain3 ! JEK: Rain certain - endif - if((Ze_out(i,pr,cloudsat_preclvl_index(i)-1) .gt. Zbinvallnd(6)) .and. & - (Zmax .gt. Zbinvallnd(3))) then - cloudsat_pflag(i,pr) = pClass_Rain2 ! JEK: Rain probable - endif - if((Ze_out(i,pr,cloudsat_preclvl_index(i)-1) .gt. Zbinvallnd(6)) .and. & - (Zmax.lt.Zbinvallnd(3))) then - cloudsat_pflag(i,pr) = pClass_Rain1 ! JEK: Rain possible - endif - if(cloudsat_precip_pia(i,pr).gt.40) then - cloudsat_pflag(i,pr) = pClass_Rain4 ! JEK: Heavy Rain - endif - endif - - ! No precipitation - if(Ze_out(i,pr,cloudsat_preclvl_index(i)-1) .le. -15) then - cloudsat_pflag(i,pr) = pClass_noPrecip ! JEK: Not Precipitating - endif - endif ! Land points - enddo ! Sub-columns - enddo ! Gridpoints - - ! ###################################################################################### - ! COLUMN processing - ! ###################################################################################### - - ! Aggregate subcolumns - do i=1,Npoints - ! Gridmean precipitation fraction for each precipitation type - do k=1,nCloudsatPrecipClass - if (any(cloudsat_pflag(i,:) .eq. k-1)) then - cloudsat_precip_cover(i,k) = count(cloudsat_pflag(i,:) .eq. k-1) - endif - enddo - - ! Gridmean path integrated attenuation (pia) - cloudsat_pia(i)=sum(cloudsat_precip_pia(i,:)) - enddo - - ! Normalize by number of subcolumns - where ((cloudsat_precip_cover /= R_UNDEF).and.(cloudsat_precip_cover /= 0.0)) & - cloudsat_precip_cover = cloudsat_precip_cover / Ncolumns - where ((cloudsat_pia/= R_UNDEF).and.(cloudsat_pia/= 0.0)) & - cloudsat_pia = cloudsat_pia / Ncolumns - - end subroutine cloudsat_precipOccurence - - ! ############################################################################################## - ! ############################################################################################## - subroutine load_scale_LUTs(rcfg) - - type(radar_cfg), intent(inout) :: rcfg - logical :: LUT_file_exists - integer :: i,j,k,ind - - ! Load scale LUT from file - inquire(file=trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat', & - exist=LUT_file_exists) - - if(.not.LUT_file_exists) then - write(*,*) '*************************************************' - write(*,*) 'Warning: Could NOT FIND radar LUT file: ', & - trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat' - write(*,*) 'Will calculated LUT values as needed' - write(*,*) '*************************************************' - return - else - OPEN(unit=12,file=trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat',& - form='unformatted', & - err= 89, & - access='DIRECT',& - recl=28) - write(*,*) 'Loading radar LUT file: ', & - trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat' - - do i=1,maxhclass - do j=1,mt_ntt - do k=1,nRe_types - ind = i+(j-1)*maxhclass+(k-1)*(nRe_types*mt_ntt) - read(12,rec=ind) rcfg%Z_scale_flag(i,j,k), & - rcfg%Ze_scaled(i,j,k), & - rcfg%Zr_scaled(i,j,k), & - rcfg%kr_scaled(i,j,k) - enddo - enddo - enddo - close(unit=12) - return - endif - -89 write(*,*) 'Error: Found but could NOT READ radar LUT file: ', & - trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat' - - end subroutine load_scale_LUTs - - ! ############################################################################################## - ! ############################################################################################## - subroutine save_scale_LUTs(rcfg) - type(radar_cfg), intent(inout) :: rcfg - logical :: LUT_file_exists - integer :: i,j,k,ind - - inquire(file=trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat', & - exist=LUT_file_exists) - - OPEN(unit=12,file=trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat',& - form='unformatted',err= 99,access='DIRECT',recl=28) - - write(*,*) 'Creating or Updating radar LUT file: ', & - trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat' - - do i=1,maxhclass - do j=1,mt_ntt - do k=1,nRe_types - ind = i+(j-1)*maxhclass+(k-1)*(nRe_types*mt_ntt) - if(.not.LUT_file_exists .or. rcfg%Z_scale_added_flag(i,j,k)) then - rcfg%Z_scale_added_flag(i,j,k)=.false. - write(12,rec=ind) rcfg%Z_scale_flag(i,j,k), & - rcfg%Ze_scaled(i,j,k), & - rcfg%Zr_scaled(i,j,k), & - rcfg%kr_scaled(i,j,k) - endif - enddo - enddo - enddo - close(unit=12) - return - -99 write(*,*) 'Error: Unable to create/update radar LUT file: ', & - trim(rcfg%scale_LUT_file_name) // '_radar_Z_scale_LUT.dat' - return - - end subroutine save_scale_LUTs - ! ############################################################################################## - ! ############################################################################################## - subroutine quickbeam_init() - - - end subroutine quickBeam_init - ! ############################################################################################## - ! ############################################################################################## - - -end module quickbeam - - diff --git a/subsample_and_optics_example/optics/cosp_utils.F90.bak b/subsample_and_optics_example/optics/cosp_utils.F90.bak deleted file mode 100644 index 98c26cd5be..0000000000 --- a/subsample_and_optics_example/optics/cosp_utils.F90.bak +++ /dev/null @@ -1,89 +0,0 @@ -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -! Copyright (c) 2015, Regents of the University of Colorado -! All rights reserved. -! -! Redistribution and use in source and binary forms, with or without modification, are -! permitted provided that the following conditions are met: -! -! 1. Redistributions of source code must retain the above copyright notice, this list of -! conditions and the following disclaimer. -! -! 2. Redistributions in binary form must reproduce the above copyright notice, this list -! of conditions and the following disclaimer in the documentation and/or other -! materials provided with the distribution. -! -! 3. Neither the name of the copyright holder nor the names of its contributors may be -! used to endorse or promote products derived from this software without specific prior -! written permission. -! -! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL -! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT -! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -! -! History: -! Jul 2007 - A. Bodas-Salcedo - Initial version -! May 2015 - Dustin Swales - Modified for COSPv2.0 -! -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -MODULE MOD_COSP_UTILS - USE COSP_KINDS, ONLY: wp - USE MOD_COSP_CONFIG - IMPLICIT NONE - -CONTAINS -!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -!------------------- SUBROUTINE COSP_PRECIP_MXRATIO -------------- -!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -SUBROUTINE COSP_PRECIP_MXRATIO(Npoints,Nlevels,Ncolumns,p,T,prec_frac,prec_type, & - n_ax,n_bx,alpha_x,c_x,d_x,g_x,a_x,b_x,gamma1,gamma2,gamma3,gamma4, & - flux,mxratio,reff) - - ! Input arguments, (IN) - integer,intent(in) :: Npoints,Nlevels,Ncolumns - real(wp),intent(in),dimension(Npoints,Nlevels) :: p,T,flux - real(wp),intent(in),dimension(Npoints,Ncolumns,Nlevels) :: prec_frac - real(wp),intent(in) :: n_ax,n_bx,alpha_x,c_x,d_x,g_x,a_x,b_x,gamma1,gamma2,gamma3,gamma4,prec_type - ! Input arguments, (OUT) - real(wp),intent(out),dimension(Npoints,Ncolumns,Nlevels) :: mxratio - real(wp),intent(inout),dimension(Npoints,Ncolumns,Nlevels) :: reff - ! Local variables - integer :: i,j,k - real(wp) :: sigma,one_over_xip1,xi,rho0,rho,lambda_x,gamma_4_3_2,delta - - mxratio = 0.0 - - if (n_ax >= 0.0) then ! N_ax is used to control which hydrometeors need to be computed - xi = d_x/(alpha_x + b_x - n_bx + 1._wp) - rho0 = 1.29_wp - sigma = (gamma2/(gamma1*c_x))*(n_ax*a_x*gamma2)**xi - one_over_xip1 = 1._wp/(xi + 1._wp) - gamma_4_3_2 = 0.5_wp*gamma4/gamma3 - delta = (alpha_x + b_x + d_x - n_bx + 1._wp) - - do k=1,Nlevels - do j=1,Ncolumns - do i=1,Npoints - if ((prec_frac(i,j,k)==prec_type).or.(prec_frac(i,j,k)==3.)) then - rho = p(i,k)/(287.05_wp*T(i,k)) - mxratio(i,j,k)=(flux(i,k)*((rho/rho0)**g_x)*sigma)**one_over_xip1 - mxratio(i,j,k)=mxratio(i,j,k)/rho - ! Compute effective radius - if ((reff(i,j,k) <= 0._wp).and.(flux(i,k) /= 0._wp)) then - lambda_x = (a_x*c_x*((rho0/rho)**g_x)*n_ax*gamma1/flux(i,k))**(1._wp/delta) - reff(i,j,k) = gamma_4_3_2/lambda_x - endif - endif - enddo - enddo - enddo - endif -END SUBROUTINE COSP_PRECIP_MXRATIO - - -END MODULE MOD_COSP_UTILS diff --git a/subsample_and_optics_example/optics/quickbeam_optics/quickbeam_optics.F90.bak b/subsample_and_optics_example/optics/quickbeam_optics/quickbeam_optics.F90.bak deleted file mode 100644 index dd39c73b3a..0000000000 --- a/subsample_and_optics_example/optics/quickbeam_optics/quickbeam_optics.F90.bak +++ /dev/null @@ -1,1381 +0,0 @@ -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -! Copyright (c) 2015, Regents of the University of Colorado -! All rights reserved. -! -! Redistribution and use in source and binary forms, with or without modification, are -! permitted provided that the following conditions are met: -! -! 1. Redistributions of source code must retain the above copyright notice, this list of -! conditions and the following disclaimer. -! -! 2. Redistributions in binary form must reproduce the above copyright notice, this list -! of conditions and the following disclaimer in the documentation and/or other -! materials provided with the distribution. -! -! 3. Neither the name of the copyright holder nor the names of its contributors may be -! used to endorse or promote products derived from this software without specific prior -! written permission. -! -! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL -! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT -! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -! -! History: -! May 2015: Dustin Swales - Initial version -! -! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -module mod_quickbeam_optics - USE COSP_KINDS, ONLY: wp,dp - USE array_lib, ONLY: infind - USE math_lib, ONLY: path_integral,avint,gamma - USE optics_lib, ONLY: m_wat,m_ice,MieInt - USE cosp_math_constants, ONLY: pi - USE cosp_phys_constants, ONLY: rhoice - use quickbeam, ONLY: dmin,dmax,Re_BIN_LENGTH, & - Re_MAX_BIN,nRe_types,nd,maxhclass - use mod_cosp_config, ONLY: N_HYDRO - use mod_cosp_error, ONLY: errorMessage - use mod_cosp_stats, ONLY: radar_cfg - implicit none - - ! Derived type for particle size distribution - TYPE size_distribution - real(wp),dimension(maxhclass) :: p1,p2,p3,dmin,dmax,apm,bpm,rho - integer, dimension(maxhclass) :: dtype,phase - END TYPE size_distribution - - ! Parameters - integer,parameter :: & ! - cnt_liq = 19, & ! Liquid temperature count - cnt_ice = 20 ! Lce temperature count - - ! Initialization variables - real(wp),dimension(cnt_ice) :: mt_tti - real(wp),dimension(cnt_liq) :: mt_ttl - real(wp),dimension(nd) :: D - !logical :: lQuickbeamInit - -contains - ! ###################################################################################### - ! SUBROUTINE quickbeam_optics_init - ! ###################################################################################### - subroutine quickbeam_optics_init() - integer :: j - - mt_tti = (/ ((j-1)*5-90 + 273.15, j = 1, cnt_ice) /) - mt_ttl = (/ ((j-1)*5-60 + 273.15, j = 1, cnt_liq) /) - D(1) = dmin - do j=2,nd - D(j) = D(j-1)*exp((log(dmax)-log(dmin))/(nd-1)) - enddo - !lQuickbeamInit = .true. - end subroutine quickbeam_optics_init - - ! ###################################################################################### - ! SUBROUTINE QUICKBEAM_OPTICS - ! ###################################################################################### - subroutine quickbeam_optics(sd, rcfg, nprof, ngate, undef, hm_matrix, re_matrix, & - Np_matrix, p_matrix, t_matrix, sh_matrix,z_vol,kr_vol) - - ! INPUTS - type(size_distribution),intent(inout) :: & - sd ! - type(radar_cfg),intent(inout) :: & - rcfg ! - integer,intent(in) :: & - nprof, & ! Number of hydrometeor profiles - ngate ! Number of vertical layers - real(wp),intent(in) :: & - undef ! Missing data value - real(wp),intent(in),dimension(nprof,ngate) :: & - p_matrix, & ! Pressure profile (hPa) - t_matrix, & ! Temperature profile (K) - sh_matrix ! Specific humidity profile (%) -- only needed if gaseous aborption calculated. - real(wp),intent(in),dimension(nprof,ngate,rcfg%nhclass) :: & - re_matrix, & ! Table of hydrometeor effective radii. 0 ==> use defaults. (units=microns) - hm_matrix ! Table of hydrometeor mixing ratios (g/kg) - real(wp),intent(inout),dimension(nprof,ngate,rcfg%nhclass) :: & - Np_matrix ! Table of hydrometeor number concentration. 0 ==> use defaults. (units = 1/kg) - - ! OUTPUTS - real(wp),intent(out), dimension(nprof, ngate) :: & - z_vol, & ! Effective reflectivity factor (mm^6/m^3) - kr_vol ! Attenuation coefficient hydro (dB/km) - - ! INTERNAL VARIABLES - integer :: & - phase, ns,tp,j,k,pr,itt,iRe_type,n - logical :: & - hydro - real(wp) :: & - t_kelvin,Re_internal - real(wp) :: & - rho_a,kr,ze,zr,scale_factor,Re,Np,base,step - - real(wp),dimension(:),allocatable :: & - Deq, & ! Discrete drop sizes (um) - Ni, & ! Discrete concentrations (cm^-3 um^-1) - rhoi, & ! Discrete densities (kg m^-3) - xxa, & ! - Di ! Discrete drop sizes (um) - - real(wp), dimension(nprof, ngate) :: & - z_ray ! Reflectivity factor, Rayleigh only (mm^6/m^3) - - ! PARAMETERS - logical, parameter :: & ! - DO_LUT_TEST = .false., & ! - DO_NP_TEST = .false. ! - real(wp), parameter :: & - one_third = 1._wp/3._wp ! - - ! Initialization - z_vol = 0._wp - z_ray = 0._wp - kr_vol = 0._wp - - do k=1,ngate ! Loop over each profile (nprof) - do pr=1,nprof - ! Determine if hydrometeor(s) present in volume - hydro = .false. - do j=1,rcfg%nhclass - if ((hm_matrix(pr,k,j) > 1E-12) .and. (sd%dtype(j) > 0)) then - hydro = .true. - exit - endif - enddo - - t_kelvin = t_matrix(pr,k) - ! If there is hydrometeor in the volume - if (hydro) then - rho_a = (p_matrix(pr,k))/(287._wp*(t_kelvin)) - - ! Loop over hydrometeor type - do tp=1,rcfg%nhclass - Re_internal = re_matrix(pr,k,tp) - - if (hm_matrix(pr,k,tp) <= 1E-12) cycle - - ! Index into temperature dimension of scaling tables - ! These tables have regular steps -- exploit this and abandon infind - phase = sd%phase(tp) - if (phase==0) then - itt = infind(mt_ttl,t_kelvin) - else - itt = infind(mt_tti,t_kelvin) - endif - - ! Compute effective radius from number concentration and distribution parameters - if (Re_internal .eq. 0) then - call calc_Re(hm_matrix(pr,k,tp),Np_matrix(pr,k,tp),rho_a, & - sd%dtype(tp),sd%apm(tp),sd%bpm(tp),sd%rho(tp),sd%p1(tp),sd%p2(tp),sd%p3(tp),Re) - Re_internal=Re - !re_matrix(pr,k,tp)=Re - else - if (Np_matrix(pr,k,tp) > 0) then - call errorMessage('WARNING(optics/quickbeam_optics.f90): Re and Np set for the same volume & hydrometeor type. Np is being ignored.') - endif - Re = Re_internal - !Re = re_matrix(pr,k,tp) - endif - - ! Index into particle size dimension of scaling tables - iRe_type=1 - if(Re.gt.0) then - ! Determine index in to scale LUT - ! Distance between Re points (defined by "base" and "step") for - ! each interval of size Re_BIN_LENGTH - ! Integer asignment, avoids calling floor intrinsic - n=Re/Re_BIN_LENGTH - if (n>=Re_MAX_BIN) n=Re_MAX_BIN-1 - step = rcfg%step_list(n+1) - base = rcfg%base_list(n+1) - iRe_type=Re/step - if (iRe_type.lt.1) iRe_type=1 - Re=step*(iRe_type+0.5_wp) ! set value of Re to closest value allowed in LUT. - iRe_type=iRe_type+base-int(n*Re_BIN_LENGTH/step) - - ! Make sure iRe_type is within bounds - if (iRe_type.ge.nRe_types) then - !write(*,*) 'Warning: size of Re exceed value permitted ', & - ! 'in Look-Up Table (LUT). Will calculate. ' - ! No scaling allowed - iRe_type=nRe_types - rcfg%Z_scale_flag(tp,itt,iRe_type)=.false. - else - ! Set value in re_matrix to closest values in LUT - if (.not. DO_LUT_TEST) re_internal=Re - !if (.not. DO_LUT_TEST) re_matrix(pr,k,tp)=Re - endif - endif - - ! Use Ze_scaled, Zr_scaled, and kr_scaled ... if know them - ! if not we will calculate Ze, Zr, and Kr from the distribution parameters -! if( rcfg%Z_scale_flag(tp,itt,iRe_type) .and. .not. DO_LUT_TEST) then -! ! can use z scaling -! scale_factor=rho_a*hm_matrix(pr,k,tp) -! zr = rcfg%Zr_scaled(tp,itt,iRe_type) * scale_factor -! ze = rcfg%Ze_scaled(tp,itt,iRe_type) * scale_factor -! kr = rcfg%kr_scaled(tp,itt,iRe_type) * scale_factor -! else - if( (.not. rcfg%Z_scale_flag(tp,itt,iRe_type)) .or. DO_LUT_TEST) then - ! Create a discrete distribution of hydrometeors within volume - select case(sd%dtype(tp)) - case(4) - ns = 1 - allocate(Di(ns),Ni(ns),rhoi(ns),xxa(ns),Deq(ns)) - Di = sd%p1(tp) - Ni = 0._wp - case default - ns = nd ! constant defined in simulator/quickbeam.f90 - allocate(Di(ns),Ni(ns),rhoi(ns),xxa(ns),Deq(ns)) - Di = D - Ni = 0._wp - end select - call dsd(hm_matrix(pr,k,tp),re_internal,Np_matrix(pr,k,tp), & - Di,Ni,ns,sd%dtype(tp),rho_a,t_kelvin, & - sd%dmin(tp),sd%dmax(tp),sd%apm(tp),sd%bpm(tp), & - sd%rho(tp),sd%p1(tp),sd%p2(tp),sd%p3(tp)) - - ! Calculate particle density - if (phase == 1) then - if (sd%rho(tp) < 0) then - ! Use equivalent volume spheres. - rcfg%rho_eff(tp,1:ns,iRe_type) = rhoice ! solid ice == equivalent volume approach - Deq = ( ( 6/pi*sd%apm(tp)/rhoice) ** one_third ) * ( (Di*1E-6) ** (sd%bpm(tp)/3._wp) ) * 1E6 - ! alternative is to comment out above two lines and use the following block - ! MG Mie approach - adjust density of sphere with D = D_characteristic to match particle density - ! - ! rcfg%rho_eff(tp,1:ns,iRe_type) = (6/pi)*sd%apm(tp)*(Di*1E-6)**(sd%bpm(tp)-3) !MG Mie approach - - ! as the particle size gets small it is possible that the mass to size relationship of - ! (given by power law in hclass.data) can produce impossible results - ! where the mass is larger than a solid sphere of ice. - ! This loop ensures that no ice particle can have more mass/density larger than an ice sphere. - ! do i=1,ns - ! if(rcfg%rho_eff(tp,i,iRe_type) > 917 ) then - ! rcfg%rho_eff(tp,i,iRe_type) = 917 - ! endif - ! enddo - else - ! Equivalent volume sphere (solid ice rhoice=917 kg/m^3). - rcfg%rho_eff(tp,1:ns,iRe_type) = rhoice - Deq=Di * ((sd%rho(tp)/rhoice)**one_third) - ! alternative ... coment out above two lines and use the following for MG-Mie - ! rcfg%rho_eff(tp,1:ns,iRe_type) = sd%rho(tp) !MG Mie approach - endif - else - ! I assume here that water phase droplets are spheres. - ! sd%rho should be ~ 1000 or sd%apm=524 .and. sd%bpm=3 - Deq = Di - endif - - ! Calculate effective reflectivity factor of volume - ! xxa are unused (Mie scattering and extinction efficiencies) - xxa(1:ns) = -9.9_wp - rhoi = rcfg%rho_eff(tp,1:ns,iRe_type) - call zeff(rcfg%freq,Deq,Ni,ns,rcfg%k2,t_kelvin,phase,rcfg%do_ray, & - ze,zr,kr,xxa,xxa,rhoi) - - ! Test compares total number concentration with sum of discrete samples - ! The second test, below, compares ab initio and "scaled" computations - ! of reflectivity - ! These should get broken out as a unit test that gets called on - ! data. That routine could write to std out. - - ! Test code ... compare Np value input to routine with sum of DSD - ! NOTE: if .not. DO_LUT_TEST, then you are checking the LUT approximation - ! not just the DSD representation given by Ni - if(Np_matrix(pr,k,tp)>0 .and. DO_NP_TEST ) then - Np = path_integral(Ni,Di,1,ns-1)/rho_a*1.E6_wp - ! Note: Representation is not great or small Re < 2 - if( (Np_matrix(pr,k,tp)-Np)/Np_matrix(pr,k,tp)>0.1 ) then - call errorMessage('ERROR(optics/quickbeam_optics.f90): Error: Np input does not match sum(N)') - endif - endif - - ! Clean up space - deallocate(Di,Ni,rhoi,xxa,Deq) - - ! LUT test code - ! This segment of code compares full calculation to scaling result - if ( rcfg%Z_scale_flag(tp,itt,iRe_type) .and. DO_LUT_TEST ) then - scale_factor=rho_a*hm_matrix(pr,k,tp) - ! if more than 2 dBZe difference print error message/parameters. - if ( abs(10*log10(ze) - 10*log10(rcfg%Ze_scaled(tp,itt,iRe_type) * & - scale_factor)) > 2 ) then - call errorMessage('ERROR(optics/quickbeam_optics.f90): ERROR: Roj Error?') - endif - endif - else - ! Use z scaling - scale_factor=rho_a*hm_matrix(pr,k,tp) - zr = rcfg%Zr_scaled(tp,itt,iRe_type) * scale_factor - ze = rcfg%Ze_scaled(tp,itt,iRe_type) * scale_factor - kr = rcfg%kr_scaled(tp,itt,iRe_type) * scale_factor - endif ! end z_scaling - - kr_vol(pr,k) = kr_vol(pr,k) + kr - z_vol(pr,k) = z_vol(pr,k) + ze - z_ray(pr,k) = z_ray(pr,k) + zr - - ! Construct Ze_scaled, Zr_scaled, and kr_scaled ... if we can - if ( .not. rcfg%Z_scale_flag(tp,itt,iRe_type) ) then - if (iRe_type>1) then - scale_factor=rho_a*hm_matrix(pr,k,tp) - rcfg%Ze_scaled(tp,itt,iRe_type) = ze/ scale_factor - rcfg%Zr_scaled(tp,itt,iRe_type) = zr/ scale_factor - rcfg%kr_scaled(tp,itt,iRe_type) = kr/ scale_factor - rcfg%Z_scale_flag(tp,itt,iRe_type) = .true. - rcfg%Z_scale_added_flag(tp,itt,iRe_type)=.true. - endif - endif - enddo ! end loop of tp (hydrometeor type) - endif - enddo - enddo - - where(kr_vol(:,:) <= EPSILON(kr_vol)) - ! Volume is hydrometeor-free - !z_vol(:,:) = undef - z_ray(:,:) = undef - end where - - end subroutine quickbeam_optics - ! ############################################################################################## - ! ############################################################################################## - subroutine calc_Re(Q,Np,rho_a,dtype,apm,bpm,rho_c,p1,p2,p3,Re) - ! ############################################################################################## - ! Purpose: - ! Calculates Effective Radius (1/2 distribution 3rd moment / 2nd moment). - ! - ! For some distribution types, the total number concentration (per kg), Np - ! may be optionally specified. Should be set to zero, otherwise. - ! - ! Roj Marchand July 2010 - ! - ! Inputs: - ! - ! [Q] hydrometeor mixing ratio (g/kg) ! not needed for some distribution types - ! [Np] Optional Total number concentration (per kg). 0 = use defaults (p1, p2, p3) - ! [rho_a] ambient air density (kg m^-3) - ! - ! Distribution parameters as per quickbeam documentation. - ! [dtype] distribution type - ! [apm] a parameter for mass (kg m^[-bpm]) - ! [bmp] b params for mass - ! [p1],[p2],[p3] distribution parameters - ! - ! Outputs: - ! [Re] Effective radius, 1/2 the 3rd moment/2nd moment (um) - ! - ! Created: - ! July 2010 Roj Marchand - ! Modified: - ! 12/18/14 Dustin Swales: Define type REALs as double precision (dustin.swales@noaa.gov) - ! - ! ############################################################################################## - ! ############################################################################################## - - ! Inputs - real(wp), intent(in) :: Q,Np,rho_a,rho_c,p1,p2,p3 - integer, intent(in) :: dtype - real(wp), intent(inout) :: apm,bpm - - ! Outputs - real(wp), intent(out) :: Re - - ! Internal - integer :: local_dtype - real(wp) :: local_p3,local_Np,tmp1,tmp2 - real(wp) :: N0,D0,vu,dm,ld,rg,log_sigma_g ! gamma, exponential variables - - - ! If density is constant, set equivalent values for apm and bpm - if ((rho_c > 0) .and. (apm < 0)) then - apm = (pi/6)*rho_c - bpm = 3._wp - endif - - ! Exponential is same as modified gamma with vu =1 - ! if Np is specified then we will just treat as modified gamma - if(dtype .eq. 2 .and. Np .gt. 0) then - local_dtype = 1 - local_p3 = 1 - else - local_dtype = dtype - local_p3 = p3 - endif - select case(local_dtype) - - ! ---------------------------------------------------------! - ! Modified gamma ! - ! Np = total number concentration (1/kg) = Nt / rho_a ! - ! D0 = characteristic diameter (um) ! - ! dm = mean diameter (um) - first moment over zeroth moment! - ! vu = distribution width parameter ! - ! ---------------------------------------------------------! - case(1) - - if( abs(local_p3+2) < 1E-8) then - if(Np>1E-30) then - ! Morrison scheme with Martin 1994 shape parameter (NOTE: vu = pc +1) - ! fixed Roj. Dec. 2010 -- after comment by S. Mcfarlane - vu = (1/(0.2714_wp + 0.00057145_wp*Np*rho_a*1E-6))**2 ! units of Nt = Np*rhoa = #/cm^3 - else - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify a value for Np in each volume with Morrison/Martin Scheme.') - return - endif - elseif (abs(local_p3+1) > 1E-8) then - ! vu is fixed in hp structure - vu = local_p3 - else - ! vu isn't specified - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify a value for vu for Modified Gamma distribution') - return - endif - - if( Np.eq.0 .and. p2+1 > 1E-8) then ! use default value for MEAN diameter as first default - dm = p2 ! by definition, should have units of microns - D0 = gamma(vu)/gamma(vu+1)*dm - else ! use value of Np - if(Np.eq.0) then - if( abs(p1+1) > 1E-8 ) then ! use default number concentration - local_Np = p1 ! total number concentration / pa --- units kg^-1 - else - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify Np or default value (p1=Dm [um] or p2=Np [1/kg]) for Modified Gamma distribution') - return - endif - else - local_Np=Np; - endif - D0 = 1E6 * ( Q*1E-3*gamma(vu)/(apm*local_Np*gamma(vu+bpm)) )**(1/bpm) ! units = microns - endif - Re = 0.5_wp*D0*gamma(vu+3)/gamma(vu+2) - - ! ---------------------------------------------------------! - ! Exponential ! - ! N0 = intercept parameter (m^-4) ! - ! ld = slope parameter (um) ! - ! ---------------------------------------------------------! - case(2) - - ! Np not specified (see if statement above) - if((abs(p1+1) > 1E-8) ) then ! N0 has been specified, determine ld - N0 = p1 - tmp1 = 1._wp/(1._wp+bpm) - ld = ((apm*gamma(1._wp+bpm)*N0)/(rho_a*Q*1E-3))**tmp1 - ld = ld/1E6 ! set units to microns^-1 - elseif (abs(p2+1) > 1E-8) then ! lambda=ld has been specified as default - ld = p2 ! should have units of microns^-1 - else - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify Np or default value (p1=No or p2=lambda) for Exponential distribution') - return - endif - Re = 1.5_wp/ld - - ! ---------------------------------------------------------! - ! Power law ! - ! ahp = Ar parameter (m^-4 mm^-bhp) ! - ! bhp = br parameter ! - ! dmin_mm = lower bound (mm) ! - ! dmax_mm = upper bound (mm) ! - ! ---------------------------------------------------------! - case(3) - - Re=0._wp ! Not supporting LUT approach for power-law ... - if(Np>0) then - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Variable Np not supported for Power Law distribution') - return - endif - - ! ---------------------------------------------------------! - ! Monodisperse ! - ! D0 = particle diameter (um) == Re ! - ! ---------------------------------------------------------! - case(4) - - Re = p1 - if(Np>0) then - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Variable Np not supported for Monodispersed distribution') - return - endif - - ! ---------------------------------------------------------! - ! Lognormal ! - ! N0 = total number concentration (m^-3) ! - ! np = fixed number concentration (kg^-1) ! - ! rg = mean radius (um) ! - ! log_sigma_g = ln(geometric standard deviation) ! - ! ---------------------------------------------------------! - case(5) - - if( abs(local_p3+1) > 1E-8 ) then - !set natural log width - log_sigma_g = local_p3 - else - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify a value for sigma_g when using a Log-Normal distribution') - return - endif - - ! get rg ... - if( Np.eq.0 .and. (abs(p2+1) > 1E-8) ) then ! use default value of rg - rg = p2 - else - if(Np>0) then - local_Np=Np; - elseif(abs(p2+1) < 1E-8) then - local_Np=p1 - else - call errorMessage('ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify Np or default value (p2=Rg or p1=Np) for Log-Normal distribution') - endif - log_sigma_g = p3 - tmp1 = (Q*1E-3)/(2._wp**bpm*apm*local_Np) - tmp2 = exp(0.5_wp*bpm*bpm*(log_sigma_g))*exp(0.5_wp*bpm*bpm*(log_sigma_g)) - rg = ((tmp1/tmp2)**(1._wp/bpm))*1E6 - endif - Re = rg*exp(2.5_wp*(log_sigma_g*log_sigma_g)) - end select - end subroutine calc_Re - ! ############################################################################################## - ! ############################################################################################## - subroutine dsd(Q,Re,Np,D,N,nsizes,dtype,rho_a,tk,dmin,dmax,apm,bpm,rho_c,p1,p2,p3) - ! ############################################################################################## - ! Purpose: - ! Create a discrete drop size distribution - ! - ! Starting with Quickbeam V3, this routine now allows input of - ! both effective radius (Re) and total number concentration (Nt) - ! Roj Marchand July 2010 - ! - ! The version in Quickbeam v.104 was modified to allow Re but not Nt - ! This is a significantly modified form for the version - ! - ! Originally Part of QuickBeam v1.03 by John Haynes - ! http://reef.atmos.colostate.edu/haynes/radarsim - ! - ! Inputs: - ! - ! [Q] hydrometeor mixing ratio (g/kg) - ! [Re] Optional Effective Radius (microns). 0 = use defaults (p1, p2, p3) - ! - ! [D] array of discrete drop sizes (um) where we desire to know the number concentraiton n(D). - ! [nsizes] number of elements of [D] - ! - ! [dtype] distribution type - ! [rho_a] ambient air density (kg m^-3) - ! [tk] temperature (K) - ! [dmin] minimum size cutoff (um) - ! [dmax] maximum size cutoff (um) - ! [rho_c] alternate constant density (kg m^-3) - ! [p1],[p2],[p3] distribution parameters - ! - ! Input/Output: - ! [apm] a parameter for mass (kg m^[-bpm]) - ! [bmp] b params for mass - ! - ! Outputs: - ! [N] discrete concentrations (cm^-3 um^-1) - ! or, for monodisperse, a constant (1/cm^3) - ! - ! Requires: - ! function infind - ! - ! Created: - ! 11/28/05 John Haynes (haynes@atmos.colostate.edu) - ! Modified: - ! 01/31/06 Port from IDL to Fortran 90 - ! 07/07/06 Rewritten for variable DSD's - ! 10/02/06 Rewritten using scaling factors (Roger Marchand and JMH), Re added V1.04 - ! July 2020 "N Scale factors" (variable fc) removed (Roj Marchand). - ! 12/18/14 Define type REALs as double precision (dustin.swales@noaa.gov) - ! ############################################################################################## - - ! Inputs - integer, intent(in) :: & - nsizes,& ! Number of elements of [D] - dtype ! distribution type - real(wp),intent(in),dimension(nsizes) :: & - D ! Array of discrete drop sizes (um) where we desire to know the number concentraiton n(D). - real(wp),intent(in) :: & - Q, & ! Hydrometeor mixing ratio (g/kg) - Np, & ! - rho_a, & ! Ambient air density (kg m^-3) - tk, & ! Temperature (K) - dmin, & ! Minimum size cutoff (um) - dmax, & ! Maximum size cutoff (um) - rho_c, & ! Alternate constant density (kg m^-3) - p1, & ! Distribution parameter 1 - p2, & ! Distribution parameter 2 - p3 ! Distribution parameter 3 - real(wp),intent(inout) :: & - apm, & ! a parameter for mass (kg m^[-bpm]) - bpm, & ! b params for mass - Re ! Optional Effective Radius (microns) - - ! Outputs - real(wp),intent(out),dimension(nsizes) :: & - N ! Discrete concentrations (cm^-3 um^-1) - ! or, for monodisperse, a constant (1/cm^3) - - ! Internal Variables - real(wp),dimension(nsizes) :: & - fc - real(wp) :: & - N0,D0,vu,local_np,dm,ld, & ! gamma, exponential variables - dmin_mm,dmax_mm,ahp,bhp, & ! power law variables - rg,log_sigma_g, & ! lognormal variables - rho_e, & ! particle density (kg m^-3) - tmp1,tmp2,tc - integer :: & - k,lidx,uidx - - ! Convert temperature from Kelvin to Celsius - tc = tk - 273.15_wp - - ! If density is constant, store equivalent values for apm and bpm - if ((rho_c > 0) .and. (apm < 0)) then - apm = (pi/6)*rho_c - bpm = 3._wp - endif - - ! Will preferentially use Re input over Np. - ! if only Np given then calculate Re - ! if neigher than use other defaults (p1,p2,p3) following quickbeam documentation - if(Re==0 .and. Np>0) then - call calc_Re(Q,Np,rho_a,dtype,apm,bpm,rho_c,p1,p2,p3,Re) - endif - select case(dtype) - - ! ---------------------------------------------------------! - ! Modified gamma ! - ! np = total number concentration ! - ! D0 = characteristic diameter (um) ! - ! dm = mean diameter (um) - first moment over zeroth moment! - ! vu = distribution width parameter ! - ! ---------------------------------------------------------! - case(1) - - if( abs(p3+2) < 1E-8) then - if( Np>1E-30) then - ! Morrison scheme with Martin 1994 shape parameter (NOTE: vu = pc +1) - ! fixed Roj. Dec. 2010 -- after comment by S. Mcfarlane - vu = (1/(0.2714_wp + 0.00057145_wp*Np*rho_a*1E-6))**2._wp ! units of Nt = Np*rhoa = #/cm^3 - else - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Must specify a value for Np in each volume with Morrison/Martin Scheme.') - return - endif - elseif (abs(p3+1) > 1E-8) then - ! vu is fixed in hp structure - vu = p3 - else - ! vu isn't specified - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Must specify a value for vu for Modified Gamma distribution') - return - endif - - if(Re>0) then - D0 = 2._wp*Re*gamma(vu+2)/gamma(vu+3) - fc = (((D*1E-6)**(vu-1)*exp(-1*D/D0)) / & - (apm*((D0*1E-6)**(vu+bpm))*gamma(vu+bpm))) * 1E-12 - N = fc*rho_a*(Q*1E-3) - elseif( p2+1 > 1E-8) then ! use default value for MEAN diameter - dm = p2 - D0 = gamma(vu)/gamma(vu+1)*dm - fc = (((D*1E-6)**(vu-1)*exp(-1*D/D0)) / & - (apm*((D0*1E-6)**(vu+bpm))*gamma(vu+bpm))) * 1E-12 - N = fc*rho_a*(Q*1E-3) - elseif(abs(p3+1) > 1E-8) then! use default number concentration - local_np = p1 ! total number concentration / pa check - tmp1 = (Q*1E-3)**(1./bpm) - fc = (D*1E-6 / (gamma(vu)/(apm*local_np*gamma(vu+bpm)))**(1._wp/bpm))**vu - N = ((rho_a*local_np*fc*(D*1E-6)**(-1._wp))/(gamma(vu)*tmp1**vu) * & - exp(-1._wp*fc**(1._wp/vu)/tmp1)) * 1E-12 - else - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): No default value for Dm or Np provided!') - return - endif - - ! ---------------------------------------------------------! - ! Exponential ! - ! N0 = intercept parameter (m^-4) ! - ! ld = slope parameter (um) ! - ! ---------------------------------------------------------! - case(2) - - if(Re>0) then - ld = 1.5_wp/Re ! units 1/um - fc = (ld*1E6)**(1.+bpm)/(apm*gamma(1._wp+bpm))*exp(-1._wp*(ld*1E6)*(D*1E-6))*1E-12 - N = fc*rho_a*(Q*1E-3) - elseif (abs(p1+1) > 1E-8) then - ! Use N0 default value - N0 = p1 - tmp1 = 1._wp/(1._wp+bpm) - fc = ((apm*gamma(1._wp+bpm)*N0)**tmp1)*(D*1E-6) - N = (N0*exp(-1._wp*fc*(1._wp/(rho_a*Q*1E-3))**tmp1)) * 1E-12 - elseif (abs(p2+1) > 1E-8) then - ! Use default value for lambda - ld = p2 - fc = (ld*1E6)**(1._wp+bpm)/(apm*gamma(1._wp+bpm))*exp(-1._wp*(ld*1E6)*(D*1E-6))*1E-12 - N = fc*rho_a*(Q*1E-3) - else - ! ld "parameterized" from temperature (carry over from original Quickbeam). - ld = 1220._wp*10._wp**(-0.0245_wp*tc)*1E-6 - N0 = ((ld*1E6)**(1._wp+bpm)*Q*1E-3*rho_a)/(apm*gamma(1._wp+bpm)) - N = (N0*exp(-ld*D)) * 1E-12 - endif - - ! ---------------------------------------------------------! - ! Power law ! - ! ahp = Ar parameter (m^-4 mm^-bhp) ! - ! bhp = br parameter ! - ! dmin_mm = lower bound (mm) ! - ! dmax_mm = upper bound (mm) ! - ! ---------------------------------------------------------! - case(3) - - if(Re>0) then - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Variable Re not supported for Power-Law distribution') - return - elseif(Np>0) then - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Variable Np not supported for Power-Law distribution') - return - endif - - ! br parameter - if (abs(p1+2) < 1E-8) then - ! if p1=-2, bhp is parameterized according to Ryan (2000), - ! applicatable to cirrus clouds - if (tc < -30) then - bhp = -1.75_wp+0.09_wp*((tc+273._wp)-243.16_wp) - elseif ((tc >= -30) .and. (tc < -9)) then - bhp = -3.25_wp-0.06_wp*((tc+273._wp)-265.66_wp) - else - bhp = -2.15_wp - endif - elseif (abs(p1+3) < 1E-8) then - ! if p1=-3, bhp is parameterized according to Ryan (2000), - ! applicable to frontal clouds - if (tc < -35) then - bhp = -1.75_wp+0.09_wp*((tc+273._wp)-243.16_wp) - elseif ((tc >= -35) .and. (tc < -17.5)) then - bhp = -2.65_wp+0.09_wp*((tc+273._wp)-255.66_wp) - elseif ((tc >= -17.5) .and. (tc < -9)) then - bhp = -3.25_wp-0.06_wp*((tc+273._wp)-265.66_wp) - else - bhp = -2.15_wp - endif - else - ! Otherwise the specified value is used - bhp = p1 - endif - - ! Ar parameter - dmin_mm = dmin*1E-3 - dmax_mm = dmax*1E-3 - - ! Commented lines are original method with constant density - ! rc = 500. ! (kg/m^3) - ! tmp1 = 6*rho_a*(bhp+4) - ! tmp2 = pi*rc*(dmax_mm**(bhp+4))*(1-(dmin_mm/dmax_mm)**(bhp+4)) - ! ahp = (Q*1E-3)*1E12*tmp1/tmp2 - - ! New method is more consistent with the rest of the distributions - ! and allows density to vary with particle size - tmp1 = rho_a*(Q*1E-3)*(bhp+bpm+1) - tmp2 = apm*(dmax_mm**bhp*dmax**(bpm+1)-dmin_mm**bhp*dmin**(bpm+1)) - ahp = tmp1/tmp2 * 1E24 - ! ahp = tmp1/tmp2 - lidx = infind(D,dmin) - uidx = infind(D,dmax) - do k=lidx,uidx - N(k) = (ahp*(D(k)*1E-3)**bhp) * 1E-12 - enddo - - ! ---------------------------------------------------------! - ! Monodisperse ! - ! D0 = particle diameter (um) ! - ! ---------------------------------------------------------! - case(4) - - if (Re>0) then - D0 = Re - else - D0 = p1 - endif - - rho_e = (6._wp/pi)*apm*(D0*1E-6)**(bpm-3) - fc(1) = (6._wp/(pi*D0*D0*D0*rho_e))*1E12 - N(1) = fc(1)*rho_a*(Q*1E-3) - - ! ---------------------------------------------------------! - ! Lognormal ! - ! N0 = total number concentration (m^-3) ! - ! np = fixed number concentration (kg^-1) ! - ! rg = mean radius (um) ! - ! og_sigma_g = ln(geometric standard deviation) ! - ! ---------------------------------------------------------! - case(5) - if (abs(p1+1) < 1E-8 .or. Re>0 ) then - ! rg, log_sigma_g are given - log_sigma_g = p3 - tmp2 = (bpm*log_sigma_g)*(bpm*log_sigma_g) - if(Re.le.0) then - rg = p2 - else - !rg = Re*exp(-2.5*(log_sigma_g*log_sigma_g)) - rg =Re*exp(-2.5_wp*(log_sigma_g**2)) - - endif - - fc = 0.5_wp*((1._wp/((2._wp*rg*1E-6)**(bpm)*apm*(2._wp*pi)**(0.5_wp) * & - log_sigma_g*D*0.5_wp*1E-6))*exp(-0.5_wp*((log(0.5_wp*D/rg)/log_sigma_g)**2._wp+tmp2)))*1E-12 - N = fc*rho_a*(Q*1E-3) - - elseif (abs(p2+1) < 1E-8 .or. Np>0) then - ! Np, log_sigma_g are given - if(Np>0) then - local_Np = Np - else - local_Np = p1 - endif - - log_sigma_g = p3 - N0 = local_np*rho_a - tmp1 = (rho_a*(Q*1E-3))/(2._wp**bpm*apm*N0) - tmp2 = exp(0.5_wp*bpm*bpm*(log_sigma_g))*exp(0.5_wp*bpm*bpm*(log_sigma_g)) - rg = ((tmp1/tmp2)**(1/bpm))*1E6 - - N = 0.5_wp*(N0 / ((2._wp*pi)**(0.5_wp)*log_sigma_g*D*0.5_wp*1E-6) * & - exp((-0.5_wp*(log(0.5_wp*D/rg)/log_sigma_g)**2._wp)))*1E-12 - else - call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Must specify a value for sigma_g') - return - endif - end select - end subroutine dsd - ! ############################################################################################## - ! ############################################################################################## - subroutine zeff(freq,D,N,nsizes,k2,tt,ice,xr,z_eff,z_ray,kr,qe,qs,rho_e) - ! ############################################################################################## - ! Purpose: - ! Simulates radar return of a volume given DSD of spheres - ! Part of QuickBeam v1.03 by John Haynes - ! http://reef.atmos.colostate.edu/haynes/radarsim - ! - ! Inputs: - ! [freq] radar frequency (GHz) - ! [D] discrete drop sizes (um) - ! [N] discrete concentrations (cm^-3 um^-1) - ! [nsizes] number of discrete drop sizes - ! [k2] |K|^2, -1=use frequency dependent default - ! [tt] hydrometeor temperature (K) - ! [ice] indicates volume consists of ice - ! [xr] perform Rayleigh calculations? - ! [qe] if using a mie table, these contain ext/sca ... - ! [qs] ... efficiencies; otherwise set to -1 - ! [rho_e] medium effective density (kg m^-3) (-1 = pure) - ! - ! Outputs: - ! [z_eff] unattenuated effective reflectivity factor (mm^6/m^3) - ! [z_ray] reflectivity factor, Rayleigh only (mm^6/m^3) - ! [kr] attenuation coefficient (db km^-1) - ! - ! Created: - ! 11/28/05 John Haynes (haynes@atmos.colostate.edu) - ! Modified: - ! 12/18/14 Dustin Swales: Define type REALs as double precision (dustin.swales@noaa.gov) - ! ############################################################################################## - ! Inputs - integer, intent(in) :: & - ice, & ! Indicates volume consists of ice - xr, & ! Perform Rayleigh calculations? - nsizes ! Number of discrete drop sizes - real(wp), intent(in),dimension(nsizes) :: & - D, & ! Discrete drop sizes (um) - N, & ! Discrete concentrations (cm^-3 um^-1) - rho_e, & ! Medium effective density (kg m^-3) (-1 = pure) - qe, & ! Extinction efficiency, when using Mie tables - qs ! Scatering efficiency, when using Mie tables - real(wp),intent(in) :: & - freq, & ! Radar frequency (GHz) - tt ! Hydrometeor temperature (K) - real(wp), intent(inout) :: & - k2 ! |K|^2, -1=use frequency dependent default - - ! Outputs - real(wp), intent(out) :: & - z_eff, & ! Unattenuated effective reflectivity factor (mm^6/m^3) - z_ray, & ! Reflectivity factor, Rayleigh only (mm^6/m^3) - kr ! Attenuation coefficient (db km^-1) - - ! Internal Variables - integer :: correct_for_rho ! Correct for density flag - real(wp), dimension(nsizes) :: & - D0, & ! D in (m) - N0, & ! N in m^-3 m^-1 - sizep, & ! Size parameter - qext, & ! Extinction efficiency - qbsca, & ! Backscatter efficiency - f, & ! Ice fraction - xtemp ! - real(wp) :: & - wl, cr,eta_sum,eta_mie,const,z0_eff,z0_ray,k_sum,n_r,n_i,dqv(1),dqsc,dg,dph(1) - complex(wp) :: & - m, & ! Complex index of refraction of bulk form - Xs1(1), Xs2(1) ! - integer :: & - i, err ! - integer, parameter :: & - one=1 ! - real(wp),parameter :: & - conv_d = 1e-6, & ! Conversion factor for drop sizes (to m) - conv_n = 1e12, & ! Conversion factor for drop concentrations (to m^-3) - conv_f = 0.299792458 ! Conversion for radar frequency (to m) - complex(wp),dimension(nsizes) ::& - m0 ! Complex index of refraction - - ! Initialize - z0_ray = 0._wp - - ! Conversions - D0 = d*conv_d - N0 = n*conv_n - wl = conv_f/freq - - ! // dielectric constant |k^2| defaults - if (k2 < 0) then - k2 = 0.933_wp - if (abs(94.-freq) < 3.) k2=0.75_wp - if (abs(35.-freq) < 3.) k2=0.88_wp - if (abs(13.8-freq) < 3.) k2=0.925_wp - endif - - if (qe(1) < -9) then - - ! Get the refractive index of the bulk hydrometeors - if (ice == 0) then - call m_wat(freq,tt,n_r,n_i) - else - call m_ice(freq,tt,n_r,n_i) - endif - m = cmplx(n_r,-n_i) - m0(1:nsizes) = m - - correct_for_rho = 0 - if ((ice == 1) .and. (minval(rho_e) >= 0)) correct_for_rho = 1 - - ! Correct refractive index for ice density if needed - if (correct_for_rho == 1) then - f = rho_e/rhoice - m0 = sqrt((2+(m0*m0)+2*f*((m0*m0)-1))/(2+(m0*m0)+f*(1-(m0*m0)))) - endif - - ! Mie calculations - sizep = (pi*D0)/wl - dqv(1) = 0._wp - do i=1,nsizes - call mieint(sizep(i), m0(i), one, dqv, qext(i), dqsc, qbsca(i), & - dg, xs1, xs2, dph, err) - end do - - else - ! Mie table used - qext = qe - qbsca = qs - endif - - ! eta_mie = 0.25*sum[qbsca*pi*D^2*N(D)*deltaD] - ! <--------- eta_sum ---------> - ! z0_eff = (wl^4/!pi^5)*(1./k2)*eta_mie - eta_sum = 0._wp - if (size(D0) == 1) then - eta_sum = qbsca(1)*(n(1)*1E6)*D0(1)*D0(1) - else - xtemp = qbsca*N0*D0*D0 - call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),eta_sum) - endif - - eta_mie = eta_sum*0.25_wp*pi - const = ((wl*wl*wl*wl)/(pi*pi*pi*pi*pi))*(1._wp/k2) - - z0_eff = const*eta_mie - - ! kr = 0.25*cr*sum[qext*pi*D^2*N(D)*deltaD] - ! <---------- k_sum ---------> - k_sum = 0._wp - if (size(D0) == 1) then - k_sum = qext(1)*(n(1)*1E6)*D0(1)*D0(1) - else - xtemp = qext*N0*D0*D0 - call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),k_sum) - endif - ! DS2014 START: Making this calculation in double precision results in a small - ! amount of very small errors in the COSP output field,dBZE94, - ! so it will be left as is. - !cr = 10._wp/log(10._wp) - cr = 10./log(10.) - ! DS2014 STOP - kr = k_sum*0.25_wp*pi*(1000._wp*cr) - - ! z_ray = sum[D^6*N(D)*deltaD] - if (xr == 1) then - z0_ray = 0._wp - if (size(D0) == 1) then - z0_ray = (n(1)*1E6)*D0(1)*D0(1)*D0(1)*D0(1)*D0(1)*D0(1) - else - xtemp = N0*D0*D0*D0*D0*D0*D0 - call avint(xtemp,D0,nsizes,D0(1),D0(size(D0)),z0_ray) - endif - endif - - ! Convert to mm^6/m^3 - z_eff = z0_eff*1E18 ! 10.*alog10(z0_eff*1E18) - z_ray = z0_ray*1E18 ! 10.*alog10(z0_ray*1E18) - - end subroutine zeff - ! ############################################################################################## - ! ############################################################################################## - function gases(PRES_mb,T,SH,f) - ! ############################################################################################## - ! Purpose: - ! Compute 2-way gaseous attenuation through a volume in microwave - ! - ! Inputs: - ! [PRES_mb] pressure (mb) (hPa) - ! [T] temperature (K) - ! [RH] relative humidity (%) - ! [f] frequency (GHz), < 300 GHz - ! - ! Returns: - ! 2-way gaseous attenuation (dB/km) - ! - ! Reference: - ! Uses method of Liebe (1985) - ! - ! Created: - ! 12/09/05 John Haynes (haynes@atmos.colostate.edu) - ! Modified: - ! 01/31/06 Port from IDL to Fortran 90 - ! 12/19/14 Dustin Swales: Define type REALs as double precision (dustin.swales@noaa.gov) - ! ############################################################################################## - - ! INPUTS - real(wp), intent(in) :: & ! - PRES_mb, & ! Pressure (mb) (hPa) - T, & ! Temperature (K) - SH, & ! Specific humidity - f ! Frequency (GHz), < 300 GHz - - ! PARAMETERS - integer, parameter :: & ! - nbands_o2 = 48, & ! Number of O2 bands - nbands_h2o = 30 ! Number of h2o bands - ! LOCAL VARIABLES - real(wp) :: & - gases, th, e, p, sumo, gm0, a0, ap, term1, & - term2, term3, bf, be, term4, npp,e_th,one_th, & - pth3,eth35,aux1,aux2,aux3, aux4,gm,delt,x,y, & - gm2,fpp_o2,fpp_h2o,s_o2,s_h2o - integer :: i - - ! Table1 parameters v0, a1, a2, a3, a4, a5, a6 - real(wp),dimension(nbands_o2),parameter :: & - v0 = (/49.4523790,49.9622570,50.4742380,50.9877480,51.5033500, & - 52.0214090,52.5423930,53.0669060,53.5957480,54.1299999,54.6711570, & - 55.2213650,55.7838000,56.2647770,56.3378700,56.9681000,57.6124810, & - 58.3238740,58.4465890,59.1642040,59.5909820,60.3060570,60.4347750, & - 61.1505580,61.8001520,62.4112120,62.4862530,62.9979740,63.5685150, & - 64.1277640,64.6789000,65.2240670,65.7647690,66.3020880,66.8368270, & - 67.3695950,67.9008620,68.4310010,68.9603060,69.4890210,70.0173420, & - 118.7503410,368.4983500,424.7631200,487.2493700,715.3931500, & - 773.8387300, 834.1453300/), & - a1 = (/0.0000001,0.0000003,0.0000009,0.0000025,0.0000061,0.0000141, & - 0.0000310,0.0000641,0.0001247,0.0002280,0.0003918,0.0006316,0.0009535, & - 0.0005489,0.0013440,0.0017630,0.0000213,0.0000239,0.0000146,0.0000240, & - 0.0000211,0.0000212,0.0000246,0.0000250,0.0000230,0.0000193,0.0000152, & - 0.0000150,0.0000109,0.0007335,0.0004635,0.0002748,0.0001530,0.0000801, & - 0.0000395,0.0000183,0.0000080,0.0000033,0.0000013,0.0000005,0.0000002, & - 0.0000094,0.0000679,0.0006380,0.0002350,0.0000996,0.0006710,0.0001800/),& - a2 = (/11.8300000,10.7200000,9.6900000,8.8900000,7.7400000,6.8400000, & - 6.0000000,5.2200000,4.4800000,3.8100000,3.1900000,2.6200000,2.1150000, & - 0.0100000,1.6550000,1.2550000,0.9100000,0.6210000,0.0790000,0.3860000, & - 0.2070000,0.2070000,0.3860000,0.6210000,0.9100000,1.2550000,0.0780000, & - 1.6600000,2.1100000,2.6200000,3.1900000,3.8100000,4.4800000,5.2200000, & - 6.0000000,6.8400000,7.7400000,8.6900000,9.6900000,10.7200000,11.8300000,& - 0.0000000,0.0200000,0.0110000,0.0110000,0.0890000,0.0790000,0.0790000/),& - a3 = (/0.0083000,0.0085000,0.0086000,0.0087000,0.0089000,0.0092000, & - 0.0094000,0.0097000,0.0100000,0.0102000,0.0105000,0.0107900,0.0111000, & - 0.0164600,0.0114400,0.0118100,0.0122100,0.0126600,0.0144900,0.0131900, & - 0.0136000,0.0138200,0.0129700,0.0124800,0.0120700,0.0117100,0.0146800, & - 0.0113900,0.0110800,0.0107800,0.0105000,0.0102000,0.0100000,0.0097000, & - 0.0094000,0.0092000,0.0089000,0.0087000,0.0086000,0.0085000,0.0084000, & - 0.0159200,0.0192000,0.0191600,0.0192000,0.0181000,0.0181000,0.0181000/),& - a4 = (/0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & - 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & - 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & - 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & - 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & - 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & - 0.0000000,0.6000000,0.6000000,0.6000000,0.6000000,0.6000000,0.6000000/),& - a5 = (/0.0056000,0.0056000,0.0056000,0.0055000,0.0056000,0.0055000, & - 0.0057000,0.0053000,0.0054000,0.0048000,0.0048000,0.0041700,0.0037500, & - 0.0077400,0.0029700,0.0021200,0.0009400,-0.0005500,0.0059700,-0.0024400,& - 0.0034400,-0.0041300,0.0013200,-0.0003600,-0.0015900,-0.0026600, & - -0.0047700,-0.0033400,-0.0041700,-0.0044800,-0.0051000,-0.0051000, & - -0.0057000,-0.0055000,-0.0059000,-0.0056000,-0.0058000,-0.0057000, & - -0.0056000,-0.0056000,-0.0056000,-0.0004400,0.0000000,0.0000000, & - 0.0000000,0.0000000,0.0000000,0.0000000/), & - a6 = (/1.7000000,1.7000000,1.7000000,1.7000000,1.8000000,1.8000000, & - 1.8000000,1.9000000,1.8000000,2.0000000,1.9000000,2.1000000,2.1000000, & - 0.9000000,2.3000000,2.5000000,3.7000000,-3.1000000,0.8000000,0.1000000, & - 0.5000000,0.7000000,-1.0000000,5.8000000,2.9000000,2.3000000,0.9000000, & - 2.2000000,2.0000000,2.0000000,1.8000000,1.9000000,1.8000000,1.8000000, & - 1.7000000,1.8000000,1.7000000,1.7000000,1.7000000,1.7000000,1.7000000, & - 0.9000000,1.0000000,1.0000000,1.0000000,1.0000000,1.0000000,1.0000000/) - - ! Table2 parameters v1, b1, b2, b3 - real(wp),dimension(nbands_h2o),parameter :: & - v1 = (/22.2350800,67.8139600,119.9959400,183.3101170,321.2256440, & - 325.1529190,336.1870000,380.1973720,390.1345080,437.3466670,439.1508120, & - 443.0182950,448.0010750,470.8889740,474.6891270,488.4911330,503.5685320, & - 504.4826920,556.9360020,620.7008070,658.0065000,752.0332270,841.0735950, & - 859.8650000,899.4070000,902.5550000,906.2055240,916.1715820,970.3150220, & - 987.9267640/), & - b1 = (/0.1090000,0.0011000,0.0007000,2.3000000,0.0464000,1.5400000, & - 0.0010000,11.9000000,0.0044000,0.0637000,0.9210000,0.1940000,10.6000000, & - 0.3300000,1.2800000,0.2530000,0.0374000,0.0125000,510.0000000,5.0900000, & - 0.2740000,250.0000000,0.0130000,0.1330000,0.0550000,0.0380000,0.1830000, & - 8.5600000,9.1600000,138.0000000/), & - b2 = (/2.1430000,8.7300000,8.3470000,0.6530000,6.1560000,1.5150000, & - 9.8020000,1.0180000,7.3180000,5.0150000,3.5610000,5.0150000,1.3700000, & - 3.5610000,2.3420000,2.8140000,6.6930000,6.6930000,0.1140000,2.1500000, & - 7.7670000,0.3360000,8.1130000,7.9890000,7.8450000,8.3600000,5.0390000, & - 1.3690000,1.8420000,0.1780000/), & - b3 = (/0.0278400,0.0276000,0.0270000,0.0283500,0.0214000,0.0270000, & - 0.0265000,0.0276000,0.0190000,0.0137000,0.0164000,0.0144000,0.0238000, & - 0.0182000,0.0198000,0.0249000,0.0115000,0.0119000,0.0300000,0.0223000, & - 0.0300000,0.0286000,0.0141000,0.0286000,0.0286000,0.0264000,0.0234000, & - 0.0253000,0.0240000,0.0286000/) - - ! Conversions - th = 300._wp/T ! unitless - - ! DS2014 START: Using _wp for the exponential in the denominator results in slight errors - ! for dBze94. 0.01 % of values differ, relative range: 1.03e-05 to 1.78e-04 - !e = (RH*th*th*th*th*th)/(41.45_wp*10**(9.834_wp*th-10)) ! kPa - !e = (RH*th*th*th*th*th)/(41.45_wp*10**(9.834_wp*th-10)) ! kPa - e = SH*PRES_mb/(SH+0.622_wp)/1000._wp !kPa - ! DS2014 END - - p = PRES_mb/1000._wp-e ! kPa - e_th = e*th - one_th = 1 - th - pth3 = p*th*th*th - eth35 = e*th**(3.5) - - ! Term1 - sumo = 0._wp - aux1 = 1.1_wp*e_th - do i=1,nbands_o2 - aux2 = f/v0(i) - aux3 = v0(i)-f - aux4 = v0(i)+f - gm = a3(i)*(p*th**(0.8_wp-a4(i))+aux1) - gm2 = gm*gm - delt = a5(i)*p*th**a6(i) - x = aux3*aux3+gm2 - y = aux4*aux4+gm2 - fpp_o2 = (((1._wp/x)+(1._wp/y))*(gm*aux2) - (delt*aux2)*((aux3/(x))-(aux4/(x)))) - s_o2 = a1(i)*pth3*exp(a2(i)*one_th) - sumo = sumo + fpp_o2 * s_o2 - enddo - term1 = sumo - - ! Term2 - gm0 = 5.6E-3_wp*(p+1.1_wp*e)*th**(0.8_wp) - a0 = 3.07E-4_wp - ap = 1.4_wp*(1-1.2_wp*f**(1.5_wp)*1E-5)*1E-10 - term2 = (2*a0*(gm0*(1+(f/gm0)*(f/gm0))*(1+(f/60._wp)**2))**(-1) + ap*p*th**(2.5_wp))*f*p*th*th - - ! Term3 - sumo = 0._wp - aux1 = 4.8_wp*e_th - do i=1,nbands_h2o - aux2 = f/v1(i) - aux3 = v1(i)-f - aux4 = v1(i)+f - gm = b3(i)*(p*th**(0.8)+aux1) - gm2 = gm*gm - x = aux3*aux3+gm2 - y = aux4*aux4+gm2 - fpp_h2o = ((1._wp/x)+(1._wp/y))*(gm*aux2) ! - (delt*aux2)*((aux3/(x))-(aux4/(x))) - s_h2o = b1(i)*eth35*exp(b2(i)*one_th) - sumo = sumo + fpp_h2o * s_h2o - enddo - term3 = sumo - - ! Term4 - bf = 1.4E-6_wp - be = 5.41E-5_wp - term4 = (bf*p+be*e*th*th*th)*f*e*th**(2.5_wp) - - ! Summation and result - npp = term1 + term2 + term3 + term4 - gases = 0.182_wp*f*npp - - end function gases - subroutine hydro_class_init(lsingle,ldouble,sd) - ! ############################################################################################## - ! Purpose: - ! - ! Initialize variables used by the radar simulator. - ! Part of QuickBeam v3.0 by John Haynes and Roj Marchand - ! - ! Inputs: - ! NAME SIZE DESCRIPTION - ! [lsingle] (1) Logical flag to use single moment - ! [ldouble] (1) Logical flag to use two moment - ! Outputs: - ! [sd] Structure that define hydrometeor types - ! - ! Local variables: - ! [n_hydro] (1) Number of hydrometeor types - ! [hclass_type] (nhclass) Type of distribution (see quickbeam documentation) - ! [hclass_phase] (nhclass) 1==ice, 0=liquid - ! [hclass_dmin] (nhclass) Minimum diameter allowed is drop size distribution N(DDmax)=0 - ! [hclass_apm] (nhclass) Density of partical apm*D^bpm or constant = rho - ! [hclass_bpm] (nhclass) Density of partical apm*D^bpm or constant = rho - ! [hclass_rho] (nhclass) Density of partical apm*D^bpm or constant = rho - ! [hclass_p1] (nhclass) Default values of DSD parameters (see quickbeam documentation) - ! [hclass_p2] (nhclass) Default values of DSD parameters (see quickbeam documentation) - ! [hclass_p3] (nhclass) Default values of DSD parameters (see quickbeam documentation) - ! Modified: - ! 08/23/2006 placed into subroutine form (Roger Marchand) - ! June 2010 New interface to support "radar_simulator_params" structure - ! 12/22/2014 Moved radar simulator (CLOUDSAT) configuration initialization to cloudsat_init - ! ############################################################################################## - - ! #################################################################################### - ! NOTES on HCLASS variables - ! - ! TYPE - Set to - ! 1 for modified gamma distribution, - ! 2 for exponential distribution, - ! 3 for power law distribution, - ! 4 for monodisperse distribution, - ! 5 for lognormal distribution. - ! - ! PHASE - Set to 0 for liquid, 1 for ice. - ! DMIN - The minimum drop size for this class (micron), ignored for monodisperse. - ! DMAX - The maximum drop size for this class (micron), ignored for monodisperse. - ! Important note: The settings for DMIN and DMAX are - ! ignored in the current version for all distributions except for power - ! law. Except when the power law distribution is used, particle size - ! is fixed to vary from zero to infinity, a restriction that is expected - ! to be lifted in future versions. A placeholder must still be specified - ! for each. - ! Density of particles is given by apm*D^bpm or a fixed value rho. ONLY specify ONE of these two!! - ! APM - The alpha_m coefficient in equation (1) (kg m**-beta_m ) - ! BPM - The beta_m coefficient in equation (1), see section 4.1. - ! RHO - Hydrometeor density (kg m-3 ). - ! - ! P1, P2, P3 - are default distribution parameters that depend on the type - ! of distribution (see quickmbeam documentation for more information) - ! - ! Modified Gamma (must set P3 and one of P1 or P2) - ! P1 - Set to the total particle number concentration Nt /rho_a (kg-1 ), where - ! rho_a is the density of air in the radar volume. - ! P2 - Set to the particle mean diameter D (micron). - ! P3 - Set to the distribution width nu. - ! - ! Exponetial (set one of) - ! P1 - Set to a constant intercept parameter N0 (m-4). - ! P2 - Set to a constant lambda (micron-1). - ! - ! Power Law - ! P1 - Set this to the value of a constant power law parameter br - ! - ! Monodisperse - ! P1 - Set to a constant diameter D0 (micron) = Re. - ! - ! Log-normal (must set P3 and one of P1 or P2) - ! P1 - Set to the total particle number concentration Nt /rho_a (kg-1 ) - ! P2 - Set to the geometric mean particle radius rg (micron). - ! P3 - Set to the natural logarithm of the geometric standard deviation. - ! #################################################################################### - ! INPUTS - logical,intent(in) :: & - lsingle, & ! True -> use single moment - ldouble ! True -> use two moment - - ! OUTPUTS - type(size_distribution),intent(out) ::& - sd ! - - ! SINGLE MOMENT PARAMETERS - integer,parameter,dimension(N_HYDRO) :: & - ! LSL LSI LSR LSS CVL CVI CVR CVS LSG - HCLASS1_TYPE = (/5, 1, 2, 2, 5, 1, 2, 2, 2/), & ! - HCLASS1_PHASE = (/0, 1, 0, 1, 0, 1, 0, 1, 1/) ! - real(wp),parameter,dimension(N_HYDRO) ::& - ! LSL LSI LSR LSS CVL CVI CVR CVS LSG - HCLASS1_DMIN = (/ -1., -1., -1., -1., -1., -1., -1., -1., -1. /), & - HCLASS1_DMAX = (/ -1., -1., -1., -1., -1., -1., -1., -1., -1. /), & - HCLASS1_APM = (/524., 110.8, 524., -1., 524., 110.8, 524., -1., -1. /), & - HCLASS1_BPM = (/ 3., 2.91, 3., -1., 3., 2.91, 3., -1., -1. /), & - HCLASS1_RHO = (/ -1., -1., -1., 100., -1., -1., -1., 100., 400. /), & - HCLASS1_P1 = (/ -1., -1., 8.e6, 3.e6, -1., -1., 8.e6, 3.e6, 4.e6/), & - HCLASS1_P2 = (/ 6., 40., -1., -1., 6., 40., -1., -1., -1. /), & - HCLASS1_P3 = (/ 0.3, 2., -1., -1., 0.3, 2., -1., -1., -1. /) - - ! TWO MOMENT PARAMETERS - integer,parameter,dimension(N_HYDRO) :: & - ! LSL LSI LSR LSS CVL CVI CVR CVS LSG - HCLASS2_TYPE = (/ 1, 1, 1, 1, 1, 1, 1, 1, 1/), & - HCLASS2_PHASE = (/ 0, 1, 0, 1, 0, 1, 0, 1, 1/) - - real(wp),parameter,dimension(N_HYDRO) :: & - ! LSL LSI LSR LSS CVL CVI CVR CVS LSG - HCLASS2_DMIN = (/ -1, -1, -1, -1, -1, -1, -1, -1, -1/), & - HCLASS2_DMAX = (/ -1, -1, -1, -1, -1, -1, -1, -1, -1/), & - HCLASS2_APM = (/524, -1, 524, -1, 524, -1, 524, -1, -1/), & - HCLASS2_BPM = (/ 3, -1, 3, -1, 3, -1, 3, -1, -1/), & - HCLASS2_RHO = (/ -1, 500, -1, 100, -1, 500, -1, 100, 900/), & - HCLASS2_P1 = (/ -1, -1, -1, -1, -1, -1, -1, -1, -1/), & - HCLASS2_P2 = (/ -1, -1, -1, -1, -1, -1, -1, -1, -1/), & - HCLASS2_P3 = (/ -2, 1, 1, 1, -2, 1, 1, 1, 1/) - - if (lsingle) then - sd%dtype(1:N_HYDRO) = HCLASS1_TYPE(1:N_HYDRO) - sd%phase(1:N_HYDRO) = HCLASS1_PHASE(1:N_HYDRO) - sd%dmin(1:N_HYDRO) = HCLASS1_DMIN(1:N_HYDRO) - sd%dmax(1:N_HYDRO) = HCLASS1_DMAX(1:N_HYDRO) - sd%apm(1:N_HYDRO) = HCLASS1_APM(1:N_HYDRO) - sd%bpm(1:N_HYDRO) = HCLASS1_BPM(1:N_HYDRO) - sd%rho(1:N_HYDRO) = HCLASS1_RHO(1:N_HYDRO) - sd%p1(1:N_HYDRO) = HCLASS1_P1(1:N_HYDRO) - sd%p2(1:N_HYDRO) = HCLASS1_P2(1:N_HYDRO) - sd%p3(1:N_HYDRO) = HCLASS1_P3(1:N_HYDRO) - endif - if (ldouble) then - sd%dtype(1:N_HYDRO) = HCLASS2_TYPE(1:N_HYDRO) - sd%phase(1:N_HYDRO) = HCLASS2_PHASE(1:N_HYDRO) - sd%dmin(1:N_HYDRO) = HCLASS2_DMIN(1:N_HYDRO) - sd%dmax(1:N_HYDRO) = HCLASS2_DMAX(1:N_HYDRO) - sd%apm(1:N_HYDRO) = HCLASS2_APM(1:N_HYDRO) - sd%bpm(1:N_HYDRO) = HCLASS2_BPM(1:N_HYDRO) - sd%rho(1:N_HYDRO) = HCLASS2_RHO(1:N_HYDRO) - sd%p1(1:N_HYDRO) = HCLASS2_P1(1:N_HYDRO) - sd%p2(1:N_HYDRO) = HCLASS2_P2(1:N_HYDRO) - sd%p3(1:N_HYDRO) = HCLASS2_P3(1:N_HYDRO) - endif - end subroutine hydro_class_init -end module mod_quickbeam_optics From c5691266093ef071bbb202ffe41767bc6c6f4a36 Mon Sep 17 00:00:00 2001 From: yuhi-n Date: Fri, 10 Apr 2026 14:38:52 +0900 Subject: [PATCH 3/3] update 260410 --- build/Makefile.conf | 6 +-- driver/run/cosp2_input_nl.txt | 2 +- driver/run/cosp2_test | Bin 28621064 -> 0 bytes .../optics/cosp_utils.F90 | 46 +----------------- 4 files changed, 4 insertions(+), 50 deletions(-) delete mode 100755 driver/run/cosp2_test diff --git a/build/Makefile.conf b/build/Makefile.conf index f13de720be..508f04a27a 100644 --- a/build/Makefile.conf +++ b/build/Makefile.conf @@ -1,7 +1,5 @@ -F90 = gfortran -F90FLAGS = -O3 -ffree-line-length-none -fcheck=bounds -finit-real=nan -fbounds-check - -NFHOME = /opt/homebrew +#F90 = gfortran +#F90FLAGS = -O3 -ffree-line-length-none -fcheck=bounds -finit-real=nan F90_LIB = ${NFHOME} NC_INC = -I$(NFHOME)/include diff --git a/driver/run/cosp2_input_nl.txt b/driver/run/cosp2_input_nl.txt index 536bf27724..3520ac6a55 100644 --- a/driver/run/cosp2_input_nl.txt +++ b/driver/run/cosp2_input_nl.txt @@ -36,7 +36,7 @@ DINPUT='./', ! Directory where the input files are located. Useful when processing multiple files. ! Leave blank ('') if you are using the full path in FINPUT. FINPUT='../data/inputs/UKMO/cosp_input_um.nc', ! List input NetCDF files - FOUTPUT='../data/outputs/cosp2_output_um.nc', + FOUTPUT='../data/outputs/UKMO/cosp2_output_um.nc', !---------------------------------------------------------------------------------- !--------------- Inputs related to radar simulations !---------------------------------------------------------------------------------- diff --git a/driver/run/cosp2_test b/driver/run/cosp2_test deleted file mode 100755 index c1e262a605680eaed12b0207108a53223a36841b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28621064 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Ð{Ia4+Om^(5lbwBhj}yF{&~X^r8V1Y@4RlV}BgxlJ@3;&N)$RtQVsz z*TR=F^-undy?vfxUHn!X_Hm181Bpi-=DQj$4pM#S?rRyudV;=OpQ_^1ei%waxOp}k z)`rZC(o#ALWKAaAeFnH5;Fd(3u@DM-6a&z&#U*dxmgJ`dllg4BSJ&b%pYOoN!xuOXpFB5xNQj zw=9zGe-Z9<^nW_y3R#j|0bPaBeHFM-E}XLlF6I3K{MDbsJvn*kyIBK)6WM}q+Fw*T z2TD=sC+jo`FV6#d4}v%FC@tac0&a|}LdBEu-~Kmjl;kB_>`ZGUks7m(o-b?GXmD z%Ama)vU)-~c!F^A(I2`dU)hpe8mWV|Dy{)t+-EJ5PLj)&WJ9{ek39=EpJ_Bh~m+Ot+GuTGVpU{7mAnaMXuaeD#L)Jww+$<___)KALY7m_UnII@VdSjY$AksW=4 zJ;c;T$op`2pWIKPJ-9?O2Q;HK*)E`MBsj@OvRQ~u#SO-EDnUo+-%jWIMLd5UX

U zT78nt{V^9DlKB(h$wz-d<{FYY#Ous2@cNKw{{oFS0oV1$+h3CP zMrqCFkgSJ@Peqn7pK6jd#Aoj>@Ogn~i2aRecuCd)?XuQ{(bzxKjQ>ukj7FmTs_>m; zmWSps-7fMlS6o{jlKFAq)aGZa{B%6sCh`Kn-G;jmU=M3GUW7wssoTODN`I8gdrf-G zeb%nz=^y!p^bY~9+ku{5{b$JoF*Xm$IiL9C+l=K5g3m$DXVx$9nL+7~_BBqA`@(9U z;OTGqh4h7h8_PLJ%JhWf97lXAGK~2I!RHX?Gwc`m+yuB@RtKT$THOCfe5p+GT!SSl zi`p$z)@h9y8V$WX2uAg@7vQnzQ&7AXwuQ$JWS02Kqx|(RWG*F7>A_i?}OAOsm`ndFakS>PwLfb?A5b z-yFoc1CRPr{{*jH*=f=_>W2ZhPE4=#psyvO|AfBNrd=a&x2W2GvNrA#yH~EYB}+2; zMsyC2^mr6~D5Bp2U&MLxV733Gx1+~ETQ2P>>A2KBs(8V{lI+DeR%>r5eE_&R9^urs zq@rG?qEB{Hd%JwFBTjxA$FYTQUhIfdq2YK!I6FJyl%{h!atP-c;K*Wk1KDqqk8A0AfO{|!cO~Jb^tu*T1}^r1hU;%J;qFVj78hp$Px@&b~czc;% zROuPXIUIV8mKw zdnOWhFX3)6k{7r*rx7m0PQtxxKsN|n?C}Z5ts>lg26SCH=%+{GK0&zo2JM{>xRsH( zYYF$HQGEq&bYy*9PPi=wxUP|sd?`}D52!L2l!Xtt??vL45bjX}x}ztJG$hI$TB`lxR+C}ZFhaZogRsMN~LRHX93_YjI^`A6Yjot z+~e)-xj_AxNZiAOo8MkHL%7uE`7$zZ`&7CHxIW;15Q)2oaO>O4B1AU;+})A5&#H9W z^&7$!u(zQ!5_dDgTOr+iTgI;=C|X1)n4~)0_JTZahrh~(T6GR z!}aG8+Vg#&BhFDxH*yH)g^oDcy8cYjgA)M-tI43o`@P%+Tcf>iW;b6^M zw~Ie@#5t*zm0)hi@pZ(Ru9s&Br|cRW%?5oToCiAMlxjGE5YF8lak4cWL2Q?2PDh-4 z-QGhu(>vmn=<WwReGqfYl z2o1*Dm#eMK7-qP8@LLe1q|uFA8&~k+v@o?sNm( z0B}npalcyt+!6y^0qerD(@xMvBs!T{F?+!>L$rwDh80d4@e(<5>J zPPp|3xI(lfPmRPqOt||DaIrs5o*aq0k8qC~;QD}D7>T=wa8DZG27sF%iTf`lp0|S0H?Mrk6~X(qwt;B!n;j)(Q67untY~WZWn`H05SXkrU_T{)~CF6!>Hy zxoh|3vGb5q_{u7kX?dxw)L_G6q=z*a(GvE6W)S-;uokV;9NgD{W{sBK*GZbE)5JMv zl}{j6`h7UfXEd5v+tz6=vKi1ksHIPimvo)iKB2*GPmpd7r@39DiM4W_<~#WYG!JR% zvA=qZF6R~vhBeO-fXQ`Sk7~ZL?yl1t>@uLYO-nnhv(#6ow^D;G?jmIX=GzrU4{P{3 zy(va{uGZ29Qlw;^o>zlmk5n9BuXqbp|IisY+aV7%`vsJ1D$X&Sg%6ky)Vo>I8h^eA z`8bI4DZMOBG`IRA#rMHiY)?zmtEGkhx}kY~m-p3JH)xQbPNG#?5`{al;4ckl0MFrU zwF~z$!FC>+4p{BND1SZXkmWB;jLzS66>4yfTKM`&l^^E+iT-#qv!xTiZjJw<_-Np# z@%Tp+pK8XPJv@Gz;*){jjmJ+=yb$xtDLnoz#q*KA3y;4|@n)p&%;RrRybZn$vUvOm z#p{tj8;>8R_(G)5;PF=}UW4>~c>DmxSAu_U9)FqQsJEmalK(}DFF^VpJl;t0E6`_m z9^Xar>`;E|DBd6Gwfya%_+^{}LjG#WCqaih1UGiIsCNj`8Era~9gleJ!inv7znY=n zx`WuOg1SrRTOT8O)n-A*z$2N@H672Scp=iOHrcK54vOa^y{6;eQM>~34<`EE8gHez7x{y{WT*d)HcVbv z2)}V(ZC3rJ!iH;6pM_O&tbn`R^56qKbCm#_g}>QO7VOa*KtH^C3xMyWgkWH zZOE&Z_u&-B`bMBX|2{U1p(Z zcWEBm3B2I9t2c`lp|dqckaot1m2_8Kb0FijHk|#6gFbcv2mX(wv-f7dR*y7Z$}`T^ zHd}$+qB zUO>xh6!^3tuL5N7c922nAOrFX8F-$(nhbwB+d&5WGpM=dkCb+xdzUN9J3$?iagNp4VX1Mie65d2{M9 z6MRs}xVP)KhzEf`5>N8&Teq(_?mX-*HB_WZ_1UOTNmix4Bvsl8e=u@?#M7b`qO+$a zm+i#AclYQ#wrf1rt+Qj4J=+MDi}y~-o+t3Wh2CS8J@CD|9)DrG6#Spbpn2LDn<5tR=e( z@behe-InYWWe@D39(LK1-BqbaxwN>uDI&_SWN*BrOwMC_rslCv`wNP)0Pkh=9;GPx zcrT=PlcK<9%${a?H!FMUbD6S`-bH0kO&(KL(z`{e7$9s_{r4mb(u2^k99QTMtTX3e zFUBUE8J^~Q%H)?zC;4&TX%5BFFWh9?1lX}jeqoI{XN-m?JOS9niGI%#bIy1T=BWhi z$|Qf_VRH`li>UNm>jC?6lHa!2oHI&;1PZo=Mz zP3?Vdv^gY;yc9Ssll<_Tq{>EVNI&PqUhta!2L7wp+>3q}L6Lq-Lr55_Cn}Pon^pS~i<+joIz8g9%87{@cFWw;8H|-6x zRZ6h=PILn8i7D`Nnr)R@zKOzJvVu}upU22IP%zr0klaZa>(Mh2`*kqidOX&ZsK#p_ zgpUWD(IfwEX z_vN3>uqe-!<+8?#JoeepDCGcb=!*r>%BS8K<$K&?`(^)5%6~A<9QT1~YwgrY*yjve z!(Ol28IzcRxux1tyf2)&y!K?&@~=uTW_i=a$OlnyeFpCMa8VwZT!CjCp6}tAgl9FL zDR|c4nTF>vJh9FuZ^JVK&-Hj>K9$a}2m9mcMSKvR@VgKkiYLyN1V`YBbNj*3c;fs( za6F#yFA;R&i8Fmc^b6=*eGvTx^2rfIzeApk=Ttlk@tlrlKAtEi*@-9VZ9JZCJbUJ` zZx^61Sc3O5z!u_(`V~aJyn z=gLtRt8JU;mkTHPTehICHUpM~zW8_(;$4)wlc>X!P5$%sNPiaf7yhHq#dTBaUP8JL z=si`bdk*jWaHb(HO{t9oPEUfTD|Kf9kEZwTO5GW}w-8PbrS=M*X9N~JWb)UZgiMzq ze{?UUwi564^xj*ky_Bo^gbqf-$5|U-6#}cB4x4qu?hZ}#pR0^g>RKlH>rWyt(*?i0 z9Xh(wUg#q$=_?}eguXUo%CqeG~LjU=E!CzO1 zcy#oD+R26f`ssy!c}AiCTvF74+Sz!APisylkHV(~WV?5=%vo{UsJZ`V$M)e>Khw z2ObuS&>z~Aj5&e-N88(gM^#*p|M%YAKtjTs0RluxHlWCxXpt8M%w{(c1%(#2YNeV$ zP?7kCS_MH82$srXWyNn%(wf~QylgN+OAsPpB3NGtKk!A&tCACcDzvB?QB`{1vQ}+-E_g}5^$2XXCOOO z?&?U~c)=eYu<*Y!ivLA~!Tju+?a)!q>ICo6d}aHxYeLZ0?NolEELKxpi?vh*Jt9-- zU2xsKn(u4g;|@OAxn{ejObL>Adncu5s5Gu-`-;v63^#cMW{9*jMJ-^C@Kry#qGo&P zV>P8(?}*_KY(^a4$_eND?nl01oodWomnwm}+0LhHOLF!gYmaNYOAe%PXC#EYbs=v( z+*@hzWCoftls$s~#+g~V$YizXcLx;qH?l}CyEhBJ1gj5pLdMHImkQ+Z$6B0!)4Mqf z%aFN^n(BAq$MahS-&gF19pZNda@d(37ubX>KKB`WIS;z4etuWc#F-BkP0anOJHNB4 zZoRK);_h;_X4D=Ax}}?>M%04rCUsnQ+Uu?yB9+qKO~!f6MW#s)P7p zc$xp)Q=Y01kE>O;9QRfoJf&6LI;d`9n)^=^K0NNIy2}03go8@a#EVud@06a(s`3Co z!=1cS+n*GuJ*8GXy4YRyTgvb5RWxz&U0GEhE>@}vAM{lH>n^qG;DZ|J-l~`T7EOE( z*dG!;nqD{YW#B$X9S6U1R234w%==KwfqMu416Ml(2l-tA?t|FF|2ge=o$uTQ?y5rY zNc+lHwdA-`HQ@M9t1=&SR;7J)L)CNlsrON9V=_OExhf8-=6CvEkCD*?-NehBjNXMtyjJ9(bCQe@7neWDCl+H zbW%?IeR}CX<;-3BJgqv3IYwo!SmsE=$GsY9Sf=@8j4!9mUVOA3bquP^?1g_D;0))i z&^X{MU96R?Q+w4r@bB7rm#WKHM=qUk^;os8koTq>`P~9{^-#idE>*)CV}B!i1*_rz zjXP-T4)Oy>@Vvf@;*)WcM3@2m4bwdOWX|_{sbe<2gzm(z#65q_(w_jAGl{+Gw|u?i zsfx3#+t7i&P<#2~fipzyRDT?Qzo!zE!1B))zx&FgYRNlaFL}2r&i&NbF3J7@j{g4Z z9Nqo5b-SXZ96f0>Z5oU}s(xC3|7?*@N-zID)^k^@GJbmbFG}d-4}*sb-*=j#)vNI; z{yo`eMLw0LC?|%D)_e!kl@tHIT=U6&2#L4;3+FaY$edd?!Q)l}xr#Hglr{4RO{s2F z4Wvv;R07`i)+Hs8fMMPvL9rM=DZj^2^y(H%AJK>W!TA5Z)8Ek}otgZ__;GWj1-|LheUdFjW>Cd8v%>I;jx4`!)>C3&{ zn3K^d4|Xe>IG(}d=~V`b-MqX z?qJQ%8cyh40le3kGcs7i6+`R7y4>BAyESdWMZ0sA-jTPUQ|W?PyFK)otm!<|ZKh}J zMs7#mf?kDA_a2v|H>bIFE6CXtXwqL7C8#S-Q|ifxlewPX9j2HRCmvxo!b?-40&!TJUnu?Eo*{YHG%7y5QwE@#1|Z z3oq_5J>4+%2jI1+HD157PGp^|K{Akax$LDpj~*g&j&DQGHOL&x{;#^n;S<{4=u}ReM85T>@7?IS z4cBVb-W4~6mpdH(QpQ8xt!6vQ$~FB6eO5+4%UuH*7b@kiq+AX@X?d@!#Ov=HKIO=$ z6!}(*KRS_do+tZ-T|J7|-Ly^7vpJt~GdR8oj_xh!qO7exSb`rL_(Xgk$-cDUDRNHg zcm&>%J50uyN?@E*-v+Nozn1g5mdu+6Pu=sD+mLzZka@enGnU+&jNJPSxv-1!BKJhz ziR{~t>=PN+6WM3UJYDVYAFTBCi;T3(yo;hT?`mY8OG#)Y??l!;-qVzI*Aj}XizVN# zkIJ_p$g9FdBHxDWE>(L+Rxu{RN|N70{A9wyMR%IAFDm20;N#)njL+EJUdHtVrylr{ zi;q+y<90z?;e#|KHB$eA$pdLJf3h#_?CX9cYm3?cD*ZRmjc?4noN&fR}K#_=WT6-ZdbJ7g;~sXryK(-f7U%dEPUX-BOxq& z;Og=0x|>FFw==D1qK7r?`*|iGT;=Fh-{|O9=^m!&|AZHEZM-0S(KR~fy+!{EJ{y?J zZYxYKae>#L;DZ;vaW$7*WA?u_=gB-*!JdiCdD6E_wN8Fr9pIPw%*B0U;e*#7)r`J> zk$lqkk0X!QE1mp}$k?lydzKNVpB8a&`?HP7_~=N2A#(aU<*;DP>;NU%K*%nG&ez}UOsfzKv~T?^d$P4Gb98KwVp z_tmOp%*j}j`EkyDZfqFNNZpN^uOi9=>=on}d2j|@XyBTz1|JN1vRjl7 zir0v>AnpenXTG(y_IFME@VO^}pyn!VjO*_m&KhJ`|jC-~kWye4?fLPc!bP zJ?Ped4KC96Z=v_RN`GyHS60CT(oYHW;}i6I`FM{$q^I)EvyAOSjQ`_||34!Oga?FI zmT8@#VVr-S!4I901F44IvyVB~1#ifnJ-)>J`AQc<*SQ@z5C*37{hi0nz8^v;eVHA`MET8!|bKyMtf8g#~WWe*tfJ)NJ+oWY817zMFik>qN-msSwIpAsL zf$r!!rW{Cfn7WSiKQxUDU(>$-L&V7(ATl6Ge~OMQ_wX*BJ0t9I#MgV!F+AUvtwbhA zURmexjjQm5(Q$j`vOa7;UW+_&rg~1lMVfr4_scqccl6tfoza=>J^dNKGgW+7{;_mj zA#koMarn~j`f*rb+}+je*SG$v`Cg+x{q)~$+)uoh{yR*cYK*nvLAQRKKI|DE@9#?g zq;x@s=W2SzSoYgkAAh07`^$?py#~Hm?@aRln*Q80Ow(oG@6QRz^rf?YJ$<(GUQM4I z->F^`J)Cj8o_C+mX_~)A)%<1TT_4}8eyOo0?Bp*;|IUYhLBxSv;_|u zX-Cja9)ln7J5rgMq?`yrEA-_(QqC!9-ITz~N%2$J1KFCPIE`^E>ooS1x2E;oJ8`+9 z)+_Yaqv?Am7Ne7Yw4!Nh9B-bm#}W8w#o4LiW3n!yavo&yySa1G&m+O9O&e?PIpnzg zxkKlgs_O`)4O!S!GNbrr->fkfdPgS154j8S3_L4-hCYBUF8cW@`YbbwU}AFu`6==A zkFl1W=GF5q)2dVM@ak%T7rowG?{MZo)~{PNN8f;~c`Uu&Im2PBc~b7c2O#>rr9Z0$ z_`EG|BKd;+!}l`Vr(-H)hw zri^lmj6$dJpJMI(Z5DSJ6I;orLzG|U^cX&Ri{m|dcHgYi!zqi*IWg!1_am>6o{8N# zyT?tZ?;<|$+wzrC?`M1yo~TMPWzk)P>t)`6Pi7%2RwIjQ9C0?mS=+Cxk9-_~bL$&-pl@5C7JAUpE3F(s>z7b_dsr%F)#HNZKn zI{g1ZR?Sfo{UWF2p7L_W%_Qa~u}>UD$C#3k=nqrRaz&|kC#e2eOU9HeM@|KiPhyie z6t6PoRllKo!f&OF{c8#DNN^Zy%QWHH=JljzjQ8Ql9~XFb)*SxKMYDG2E*#t}e?rVX zlNhsByd{4Qk^c@`{ApYqyKBm8m2cxCk73S%D>Rmm+&=9N3TG-MDDKS5)WdWjk}|cW0}9e`N;ytaUj? zzn8z7WAuBHuchBZq+9)d-H4Wce~WMF_Yp!j(W&Ejk&(Q8akH;bMzg% zbM$qb^-8CILch(?ADK6%qzrrDVQ83-Tp36keewPM=G#e1rM15y?G{`8(_NC$aZ@T6 zbyj+IgYO;WEp+rLP+8wsLnqp~U-(;WO+^hk`m!U^PQ}(vHR2iqe}87Sv-r5#&bx@S z_*>=MYUlHO&ocO1jSL@Zw)1V;XUJbdnH&4j#^SeV*QYu9Gw`moTiRUa&CPj!h;@;gU6OU`-I2V^FocWqaFQ`tkY&%J`*^^854>ki&og`atI{#~(It!{KA zR$foPO(ku>f)Tq9f=d$e^v}%69^~|Z1(&dwqDJmQmcnoT0ShvAuP5(v=CWGOYRrPa zo7;79mhK*&rAyoHlD3_nrDvt{yG{G9kIypNCv7X7yLY0!ebO$sGfS6tO8c%El%-4C ztaeHp6JBWF##rq;THd~WnMya~e8~@O-%@+~e6;T-Tl=n|eb>ck-{rRU-4&yKm)hF* zUE8axHH=S^8wfo2u`Z$hsoYB`K3O_hD0) ze1mxA^R{~AAc;qh{K(WJS3ibcAiCswbVu~2)uKn1Gk!&noQNJ70;cGZ8LTnd>XPZd z`)*xQ%CcwMtV<4hRW)?UdCXDLK1-jRvrmnwPgd+DK88Mdgzp-ij>WSDic1nB<8fUXd5KCuY{slBHY)#{$L+xoi=nfl=$#2nk&h4>j zTyfj~NMm4jMC0IN-$P@{+G#we!A4`!EE;3yj>*SIK8j7_K@uN>kLP?Co5mIYicRAq zA3)d$R7Cci~vr^LtLn{}!9Zul_YQjhzx7OIExao5srzK;spy zXy>MZ)cnys;~pqyBGi`KknGKe_YGr=coWpv+U^%&+l(a~k! z#1r4g|3mjpg0sJew%}r?Z3T0h>|Ypj9cdPAkI0-BWA9{8bgrw_v`D>e?_^GNu9Nsg z+ulh9b6PCg9$`)s{^cA&#BbX>86@$nU1UwBuzuEDRxI z1&-tsSmorEJTArIzlVIS+Vwu|`d9mQE!|DKj?k`8TiW#&ani0Q2#t0jNBh4Tqg@TQ zb|H)U)U|Kdb*LaQd^RiF&*ri@w z)|j#7qTya+k20Tqe%X&287*trzwg2RU8Yul^Go(uR<_u48=iun83*m`-@mlk zbMM!%=RRrLb62+5b1wjX!#(u#_u0Swt?juE6R)iXUcbivy$-xKfLCP;UU}ekC_y=H z;?=jsF2BKs*HePm8WXR|7Q9aW47`5*1MphW8m|v22M?Ke{Rcba8u04m)em)%eMR%U zfcuFK@ap7fvCIEg@G3R&>e8~W_>SQ9pC5qNw$^y(Bbyy=>sZFY z5iLFNc?M_ZvB{oxTv&PfDTi_Ps1#nvWM8zrw_@1l*LPLJjW0U%2f%aZ11oA8e(lg@ zZ_KdCgOlL+MARlP_C3oc|Cwo%-+GL*K{|V)rcHjlc@F7$uVItNMsr}Z?Hp1;)E;*i z`#WNTpN}0*?C^hKFZ4M3ptp4!U$SdTmM-UuE>`+SZMJewq>Eo{FDf>fA!=&9oICnA zcM>f7e14*X{T~fGhkErSJ6WSMK)eBlmmtf&cRAeWHBfo}!9$T?^Ug@aZK`3Pw|GMK^rL4rwvH$7y~P6pVxvEejsB5ZlOGC?E}ba+aI&lL!`gL+ zZ&Aau4?FZPZj$pPD{As~;iuZh55gN_m;VC00Dkt2^BJp5`}|h1&&NgW^T#+xAvXC- z-ZyzcY_k?G?Bp(k#S3Dee;7U}+lWqpOg^Wk_+Nk2Vc6$|N5nQO{F0Dp+UO5QZS-oQ z%HE`T?o4d-9_)n<1Jo9h%DUChy^Gsg2mQZ*>>~n=}&Yy{Gey8+5HrShu z{$D`80>ea`7OaI4b>y}(_kG1!Iia%S)Hu}HLry90-tN+K@`d?(iVPwLI#x&zh zqS)up9Ek9oj5|+w;F)!UW+M~2IrV$sfz2WlK0yv*$F<7@vEQa}e&evvSN71c zod{1piLNMoAT~j498V2~A1-xf>wjkKAH!b%4t*&$lmu|ADCORY*3NJ=KcH9?(8j} zRebXtoeX9szosZ6VTn69i@SWbrY0O1U=Pfg2PkypF7tQIehBwo%jaNGLzuXA#-HYCHo>LFO zgTkNUqtoKSmuZ*OA$-}@I!h3P2T#C*b038VFU{63W3K)aJ{_-Q{r&;>gR0?`=L^JE z)!#4tC_H!xJSe22V5k6dm{SN;1C&c^XvDwRcq2&oJ{8yf4@n2&7 zDP))MUP#Kw`4RZh;zQxTqx6@>gI_t4D$l`x&#G#@F@M2-2@yH>(VGA6JZAD=DZF=U z2mCh;{&T^5^W=@0XXY_npJK0UCFAXY294 zY+bzx`Q_+q*x}N!oji}7s{hZkv6II0rnVCJyB1%cf?U}KZG+(aclzO^*025y^pdy9 zuc}T{N?rk0sJmvImto#Mp>U_0cS$P6w^%ZD@TLlOvHq1k z_zrCmcmfOCw2~SLrFirRYwj}hOy>MD=KO5V<1M{a^SPAx`U`2R*iMDl?KZnc+9`HB zY|00YFy|KAYsQv2@6gSfVawGVE$d#_x1p6GXd`f5A-xB7a-;8V zSIu={KlZC>gUkgd&=F)FNTTnC(Vwyg?qal|XXPrjU;PO5$$OT7KW)o@v|mX9df;m+ zXL7iMbsPH9diZG)a#Y%NZG0!cwDTGXOFa73gp-&H%HW3_&TBQw85jE9`d>G9_PBMb zGDha)3;6#CT71j@xzwu$G!2_Lpeb?WfIX=b27Dyn#MLsNTl8^3hsns-AqhgCuKsw! z_2>hyiM-`MS51nDokiN2OJ8xe%qMLaLVG@OOsEvw<)@B>O5Sd33>9 zaMaY^^cwWXhWZQgqg8PxfDW&}#&HWc2nFW4g zlROFyuHg*YK`kz_62BovKUACjAoH=vY3TzwD>nuDTQnA2KW4r-;^w1{CZh48FZqLEjsO0T4>Y-9E3)Pg+@vjgFa?|b&7~B-K0l6^2emdQ0fp^Kac8%+B*!Atu%n<4!5rwRQ^CPSkx30?d$rW&E6#aj}7 z3cp=DckZ~yp-bU{xdvTw7hY`Wewj+VA!C+97a3ck%S>j?Qp!A;1zySxtR)%8=YHyx zwe)I{jY;l-f&Qzq_2qHi@RMELVeCxCUQ@r-?57|ra~=H*`B=)h6Zt6RZi9ceB_fL` zKaMt)Cu@4@ud?-Y>h0_3UypB@dXbM?kZmdG$Q8)8oRrj(j}zkXnG=V6H2pn`eEb|- z;^I^3yJS;7CURdn8QF!*sz{Y@P2ZU&zd3&goCfs1_b6k^yS|lw%f!6Y74>(K%dgd^ zqVj9F$S>&HBER|~zxub5Uq2~KY>{8wAH9(CAtJwo*4Ky(i)87BETe6PETgR=!-Uta z;e4Yd7c3qVc~%0?mqcaQhtOdFa_s+AhROJpu_>}lWLT-%C346n!|t}punxy2xWCT) zFSy#r=4Vm)6=7_yM1IXvyL35*{3=C$4&?XH2dK? zQ+^qJV8}1%Z_&66`o=-uBk3V7(EsO%Ei zISHD)ru46ub_*Z9${Ci)-8+|LbEZ<{mB_DS$gjhOtjag&P`V&LDys(W&SxyhT_e$l zM1IP8f^(e6s?Nq)7m-ze^O>^hT|$vL#-7yGIeM^`HO{R$dgJUI_N2IrM87H@D?Yhb z&H8h{;CrLUCGafY#T{hchW@y5Xh8NOW^q1T_8?AAjx*K)xkW3D_26{#0)&jBy zly!jU`!BPesH*ko{YNv0Jf|{Wes{I zYf)K$zPUp2O>U$A4izL2%&72HK=Sf^Aw;HNqCr|f?|wkn7H{kTZo`|umQCH$5_ zKik%vt7X6A6VGsC&G`*$&Tk$vd97)$x#rx*olCi!^lB1oPWYg4U7Y?S;Wuc~aDSX0 zg0Eza;(||v_dY+*oX4IgT+jR>{QX39EN+5N?qH2Mb#;z$|7bRQ{c`_A_AfTTZ<_{s z^e5mUM||h{u+qo>F=s8S;it{;p4>+{5#0w}zgg4ePEy6mEPVj{CAxCogkJvF;KwcS zu=qOp0)H46bN=-1IPD%UsgPTL>~&y+qtvC60X!-bMh2g!lx? zIQ-u-_rJs(egoxBlh(u;vmxx^$-bwogI*!bO;=8AVNH|Hp2wC{)^Lxr_kj$&EwQt) zA5uZxhmjK+zYAH1?rC0+PMj)xBBjlHBBp*OW0v!u)iNiSZRQ)DNO+U8y#C*@{=Aic zLoYY>NHUB)x6SbBQsx`cMJ2D~ll+p`%RXF7{(F5$E zcu?`hb1z8vSK4j0xqvYsZ61Q`ls5nB6#7I8dQTeX(7S*OJiVMYd-)gLPoAI9xzM{@lu)T6Nnn8I8b%%$%c6KP8S$f48V!ai{N zVg-L+DgH8ezpR|I-SXX;Z{(rzoya%i!T4s~T?QW;-{_-d$Wh}Po-Jc+7~k-qq08aV@&0@y(uAS#h*1W2~$&`VF4q!y!%dl{2a@SmMz~vzO2X{DNz< zu=jfOMESlEe+r#>r=9c4@%SkSt|2Yaqj#0G&d3sc#{^4>LzhmHxRNZr8=>@h0x~Md zd?`L-g78>~aklXef#(PZ;WyD)H{{}TXqUt}!wv9&1AjrX2O{#RB46U;!olPLyx-~3 zw=%}c>Z$7koo`ILKiXP(1f27Ms(UwTCGef_C&x#4r+$MC{* z=hGt7q>i04*iXRMO(Wj}7VMqK`L?GnuB$tsrWYO9@IaqH?&7@@$-8y^r~!d&rBgu4 z1@Su}@68Au#1^DM3t1zC{N40TPj=H^p0Z+M?X(pWcNBNix4of0U5D=qdH1dpcPi`0dG-I`yJ7Q&_xEa%NO z@`^oTF>x=w>owLVHSb|FLpN+>eJk-|$GDq4RoR~@<+s3-dT-}jaIorkp%)u;$x{Ls zkS6{uLin;!IJ0i}qY2w2>iPDz|RQn>P5Q*Kk<204X#_jc`|Th z3`-pM(E}bw(SaL@tKK$g&ocNbL>nY+`;JL_s;|6!K=tO%du}CN;;tf8Z;|%*sT5cO zQ{a!b!z?mkdWd@w7!|qcDdMx?;dgx5HGWi+)iNFVb;`6 z+B0taxB)wXd3h9OFT$)CFca-Ci%gh(iF*kcc9^?fpS0(Z@mCIb37Bb7m`y)%K0PZ2 z%x{Qqp=Yvzr-L%PfnkTar+(6&-Qy<=*bU4sQJBXlyEF#OLw1-&Cd~g3_cDEC^^d@= z1?IW&R}FX>m|v4F{qi@$-~%$Y;IV%qFJ>|p*|(N^bs|F|5@+uF88+XgoS(>*y`v4P z&yCFW;a5=b4~_KH@YZi-K4VTp-Up|#H--+nbcw4(K`y5$?mY^7HU}Ru=b2K@y3Avq zVZUv)jF-WT$Iv3TegvHGPaAFss>dDTuc~{Nz5$#0`W?szWJDP;9pcADVSZBHe@J)7 zDb-fqV7@w9@+Ff`CEpD4jZ%{Rv;X^$p7+f|x`G{;aT+k`uFS7OhZx<|+n$ z<&3QG*E2ogllk7TUXUF=^FU7cKbcqG&0Eg?I!Er`GvL9zzw&nIeX97{sj2;}DJ7k_ zL(nsQfm*YX-@$`d*C_NtnX@dkItViy~nfKH{Dt97wu^gGrZg z80iv@Bt1YligXFbk}lzR(g{ye=i^e}U+~rRB=I}AcP!yS{KrX{ihno>Gw}`eYr>iM za*}W@zTODGq5OkV{=J+U_Y=g|a`#8V6!2a}I1+z#63)1~#x3E!v`fOxr2Ef~K27;t zDSw!HR}znZtUL+5)GJ{w^*&BmLcJ0~k30##$f-$}Q2d1bim*HB65=N;Pr}ZWm(U?T ztq2oIm$01j5|)xK;YQMbNjR8v2?vrc;V{xAyo2<|2=hsouz++4r;sk;B+{1?P9t4H ze0k+b_%8TKSV(#?;TF;*e3x_yPm(U-8Sr05m`u8aUxL4ce&9=3OZlaQACN9#G36!P zLAr$7NG~E>LAr#yNSE+E(h1K%U(M)W=w3+tSm?fla1{L_;luQcgg26Igz(Fw{Kl78 zk%ajAa!WV^evuGgUv-NK@dZ{Sp_gm^t z_=UvpgI^@XS6JNwLi~aiNw|-62_3+dunD{$Cft@&Q$+X`aP|P_5$<>o<-e`{AQ%4( zxy`zKqH$;K&i^!}NZxDtmpzr-h55TP7n=Jhg^HP{|M8}jnb>TH@-KM`7v%$|b)Kil zGfx@dAHu)Xo6Ejl%eujYv*L@U6xlmE#op(?(X$`7?|oj@f&J#vCf{nkDMf4^Qtl|_ zUbmGC{WSKT>7RVq!%jD)$R3c~aZ-M9j=O#Fe*c#(ad~%}aZ_z^b+?&uJ#BI6x0-Q( z{clUzq8rS(-w?M5o9C7MOS=n&#*3`=l6fcjvXf0IvVS|Az3pMF8HO^~$(pfr;jGF5#?b*f|>iHos+_*bOe$8c^1S z4No?0m-9QpT^>CZ{h%(ouFJ#kkUq_vck5@T28zj(kymG)^Fe3GPf){oaZ30V)`^*{ z3EyLFSoAI91z&B3pEjG1wshvh?cBlbBRUOdJ7sP()^wcv`W<8bkfZld!@rwVwvCTB zHE`Bf#u^d7t3yKtlWH!1qiJm@`a6mF&+h-twfd}Y?Y^e9H^17n)?Q|?txOYX4^wZc z_&w?m&v5^*h%-SO7%vi+SKbo$#aB%!wZt{7J?G<&|5HJwlYdP#E`3!?+~{arUQtWj zd(d9W1|MvRTNsUNnA;MUN}TLnik}PVqkgPwT+nDNYi1X|5c4=ob%uS+f!(`>75YeY zKc&Y~!^g$yXdj_39uWT)=U8*d-lvpz-K*$X^jXG=#IX3n$YHEYKg&73|9CDi>NxF4 zH_q(UsjMxjN8rCg-&%Dnu)&uzd)_Dy2>iz1IM{DZ4;)_S&<|~py#dbr$+@jY#dnIe zkl-JpkGp--lp;QTT+#N)-mdJ|9-Tcr;9jhje1kt9**BBA8{?H|-OsE$Hk>g!9@w%UP~=GUJBz#FFD~15`9+g@mI6=Pr|N1g|M*u+{fnw+;!|xKJS6QpL|s8e@R*0`{NHOz0&RI2cIZLyTlKY)qnBPx@7!{KcsA1|9RK+348IY zBtDX|URU%&{3+$aTi3s<_|7;q_J`>|{3U(k=r?rd=Vn`luF_WN!*jD;M*r!wQ_k8* z|LskT_8;dJ-e*rj_B@YHHRXu#sL_9%wUPE3{ny{A9~$7)PYreIa!zLu@~o`8$2b#o zSd({XIV)|PC3G44_)^C#XA6%kh*!gZiNY7y(svE)<6HD>oDP3X?Izmx`)IvJot#}eb6gv=wJuh>pIz6l zlNt`#=-Tj-L)Q;D^pVtYI9k8ZS7+~`aWD11=FpoySvoOI>fV0NC-G;#Zc0&EpJ@lP zIOEjEu&unZ_^hup`#|eBZ}Ba9OXGQ*gTcmg5?*hdZhrq+zJFwXujl*qZf?VW!_9nW zCEpyrkaIb;iZe1Rbk&!hT7!ux6d;t*e1`4_IU<9*E-L=%pU{rYyU=*^q1G@uldYJA}fTK`@j=2w>L!n zzvU%AvraSVxccbq9_{A#!;Gm0#@Hcz@MUsF{S^M>9-?pC!JB8E^A~vkx!xG#t3R22 zUORaEfLGTH&p+YR?V3Iz7QD$V@ctQv_wnqW?ckLIFW3xk#e`E=Yr3o*vXZj(IqU;LH(z3dHZ`en$X*^AwbMSQSPPTh3Yz+L9_TV7Fy0K9_l&IgAyyR!s-5kXuKEHpv{&%3C zDCnLl{$w)ox!4c?F$<$}V{3jlZ4}b3tE2Efo87k^ykg)L0q>BZ%L>0c@T1*Ar{?j~ zr3K!PqVOWKQ`*6^bYl}<>4a0A9Qy6C;6?Ar2z~>i@Q%&y)efE){Meg{;fTQzJKqu*fKnX|9tlIRvR)rufHL~Um#9?|4w}C11qKs z$F3AhhJQNpoUiJfDFaU-1B1xwwzy~=;IhPyi_$Mp#(d(B;_`^#0<8Z9m$~WZd`s=P zAivw<;`vEzy3DlWQkNRg5{nMZjpA~n-~y~xxX2okeOj5{DzG=$X>*LekvZXv(1ZD{ z9S&1t<8Y-NhhR#e5qeCD;xI;V09Gp;qV+pF=$ki^&iO90(}Ov$EiTJ`92=JuJ1$Xr z42t5CEVuycf5K(RIp1&_E@DqX*VwO3j#Yo3%9B$}K5gvAS}IR`oA;@78uj<7{E{^E z;Qex*KVgMStjQIn8z=~|Cz$sn?cSWhx46rC9|-zE@jWY2e@6p zSe0`SqOVft2{||1S!gv()o+?{YR3^dL;PNr-kUNq5A-6R*cp4HFR>2iOtG_ayWvZy zS0%o70%vHall=#L?L@kw2eBu;Rcw-m4Kiwz6gn6-M(mJclQe9R-T6*7?TV(YvBmZ% z_C(Xx=nz}uYQxsZzJ%Bz#jYqeNU=4_x$({HuZW#d-m0i%ogzB>v5}p^o5%8og+snO zhc}Ppdz9pf4_6M$(!~aO3|r(s*0$Io(La2>nG=I)_|l?H!5LZlP6-ER=`Tu{nWa}t zxFt*fgM`zv^sN$Z&eC6ya9@`Gyo9e)mxQ&vy&>U7>>U!0=ZzK#ld*XaZvQbhPjD=i zIB@%&gy2~sAviuuxQqEeNE?2`_fFX-qHUS<+1tM`&wwQT;hgWDC2C2CHJ66&VWn67 z{hWE$kGjB-a;9fV#>KjksMdiZZlRG=&SHP{WscIYY^7f^V2Ifc5V zTsmuZqa0)8JIZZ!rC$|Lg4~mmcECTS=nb--4sG^gyVvwVo6NW1LikJ#-k|vU!C#r= zNynGlZBiyp)lbbiwL{i*_=h?Wq|FudiTEd$v*!vn7V%Too4vJQQzzbCgYV@H5NHA)9FV%?ZnLyOd~V8k38I4q%d_-; zj3qh0a0vZL#>17A=iPz875Jc%`f4?EEJ%I9tCi8|z`KMz@=l|Chj_zeD8GZ5s{ZZ# zQ#+&%(X*tjR{QLDRKR;NaXHx@7wIoME(f*V&210f(!TBSSRA?!2@mTL`KA{v!H!D*MCQy!5ovG&q_V7Q_n4J>Ols@ ztf#bnJ^t^gC(qr!ZHuK&_PJX1AF?iHeT&-Hckg%9r+C`emnZdYRQ30nn_AV0Ty0k; zav}I|v`+ZT8lThK)Y&{fZ9Lj=g>tzihrCkfc1KQ7UbP_?p-0(3m3M(W`q!+XzvXOd^}DLxOX%~S zs%MK#8knWe#BY_{r4pIE$nXc)yHf1t2dK-b^kyFDWyr!Z@IiMuaRz-xbe-yVIdjH& zPB~|V-QNF-oV&?2=7H&=L&!O$;9t-Af}=b&=@*)P*Bf~)wu&9m_fcPz_KZb`nrQZ4 zO0@4PnB(*4KbgKO%Zx}Y1lOFb3n4+iW~LSPE72!63(KN$mdQK||1F@ZgjHl*2LkBq`z^Zl?F#DE=q zzR8&X?h)ANn0>c2y@-yuI);w8_5W2zti$)f|6e-dkN*!Hk?}KH@MqkNl8|w8nS_j+ zkrFa)Mo7rG873j)W{8B0o52z?ZZ4FNaWhat#*Irt#!Z@p$yxdZ62fb#gpZsx_dFM4 zFB6}~NjKq7m%X943B~8}6XVYMh8;8W>>!V!RVW2}3uUdxLV;J2UDBc+Ruv z=(c^!e!vN>ZNG|V)n(K+U$_?mMvZnYHI2($&yN?bf_X6cE;Ga0>V#(zXNf({znck;% zoWG;#MJxV2i5LAv^t-_=a{L{MN8k7udLCjwLf$}m=M(nxk%PJD(a%pi=c{Eu!}^_s zz4;T_H(?zu`xNIxLs{R;_cz#$WNjcer%L9#@&J=O)n;K4zX=|siZUJpJ`}%QDlykSr;v1{r-*o zW_%4{Jume=CBKnJJ3lb%|8*3Gr1_&|<@;CBa;edB%lUnbKJ0txsT~tWA_tJs&#)$z zypKv==KcwFCd`HMo4Hxi9+Ge7%$xe3+OhaGGkw0qF{kBGzAewplQeXfn_i+#s?tkf z+(w+GhYx^GUf$yqJCoQ0-1#|S&osBb@F;fbm%O^{U7mi~tABBTz0Qxk`b=z>0>dY8 z!D;8qO)uiN+<-ex;?T!_2TaK`MSi0b{uWszzbEm#SvM!2SJJ_4=Xs}gNP4FHrrrCX zk?`DT)++MG=M~X%@*SdYN85i7R`tuI9Q37#qbm zjeM4loo<5KK%-EQ{t?5<^D#T`L0}V<6XJG@>|mD2&;L=uA1|vcO7X;5r606pQ|tR3w=(K zF7MJ8b^CU^-1A$?o{89KzH}&z{ec0cE92F<(Jn%lf@nCf>&q#iFO7j1oe8W#W z&omi)8<5}N@$IKgG5KpZ^2)Hc-k+m?^AI+Pl{xyM-{9978Mv0WIE1%~c#mT#?{S;sJu#zj!BYevSYqkxRj1hUKu)&dBDQ^`DEQcLdQCgr;D>~343ajaA*10xV z8Q%lzIQh*sf|rsO*h?GF5-0V2M);f!RwFdB+87J35ACpu1_UyIbu0?&AA~D_WtU6I z;B4|KatWU6&To-lmfT5{-|*Y3GLJ?1UXAX5RU+??$s8Dsf2F6nFDCIvh!;LPL!Hg? z61jKM{(G>he`)`X{QJWG8(xjrf5Wdoiq1WiyQssSCgarpo3Z*Y`|pwH!Thd7cFNo* zI5wc4xOq!Dop+?uc;8ayY}OomBrfy-X9cYILNi``<)w39&w=gNXj=nqXKt7G$p_L_ zd7oU(R(AF|L_G6++xW{Q9(ioMUrl~_zgi>zb;R5IAfLv=uBlJI^k#TMudMMvC`6RuJ z_-1-RyDVtLn<;zJcxT>?JptP75&E{J$>Y#aXes@9AN3jiLtje&e2Cn#+I%NzB0p~u zK7{554$#;Lp{axp=qRvcPWd-`l&-u%frfk~Ec1)v9v1i_$0=`~c9?#YbT={qd*=ao zHXNdyl$E;=O7OgZ?0bIHQJ!G8fRf(B$n!VySo0chiktJAk{a08LHwQ$;&*fq|N9Q& zH+K-fz9oJ?=k%NLDJ8y5du1-(?<(p`TlyPqDKpD%m3VtwR(BA;vV-{Lws`b`W*n9f zUxd6?@`eQLdF*xl!dBKEe{TozcXkk;-$DE>9mL<*LHtiTh@a9yd`<`PnH|JmL40@K z-VNd>P2SM$6_us%<9-)o6dDLm?^p8D0%eRf;mdK9kufQ}Yvq&puWflplE+H7;su_- zk-URRm+@hgcc%x?ms;wXY1T79>fzgh<07AwrB9pl_9hSf-;QS-9mJo_Zpm-w&yyX* zpXeYyVvD!)$;Y;MJN$zk#Q&p%_;+pbcKB}-ueqaiYe)?=aJI|nANK`;1Ej?qW9dog zx?K(0y(xJ*wURsLI1DBP6nCPLr>-M73h%y(ZIwRQ(NP}m1u5yhjXW=qCsyD5))sH4 z(Qi74U)@3c$`0a}cM!j%gZKrucss4{x5eA>yo-2iuK0*=(Pd?g@BX8?rzCyatcNhC z{!Q{Qrw)$l#_#YOc$FWp7J&bc(|^amq90x9$U=8YAdmD`@j`dvZzdjkO8)()x|2Vz z6Y--ATF>~7wChMKFGpvkoRoE?U(Prj9cTnb4r$SO>iA*$RbV#r6nQ4bf-7aoJLWsm zMz*cfJqF$xYt(r$X|g}uJpQriodjNUz2r+HkL=yJkr6Wfr9QC(Hn&0SfazBTdbh2o zVLUXMXw=iKZ9UikTh&9pxbLe+?1pujfivD_d3D@Xqy|`5%D6kOG-!dcsJ!|wd2I5^ z$Y+yRM&5th;nX<-rz|*1Tr-@8ws6ST3J!VSv%_hKYr)6exf#x%+rlAVD>&r+qa99q zd>~@sQP9xh zxv@1IBcBZ)Bkxr5v>NxpOX1~_20bQ4>kxU;Zrqb6lXOXIC2OQCeKhVn(k^RTr}86H zM$tb*zpGBpm`N)|h;?ZQZT)EF{T-fk+SS<5{ zR{7-&E&LUJ7PnA#$5=&Q|A0~>xUmM_A0&@Ux!Bmt`5kd`4`23~0)pSUYVJgWPq zBI3+9%6eBm$am=6_V#t&D1CW;z+H4fU_5!uI{O-R-p6mLCztSN@@`&?dVfkoMu9z<&|CNgHaR;c)V3lo6Y(!oQc_ zP5XMj!~1lVpF@A~S!DH>&|dmU`bYZZ%mbamWofMSN3ka}mic2mem=naPQ|S!5YF!9 z*2|76>=$bF%M@k1=p2chC6>5F7rXV@>E7_-r0lS!YV|i`16t&8)X&8)AMe%$YS~*_ zp(@plz$)WAL%s#x4n@xx&o?m3xZ83#-W&EPj{2Wb9@qy4;fK^unF#eSll+Gj{iv;e z{DVIwamAE-W?Z&W_6Eu}Dt+tMo}UxmSgeR2;QEtVxBBHtSBJ$$TgJP=yt`LFn|x*6 zRlRl~Z3eza1wP*%`R>j47YergmbS{J3jCLVLLpfn5yUHcnCWGVT^>Ld!{lPaNl@OkBh_phCW2VlVLN%-es| znWE~S;G?IGI)i){$v1Td>(NbzatGg`)bFJZxnp1Uu%hpy&R2mgeZG-*ojU`^4b0`# z6Z{MP%J*LCD}Ple#3a=meQ$yV3aOpYZZM^yx{6E=;NY~f@>5#D7Ykd3gZjFq}!8< zUa7ik*6_b+{DAQ0!D-?AC0$Z0J8Lx$a#plFQL7O-CwA9Ng*VVS@7cf@4kfDk<5|w9 zKVeJ<6FH;E@5lIEihXedzmF2XY5c9g%MDj{_SBRodTKuBp62Yu+!Jwhs@z!KBaD2Q zUU^upd11?daJWg)%c--hvueOv1gzi+H)nK;rk8cj(jVscCcoQ&`@)u6$?qm#mR@-{ ztEL?IVq@>BxN8cPt_AhIc(+zH-)1hmvnVby73DBrYeaZXrHU}ihRcT7skOm1Mt~W zw;*HZVg3uX0R?{iQ0{dk8TrKT!{*^;zW8{h=SR)?;tQrg^JQv$bH0LMW`D&|Pfj4ZZna`>ddC)Ugbrfs{-YPXYQRopm$@|LVJ=~9Xuel0(3O}N^;747F z47(Vgb_>#Xe#Cp4#e|Y3c*{9Tfh8~m-ZA_~ZK5CLe1e>d!2iA#A>Ax~yP3FwN zE7G4)oa%q9_{tXqcNW6OPduw|x5g3iKco0Eh|49estCSuK+8h*rtuNw_u^|6Kfc9@ zj*?97$mcFh-!1I`hk|+dd2DcWuH3*p^0FIVrM@p`c$mw)%w^fkWjV}cSBK9o$_g|0 z1-84Ly@YQ>H=F&7rPEz`%$?{dKKx$~2>R6B7wH$q;D|zG``s0MNqiKTQtwwyW%3?zKJ%teY)I7&e z=6445DKbAHXE$N9XN(y#tbCE8-_CFHKPB_44Z)6!7TWJaQ@q0a^C6-lNW-A8!CPuYCUB zCf_CC`8ad#XYj(G_!n4zglE%~xJY8AoQ1|O-dy}CDMdBd3{G?{04_Y7IFB(#obbl= z#2pl0E4RaA;E+k#VU($*Y}Zln)r#xGC-4EhY0b2-D=Dr-+P*wJu4Fy!TMr-hP?TQq zeIQeHM1r>|zM_TYJEg9wJIuN^1J^^G)b%-WQWuUGf$xY6yOcEi2q=k4N#Vl0-Fb|k z+64o7^VsCWKgaQwy4tOPb%t*ywlLuv;WL+eKmfim*FwRxKy@a4mzt#?jMBRfdWRe{ z!-kL9Ehb%s<}Q5B8sjYmy1(bvdkEb(n(1kpQlJciR#9HgSp5CGyoY)%Uf##I#mm<( zkvkaq?Mp%zpU$>!`5RQE98=E@Z!by!?wa`*^XB6&X7+Ualig-Y=EFJB01V z3-QKy$r}==z%G_W9vLsv#@VD@E@uH87Y%q4-j+U)HB+Ok3G&ieGr0mY$QMlE+!p;D zf3U6ox4Xowf4|rPKfkJ_jb)3zzm9lY9o=kod_K8@I)ax6{z@I|nJ12+KRrM4 zhOkra;%LrD;`#W8WR5?)AY{xjvbC!6zYRplych@c$WXOe~%uhGLgI2$3KY(uUf}hoI|KQu=jl0o%B)(nW6b%iO zlFvTAoY3O?#@B znaHG~t6RoF*$vMcJw>7JSwx*8>%psq>t#9)C``UU1c|?}HOxUiimMm!) z68PLEFOJ+H@?r@4D1!o%C?|7?B})#=TEA!%X(Iw|(wGD0zrBn3k2y_b%H8OzrOZip z{|I@(ocJj^%7v8wk0WmAnmW>k%oSoHgfF z5hwG|l#%9~SBsvyin*v(^7HZeM+=XHO!*{8YqLj?mv=W*73gPoo zZ2L0*O@_~{`Om-2q=PlL4`n_qgDw{BTnhVL&`tKIPfT<^Ep(CloL2e~k<$w2&7k|g zNw@d)RA_DQ>sWf$%aqBRtOUHV`kHuyuY)53ucBvdBd_rFNb=4mZ38wZdwoA@Q(vrk zs!Zx*Obm`ypEZt(h6gT@IjNTY6B#pWqGLwp4tS-Gb5gW_tEZ@y%-bJJC#|PGYs|dE zw>4%)ppQ$uz-gs(xE+DDMgcTmtCU+sTDp~%eyL>xG149*%{~^6@%#J6!p-E7 zv2c*E!?92|G|-K)V6~yKK-zw>F$c`0Tnj$fdCavG_zVinBF&D^YyAE`e8!MR#?LOo zcKBH1Cpavy7ko0=x9a*RV`Sz}!^7e8Uv*Lf#~3GX^1prB%y1&(rKZ5G?_9*Xm%LSr znvA`Xs_x9y#Z$shvcAPv)b#V6-Ah7_Yr?67qBo@}-6NY>6Un+Rhj%<>4IJrhj)^DG z^QF5TU!_*B9w$Tl4X8$Qo>t8Sw9by&hFzLHym<^oKh{CKj%T0HpV=3(Y!3zcTv{hwnr)g?| z_|&!9-Q|lW-wfJa{(%Wg#-@uq+6~n22Hx|)vg$Z|uZ-D?jB&8Rj$6Z^z+u}sC?(B4 z4xB$=96U%F83#IHhvR@XnZh_Q`iMCMyo|N9+%-@*A0d5IMENrK*uvRW$5|8FA^otB zv=%vYMT?vv{eIE}ZnWI~!&ct{w?JSb*PH7Lb~oz#6qs`)4f)@kRwU;Z;sO!UZjm(R ziRLsp??BpTq}@PTIdflgnwxW8q)ER|BQ4tR`(5dr>$3K1NWVtPF>gva`f5M#$C`ab zS{7;1_U(5y#9Qs#FL19Ut!$sIzPirMZ5SnK%#F>s1UogiVYsC2vZd8Io7-?9Y2ew+ zXUx+D5%!EV`0Svn8GL5UElNVc+k2aQccKHh;76Hj>fdVer5p1O`&ICx@TxTrt*mRA zhq~~+ne*4;_saTj@?QDQ*+rehXZNWAxtoBWUwwV@fbgc|NqX=D>=^?mvF{omu6CpZ zDpHAikGR2;^i8|igG`yEe?2oH9K;TVA7K4tei!y-6T?AlN%#ZS&peP6t{B)SEH)ne z0_z(~Qo~{+!Z$E?RSCxvV&lQ5tNwFr3&G8Ndx_gfIEk>Fa0($d82q&w_8a`e>OpKT z!5az1-ZGOA8w-A9^`M_HpKt}?9fZY%1%!o!_Y$&C%3B5UCJpzH2_Gh0MEC$<;Us-q zE#LR@T})U&xPtHwLO)?X;gf{9glh~oi@`Z9hOp6h%fR7)L_rvy9bHu`uM;bFpv zs+WJk_XisGQHQ=MH%l+VM_o~;gmBkAPVO?A?+Yq%$~$tV{NHyvd}U|cI_r(q>RHdb zSwD99(|YWk*no{c&AD^}dzz6~#E(NJYi04dDL!R*OGjZ}wt{jFY*Xr~Ez_6bt2L`G zZ71*}Z)4j>t_GIQ9ccWX!tX46Rg1kT*M?7(tDno;OkmVt^@tJmxF!6#K8ODvuTQ||AUZo zy_K~awVEruBLmxt2L*!IVY%CNK=EE0sNJm9>`YD!)Na#ig0!QwKks2M&pOlP9fIDx zIUx3gzU+&pRvwJjU38mcwDmgfexMaY-Ivhrlxg4b!3Jd(r%dXSd}4 zr{vd^(M!>LCBNL?4ndm`w3aftj$Q?kQL0hr1H75A9Xkql+iRrVvzRx7)GxBp)zGWu zOf}~^KbH0ZQ{b7j?p5H27c3ZmkTv!;PtB$&MxV~d*MRX3cF|?{*8yKuwu?)htu-*P7I!O>l(aV2#;U;Q-|?xk|iHazSc~> z2ByQQ+%J5+fil9|BA?^n-&eT{FTQ(X|osd15d;p-%HJL~M!1eHPM;`z+91-b0l-z^BGd zUzRg|%E}W1uh7>re#&O5_>xg-@}a-*+Evh7#)9y9-73fEjr)28Li^4$@(MlHk#7sX z@%j7Io1D`T+u1l|$kyWIz{XMBWBtjvz$o(k-qAa7MS9(V)3em@_Ttn)^}b%ru_|^l zd=dRj35#!QYn&!$DB(ANm2h)h_{!Ur@Zcr=!yBQ6^xsR19C}S5@6^mR`!G1lStE2x z!_TPTTRV2?#M&G2fBAp=Cf3eeID3ltE~=O zTN_q7Mn6xxs%VGMMR?`~+VDDfS$Ikx3I2k+@D=>R9`?9E2%JLTw2XFTQvW*Iyv>FE z=Vx(Y!SSEBDdB_v?jN>rZF+j&L}}B;QS`;gEM4&4_yE6wA?& zTP?RQ2u9Wdb@x+QrKJ zh8o2;d?5GQdnxnXzgK*p74sdh%&&W%@71gg{-s=wjd(sh>I-i4)VTYoqeI{>eYY8Y zm<-PhfloFK;~fb?i^dg>?g8oBBH~1LA1YMBWe*^Sx4HGaA^3+Jm>8G^Z9}7w|BU&j zM9y{4*I~aye`yVK)sy@q*TZWGOB{OLH%)8tgEYU6eS7>M&2M1O|Nmp|&Euo2uK)38 zW)cWV*pVGFLs&$>4Ny@alOQUBSS4zy)eJ;b1XN0^B1$HpqJlM#&{9NYLI{um5(NxV zAOjRE1#1eeEp7~g3kDR#s)J&F?{k;uxz96O658+Q_eWltnRA|d&v~D7&pmg0Ze0s) z`r*!y>j>nz&$Y2X{DAd)B{@~N%d$0LTY!9i44zqy_X5{JhVqhTI?0Xmr7tXjTvx%j z>k1rY?J@r* zi;VMj3?tv4In7b_9q=YyGM2!X-!2?>m$18Uv}NJ?wfYyG`F=I&(qrVm>XTWo_}Z+F3dxceC|*)-IMI!uM_FOy%cWZGTKH1Nz4(2bmYe=4KK~l{{T}-dp2Fu`ZMwFf+f=*KY1p))F*ZextzE!v z>Oc&ruT4h_n-)T5x-ZFphil_ogq5%#>}{c7%e!%wUM4#AfBO|!j0c358Cia^_~F!%p8ib7`OC!{Ddq ze#icIDPJXYbKl~^9TOw4KT6wpKWKpu=nR3jkz}LxK%eiW&l~vXN%R>Q)9(}M^N(KS z{nuf?#VG8zxE^`^XzaHbgZ&oQmSN1GkG~?R9r@#S^f^>^-~rdhTs%j)VArAHvaWJ#~ZDuy)+y*(9r_E*iDo#vt<>s~1PW8XuMS1n#m$#f- z)oIp*%~gAm&tmTL2K-L+wF0FWF@tZa3;n>pW=JYW1gieFuw3SUY44Lx#gqy%>&vx%8j&> zFK8*-Uqsxh4Xs+%IU9SqQ?(yn$kI}4wSV|K(|))^XfuHn@1uVF4c3;u7`zoe4c`sj z>e^I|c`$m<#`3o4&#(uvY@oAhEBQXgHOOW6FK>&!4|CyV1MzO2TU{GV(MFHr9sI>V zI>K8Q28TU?{*T)FHpKn@n9Hk1UvvRtJ@)R@toYm!raiB#^PB1213QNi-=AlD7iyu) zb?U!XVV_y`kN#mhaSmt4JVzPjP0P`rt?l3pS0P7u%6>vU+pa<`gIMC~=EZw(N0yb=Iq*&uj7RXUrxl17TafEep0IV6>ufplhb`zU zsGrz%8Db6M0p)ET!~=}~Z^9Yh>7$y!=iaRwL~>H>qd2zwdcNLNjs7vC-L+@i()tnV z+=x7c;swR94eMQDienqsxWfH`9pxl*kUJ867{1g0zW84P?99DS=auJU|Hwq_&G5DL z?>`8cs^8i^%!_`9*6fzMa7M-L(6@c(UFS-{dgVamJuM;sH`(hB<37o4-)if&eV4PY z`lMrBb@$+~ZQnZARd@9dyZc+*34uItIr1^mEeC&DF2@w@@3bE8oDy_qKUzF0DR%M*fF*M!tu4Vd6KukLvoQjU2xox8>Z+W-Y4Z=Iq4P4h<#&I2U zxfw&6Ax4x5T&Ll8iXrJ&@EB2o7}64$t_OAnw7znGQf>k0Yw^Fd!`!NB{5If$q}*!! zwh#YTb(vcQ{7>ERU{Y=!#UlLAhy8kpxRE+5fAf*Y*QYL^HUfJUgLZU}_tBBSpcXMD z|FIrRKgVxt`?u)9xqSLL%eAL84rWrbk;qaX}_l#cXlA|xLDjd`1q@-hrsKG zjVI!sg5yn>bsmDYO1}}m198fea`440#3^lszw=@E4Ec%=^^bq7)6x^*r)~S* zvGHq)kMO1I@&9l5TMK`3AU;wo4D`Xfwo%WTt6bq;7iwkX!!;0aH zWm&H9`q8d%`E4$YL-FV8q>~?ZhYV}-T;W&qG4{hdz}HN1h1Wgc3U6D=}&JZsYCdGOOYkF7{O1iv6(E<553KLH>668^aAb7$BEpQiq?FL17UtTYvMO#d7- z@;%c}4;uaBgvUx!QRnm!${@e16@Ev*5r0$o-RI~}>on8vnlis@YWQ6N{LU-<&es)w zhrG?-O7T1RTv-}oAAGJ9KDPosw-P@0Ibn*t?gHpWd&SGr(6_?hO5txS;BPD8Z{C(k z8#lqf$fwBPwnMKs=629mw#n)na`i1=gYTs+w7wW;SG<+kQ70d20$=pw_oF!HdJq2p zwTV`SvDFK^;gjS?doX60*bn2vo$d80_c+Q*;7f>;HLJR~!n1kItRcUo*hl`rd;~sA zzBl_i7E@~|)={10J1Y-So&NoGt9K3yxZr2-K`N)b1NSqEiR5eKciSE=97euI{qC28 zxKH^P)eY*S_|&u%?lbAlxX-v@^QxteaC`VoV3`B+#CSI`{EPCUgR^HJ7_xKOi~f|P zO~{$p`*d}}bs^3}L#AL#(#GY`4P!<0;ZEusDkyGmN8XVK8MTYA;JL>do+~V$o33}q zm~u7dF(~en>=etZ5BP@>{)7R^Pwl68J!FAigjLgSTA7O1ro|4{uGqW;=2PB4A4Bsg zD}>IW1$BeI#5z&NOBfIKKz@$#bjBilp3d{!&>6>IwEvpr4|~Iu=Tcm_065TCn#TQv zH`$WrXfvP(jrU8?m(f^l6>KsQITRcBW1KJZU3IKac?F|^CE{ANNV9hV%w-~?7gG`U0jnY_pDrC&# zvIVYja*S^ChSxR%qd9ojzr@Hd#x8b@{E#C^a$E;YuqPv94Ei+eamesOjy_xt-*(I& zldZ1xhH327P+Kim>_|RYf zhRcGPRXLYYL$+w}{8YX-ENxKOfbnBT$nr~)C4h19eHa(7%Bc!oCECt7Z+Wf}(+HlA)TgVVS5{wh(^4y#ez;Kb@>wJXFZwuND3`;(yowgixPb)Tg~}>ilYBbY26UML)N_0Wr23 zGStz#04TQZ7CO)J;tq<2$JU8TU+0U_=a!(pBceY4x2Ddt4%Xm)WeVbqh^@s9h^=!V z!ww;XZ>K3kqt;&X8n^Z`0WuT|83M1FGBm2)-_y8u?}ZG0A%k{A^s5he!xaA-+OO_V z`c)YR?R`v7)OVNE`6e^YG|KkRH_rAh$S^|4;D5}NVLf!d4>>qncN^$6*4;`mj#Be* zjJ5XH$^LY)Hyjdvez=}(uB?Qwy{-P*8(zH(pRdCIRj%+yU)L?}CgcjHSmkPPyV%)q zxoACb3uO3-?q@+P2z@2|VJ^<-H^v{7SRmt)-5&y|FC^-7Ut;RqsF+{fxR_r68LEX0 zz84G`DjFrj2aS{APRQ_z#ND)g1?74Tw*3Lb0@3$*8qoI*gA9*L8Fn+J{&`U~nyk@YPyF>X|Taj0?m#VW|~IqtWmnBv=P%Fw8o|8C=A{!@@)w~!%FW6IE| zHO6I)TVtFA8A^o=!3&N4zJh$M!EO9VuIl4#wj_+1D4{2K1!syLKWMR%E% zyqg_P!yFvuPEXOD=TzR+9kb6I|Hg&;-Egk{-`+=yCt}YS{oZQynKAjU+zCIGJe#GZ z)$YaT;u|qX|1XsDK{odAYo`vQ4E$$htOcFQ=!r5Me{ki}@5Fy~tL!ri@ck(EQBhgT zu&?qsz86C;Due3G{v+00Txqra7Q1qn;kN-_{G3ZNp7z%vCRek) z&XnZ6O|e}H*GJY>`G_PHQ`Rst! z9Q@6V-?6^ax=!mlB^3HOcXvwb`K4O3`A=w_=X+9`%_kXBa3_qE!PvWpea>0;`nKfV z>)xWVyMt4iJX97vM`ci1R1TFr0p}UNru&>>`xR^OUV-)5;SrdZCL2lHKLOjXUEs>C z#&66H&vDy7(Q3q*?sQ|Yq>u-DYzTkW+S-}CT3j5W`5o3DHSXPj@!4(DJ$NHOM# z12eo~tP=od*ZdY2CoOuX9&%6}QVs{o&4B-q9Bc7e%F(~bDn}u{lN|jHIhpTG!yR-M zISNcUj$f3tXia_E!biL;!lUqG>`xJGp+D*%|1H4Y#I7A^k3^P80B*+QMk;by$Wn-g%d|h3D}9oZ7-$^=}JhqAg5T+5-7uecMBUqebl$ zw1=l? zv-w)krOmVNu-bedzNF4>>2Zj)8dC~@mr+x19Rnb@+cyv1fk${cw+nJSOl@ z%s$8SpxNi_!)Mv&jF}Ew#mT?=gKpRzpR<%cXUuPGcE@*%-De29<3HJbz)K?jEImiN zm(<_xWbbp$zwGu_`{BJ?bAV* zwlBtK)%N|TT5Z1o-&NZm#&_y__DR}RJyeISqOi;MsR@&z_}Uo@MsSpZCWdfRLk9 zvDtErkq8gfW>m*AA;$!ipMls)HcLkxgfs1@n~%>FpJUl92o${6qfx7msNaX&U}MtkRRw&`ZF)h3L=s$j3TU@s5s zwc&DaxFipE*||E+AA~zx>FzYsPF-N9^UB}D`H>aC!i76$4>?skbt=CT_#}#93xG+1 zz=!-R1G>@t!9IMJF>DO!6tDjRoys75w&Qb_+J8ZRHGf`sWhLZj^B;^8NWx%r+n8(_s3Y{w|M!poWmLp+b8N%kKb;_=fYo`@wxvUW}mti zpX0^n1)!7NDE@fvG;L4uc`d%HeQJ81HU3P%cZ$!WMOzq}jd*{KmPAFJyaY=zLb_lIZQ>zcs#i7`9IopBLO} z#%IrMW_;d<&oVxb`K8sLi}9V}^ZfDL=Ii>|;`2B&KL7E8q(!&X!w0Dj>4S&yS^D4t z)FI<@+OOjK;Bg@j`CuVbm9Wg-l!KwJJ<_O#IoqTW&+5-7t^Ijr8_dG`*+*^Mi zr1-oV{4~xbf3(lB#fs1N^@hg!qpw?Ze~dN1k%9ATvF0~qe17j_;`r15X4CfD@mbn_ z>NwN(wfGz_{_F$2K*XO3xmMdB$9L8CV{Wn9z8K%h_Vdve$o2!y6Y;0rIof__{cX?Y zSHb^(I=|XHy8UDI&x!0$^Q*Vk!~VxdoAxgpW7@y}4QBtd7N6tUe*x&y{+_W``>(}! z)&A)>TJ1jp-^u=a7dg27lZE}0&e8q{8fbs;|DW3b?AfU6jpt(j_i*=eqTIayvu19- z9iNT%Ki^^GAII@Ip8fZMF6}>Ifx{B}kK?;)|1r;5#~a1?&f5R)h5i3?mai{=d-mMs zxc=2Z`-A`g)cz;_`}V)J9`-*z*R+4(6Q=$9KWW;3Ek4Jy{{qmZ{XI`v?Y|b^Rr{yU zv)X?GzLWh&KP~M4sj&aibF_bT1MLs~|5N*a^xwDtd$^N5QTt!}xM~0F*{1!E|DVGC|2RkcKVN_QCmMf1H)DSZ zjmJMx)~95?XWw6vXgnTzC%V1sGyaG-HmCV>njgBY9=2cbuxWeGBc|>5;j`m(%ADl?s*7r>}?LFZ)roGc=m~DMNKF5poQ$d&ZcKp_A?*;g-#`@#< zuG%~Mcii6n9^&?XXA`&gbNGKw_I|tm_AaAw9{4HNk5a~Y|MT(PtN%Tl)A+6!Hop@# zUx_*3U!rOmHC(|?+@IqsmqXJ+%JIbq!I6|sMC z0qD}^p8KsfUyJWF|3>kG*0j5p@+QudulhVYoR77X4LDnV8gi{{nS*!rwV%HkXU|JBvG z^bGDWqxUHOh`S{N9Y9A}O;Wndr~7p}rgSjY(D=I(o0NA<>x6Zgw&k0!E;GD$5?&+N zetxxBm!W$a@I&kGot@{;a%m`o_Jy{al8yIwZ**mcH{(qEn`wB@QbtZyWoAy*SH}~# z+2h6L`0Vgfb9}boC3Ae9_Hz93*>Uhn`yJM;_=j?89d{Ke%>= z)n1O@lD%BDwfIjqU-vB9&0=N$=Z)t4;O~1SExMr|a!?)BD2vTeqg=F0w*T`uK1(^K z{?01Lc6=u});z@JnD&%Sj)zS-rb3Q>^=J!J2kAs|I8ZLhL2H?7@mc1o{jjepUjLO2 zI+a25l*Ra*rR1vpAF;ND1*5Dw9maPyS8+XW3-1(&{tN%lssH+*{%wKvU*NBA{}n4= zZRmWt?~%mqp}skb?7v>EO}u`zz{{~Fn|rdk&1rpqA3n?V{n0tx=CRiI`-8qr*nB%a zOPkaB(U=j|^`o`;uEsyd)ns$LDQO1A=&$2xkCmuLkzdafGiPw+T_Kd!MbT{xx zG=3Wc91296I4tm?Hn9MD${aqObc(aSe;mA22DOPo@Jf7W{U{xJt2y0Nd{^<=j_=ea z){GSW!#$#ZxceO2#G(4P2{wNV{>F^o|7-0dFM9hpm-)NTzD#WY^s7w!7vpn=h>2r{ znlW)NKF72FTF|BavxiyjzYpJ4`}ZGiwSOVLGy7xRaT&Fb+l2jZJxBX5tiS#LU*`uD zzd|=gxA%W*{C*E?pC~`*pKJEZ+wqxfPx--Atf|O;dBGp7`S@XcXZt(;$aDI2qip^1 z17^ScRA$nmk@b*+>Zlem$b)jF9Q*KD$}wiKRgPkOXX}`M;&MzIX_F(%l;bYQky($n zKy?(zScuOg2aAQML*@r*OCU$QSSaLSu@JmjN`8?3qIG;b72hqf5Z_r_SSrT1!$p38 z|L2q+yj%aa!14p|*Ec`-udQERp13_UG(T8*EO8r{s++#&c)|3&wfHQ3um3`;oeJ@t zd~XWYoXB6EyTs;ux0$}Tt4GqJC+Z;w)ln^cZ#zDd@3FRsI;0%O>9evQGF!C8exfbj zFu*3qTvLt`$T6`Va!?&ojzW|#<>)WkViw*`3syyo|VJyIoR_#?$|>7 z)V%)vJ3L8?a2MODYp8_PTYud9|IlX#~$*oD|j?}-4?vZb!*$gVUPbNXI;i44*WJ^UAG6F z`0QF2LK*+Svl{N(E*_X2PQv?U={>OY4p=A7g?{yM-Qu?RKNx@6@KYz`oRFfO^aR_p zyLE8C!AZ^CQO_sYaen58ai}{BcX{MF!o{a?KLh5M=$+JWgTC_J9CmNPA^6?2)>`h0 zy*X9$lC+!PPt)JQd(rD!Y15D0Oz#-3XoGjp-JFR((53`&zg9W!e#kDEz3^e&Ge74s z=eTE_j`_22cYQJb=ip52uXTRU{P>nhWB-J^>z$g`?xlH~$7apjGWIOpIgh*Nw=E6b ze+GXaXS_M~<5k=4|0~`HeEkS*Q{Cl1j@^pCx{R&tKKd{5`?ERPrlGix{&M3?th2Td z^G?ffKZ+N3Z~1@Qy^V&mG)}FvxRV~bLkGHtYd-G&%E7xM9iaOk?XkH8f6Fw-lqs-l zj>}>2zmv`R({Q&1@fU*6fxCf-KTAuRavXPf^-#dUd)d z?XN%ME>yhd{V?4bkMigajXYp62W3s%G3UijD4XuSPQ!n8zXyJ&yL70IX3(F?o{u`H z>^ziR@Q7y%@Icv)+P$qX@A_!*X2NbC>gj=J2@Bkr6_)LXaM84m`a%EpO5MmQ`@EcC1u;Cc3V96&a#83 zf30Y@%kUo3cin*9`3zWsJQc<+427Q@Qpc-ae`y>9Hjv8T0+n@s%X+)>rU7 zuNj`{j%S+lXR4dyT>zuWr}({-)UMcb&9qZK+_k(c#k+MGJ=YxXF2r-MBxx-tw$@sE zaYmosWgM#e`kSulDPt!%aBCni`a9&i1K*e9d`ThxK5m*cc5suVu^-P{IrgP_pO4)- z@8no&X9YN)|M9%n@!M(q_U+hP5SOw zE8&yT3gvV(%ju8z&C7C_{W?S`rz`LQZVVr^m5g@Ytz!|5NyL!JlDQ9WhfUT-LNj-#_!7Eyt*z zc@%9BF}1b}&PXDjQr~h&_{lWHP@F&2mpPhFp+0SjBQ@;|-s@Y8dWNH&;ckNcy-_~h zVXV>`ukPp}=Z$k0E*J%?R^g&!FH2k+zcj(_E5ci(Nl$dDTJSXEfCvrN!^St>v+If2&N&cJf!*6pS3&q_DxYLX78rXn$z|h?(bmxG3XyMK0 z;hBxNAA#;32;j~E>SyV`flcfA-2*L92Cd=E0Tx8dz<2tehW~RB-$@3#izz>Fp*|-G z^|$lyr@IK=>Yl{z9VkYwN_`gbP`)`^+&kbTywP73;NF4ZxN~4O?i|R%odX59b6_~` z9LU0*1EW5yTTHp+A@tM7*YSMehH7j7YS;jGl#vanUijdA;QdsdU>D}M zuY*Va{yF=-Bl~?VewR7ORJ38T{R!k?%jex$hO=nMleKo=AxH2(`UdOko1-0*5AQ`g zgpdFIU$`5M@{YVmF56Pz>`+?_9}0>5xS|1(gSX)B_@id5+p4${US1 zMCDOg1;}9vwDz^zQ5N~hCpgPUn4ds-WQRlefA?o~9jNbKhQ4|#?w%yM_kD>wCs9`j zbgJ(^Xe;zQ`C$ltJ_r=o_&k@ZN>Z+rya=!!ZF3`w-$nK>WpO75+ zzKiuFFR*Ef@x-0o0eT3ZVC^l?jM1sRQI7jDc<7x@ zF?hm9;9vg)56MKh9HG1z_iKmnJjyH5f-e0X(C_52{e{=jZfE0j==*}#*Wo#)%_WVy(<+v}AI-SRw-7vc4wPXHEA0gG(>e**srn}c|txhS{Dmd6)S z9$##hE9geOptskT*y#bcl&eS!d2~Gi{TVww$j9LfFZ4Hs3FtFHpGfyO0`HtqrcTd! zg1vPu(1QAs@N|_P=xWm4%^7_%=oo_(8DkLN75XYyEB!A$y=A2>TT@K0k!_pi5NQ0d z`=odC7d>5Ny-#YJX-rbx4r7puU*ThrpKzZ{&67j_@qXQ6OSx{0ZEnZdCY1dHl}WKe z&Pzlc+k_lHu(6F#8QTP&7`hGR2DpFKc!Hf-f9Zq%TF9+m23^o6knh#dZ=Mk1eZa%= zmy1A)`W)!zM|;lKgFWW~jmBoAOX;<(@y@MFaX(`#{cXQ@h+Pkom++DL9BKvGX`JTQ zhR~R;I>pb%ZET!&@`<7I?HC0v)l0KD=7i5j8tw}bb2n7($0vhB32!$3JLw;K=%j)< zY*6iY41364rhA}Haz~R_%4r!>LRN-5$u7r~kkw}|H;8i2QP$BYGtypt8SXo~#K)JlH{zsq_oCzMI{RhrB+qbVJZ~rRYeW6Krx8m(zr6b;u3@m7x?Rvq6{bxfXR&e?reu`B%oF4U8yvpzNbr zz5No_>&oYCL|7jkwILA59034L6mC+0_M} z7`VYl2kAd{iBCTby1?zEfg7G9+>XbgeHu}&fg7v$qXhJSf=+&F!A;crH>F+!H$i(F zG#hTns|M?&D`aN4Z3B-DHk`mQL65)<&k=5~#Gx&YC|AJ^&p)4l zJ`eN=+(f;8rCtL!L7NF$1a6vJ*EpTw_8@p7a5H%rZufvECT?06Judr(1(B?ft#rJQl(x4H$m$MS_E!Ej2k(f;no8@5xAK=47X0;iH%#T z-Z}xj8R(I?r83-{acDnww%4oTma3mlK(7To5;tD&QP8AJCT^Ve5onRPr2;obXSn?X zJdwB=JPfzJ;1Rg-ae}XxjL#>vKyQ6#0{UB^Lq^soG8yqaJxBhwF%E5AM7ez|^_C`} zzYMy9+eweFk5TU*m3lv=enFu<4_X9n=&yy$47aDuxhu$iDe7_Dx155!jXEUWt-@I=_mf5-Ij^^`Qm=uVkf{e~5jOL8Kwr-1plH0<2|N+FnLG@)R^W+= zo419Yl7Oy(9)TO4BizEBV$;3>&04R58=n6%0sRxuBXAS-exTHA;3jDQ04)MHttI*- zCNuN5z2J$!&E#RY?EsIIpXMmoTmsq^$)tsb>u)BYzYe;@?US}5cf@m)hpyqY3Y1l2 zr>!u{t>E=ahOsWilam6tt&6Q*fiUT;mC3 zF*YVZj81^$>rlK2PO=|dCH2Z2twTWpKx2%iCQ zXuTuKRqT%EyCqTZHDy`M?D3t9?j5xDuzL*LNOz^$%h6uS!^Y4`8IBXOhO zAW$&K!zE`*%dSMx3e9@O(`I`d>h2xWUFodlB_+SL!w5 zjG(;XC&J%M9u{X-gC|CNL7Yj^0}1GV0$sG1lSX?H^QwBZ`a>6D zF5yCkE6tfcZI)kQvs;CRJpuj%^hbF8bb6rr^ffn8$x5{Eg8WZhr!g;%{~y=5Nn~ zCw7d{^mz&B1)xX97>)JGkHn!(2ThUxBrw1nBIYtf*as%;elK_w`RzQcPtF5R47;Pf zG}UiQK)(@m>6=EJ!E=QFb#Z9f5#<_oXY~$AK)(d^h&Utay+Engu)CmTf~MeBLuGgZ zDZq`%%9uiar4i*SxZ(Mi6VU$vdIWBw-rpfF?(hT{BgGZ6y&coy%44&A2ldKO&K<@>5q~9d7_SQWPtwTh)s^28*Efdh2f*$EN zyk1SI*Yq1s3!i7fjmIE=6WE>6nctiQkAj<>hqbrQ!4t#oSpU6PKa_y}FVKbE%`qdM zBfHncq3r=pu{)P7bTQ(^#fII3;E9mmQe1eHG}!?&jVI z{7&)*;?S0WrpR9b8&-Hi{ULvUL;fQ0DDvBRnEdm=BmLGUANsi@y&wVoVbG=D8nFS- zk^B$Fp-l!&k)PuqNJc-GWXSIWk0QUFhsl2%c!c~#5qTljD{o9dzZP`JUqtws`2k<& z^v0nLi73}-cNMfwdPxF$U(l&ekrx*6xf)(?kBDcDKB!0wUZr;iUC3Ny$c*2qZ*Cih zmL5^AAu}sC33ROK7G*=O9Ly0zz9J9$2`$uzt=az6j;%kF9~FHk*NcPa>tEt`F)u_o z7P0*g8umzFT>Uj@0lqf^Wf}V>u!p6y{sm}eeO;CMuzrK`LrQ(v*v8kVgI)E%;df~> zBQA-x=>woCenqlYC~Ma&F8viecQ?~&Xn#d%7woO@UTEw+5&O!D?0ZjWugUI^_Xpa4 zvI=`4>U^&Z?H$s7V0#s4?@8dvp@a9=Ej~(n)=)O>U)wOZr=G7}sM9{S9S;BgV77n% zbEvy|^bWay&8Vj#``5al9>Uq_#a@ z!ECRb6X$%iw*LLJM{P36gZ*^aQ&ObvjoF5Mlup>K6lVlzA7wT6Q66?Bmv6&f%5B(7 zS&hAv)!0k94SOl8v6u3@zZ-ihOds%dXFhO0>WJzCpx*gSj1*C(LofKK&U+NPM-xJs$l@I65r1e)S|90&gu z=o6V-%=h|%M~P{69@Z!J0FPCErTzOa)jKDkw*fr@8$3txAuSFqDWY5jH$4ASTf1CV z`nRA*;3n!l0h*M_z)jFT11%D_LAu8247ZQK6N#I_!*Kftcm!_tz7~C16MbI-`kz6E zjO1%(E`jH$FWVZ2_6BH*{5ABvC(smevx(7{tpkrDznzEmWh=lF!|oNdX7*A7`XbN; z#%5n8*5aOvLwhQsT*I!c-r2F~tlxMD^a#6){^$X--Xg>9f_5)x3T~n;3`KikeHpWR z9(WYo>^#iww}K~z-7B=f75dl&^lLyDb~ke{JV$oVibJ~sG)4XjU{K-l4Z-~R6^7j} z0*@lUorl@IH+W*okNMi}3Fz%XkB}eFk^C*=&{9B)kUwP15i|Vj+8DC2e*K6`^e^sy z`VXK5l)hc1ow7amseCTfPyf>PoJu=ld+u}jT%f=Hq3t=9_D|4^egwLcKeF7#H-Pmc z?||;H_aoj5^|$bQMD7ym$@;CJtv>Wew3bz*fnF8uxj--W-0QKP1APr>vW-)oWa#ee zt*@{>r_x@wJ!fLwNB^VkIhFQ2Xd)&k?Qa%~t9)=ClRvO3)PCc$@aNMSsO|FoxSD;33?EZ&`Tcoc8(Pk+|8$E{Lmxb$0@K zN6@8h&2hkBX4}?rXsHq98u6ah>r6mD(>hwb=k=ZjP0D1(drmtJnu43~rOV)NjLvX7 z0-i{JGkBQ4y$_xkxM57)P2Zn@{#VeYzZtmUIm(ZA#-VMADA&M^)w?k^9eI8?eJ$t| zKPa!vrulH%+bQZT1&w|qx`CUZy#iVUZlP}SS%%vmz$0}s$Kg)a2mIdpJom+b3;BuD z=%=0pkAl0MhxJpBfk)zQn=2^N{Fmv!O+cRtx{$HRkP**O%$O91b|+{N`g<=&d%Mh# z{}%8l@^jxZd6@iTz(evA&T4z};ycB>s}sh$z=+ z=M2*~L67h?b5C9PXr@;78hC`|0mU^8ei4 zwCwx*l(HXiuIqc3vphVdSsC4-_v4JzvahnzrnT3+RVzkoVK4rd+^&TOB%}&UI?Qw2rxfh3rh?sT1LpTzY;Z=w~3yA*VL|Ih;Q})Iyuy{K^iwew?$x z8T%VQadj@=IommI#JJ4)8AUsXCO#^DOdjzt6q7TF4)Cn(|kx@{%Jb?Ex zN%& zq>i~R*mu*0WPJk8PkJh@z`JVNme&<%WpoC)DavVrKb*J4c|-qxirX&yf3PLaVY)i$ zfrlMc#cQ;1aY=K%colr=@zlYX@2Z%HKPoRjc!i!5x0 zTrHXXiv^$i7o3mij)354%X$7Jc}AxW_J1-a>~5uP4B#CzT@bespKcD!a8wnz@Gd62 zzkuTCqp)@58gF*x!@O)-(}#htjnYO3i&+G;x0wanFd%3i$7DZ9D<=JwEK zeWvRyy<2BPA6K||T$8HerHE74y25YV=n8MX9sl$2`)F7AH1sIOd%}o!4&+XP57KAy zAO0Tk_T|Krf%EVSdUeR{g1F?%()2#yqjw;blpsc+zE2Scj^f=qM5B8L37_R>#^8NF zoog5L?2x{~>1Shbp1oc9U3lgQ;>>d37+4RCT*>oGlkk_GJU^#h z^88^;77b_1+m(Nd_e~TdM*WQ6zWu&#P$Bdsd0&OTQrB%%_W@vqv!RYu|Ng1?Uc9pz zzNhIQ=h>2g2VNE|8V_DJWFwqcvA(h_9f>f zJ}SqF{n1nh#W3R2B;TikuWcu$|EthhVnBM6ej1*k_u$nPILcJrIVREdE`DAMAMTN* zll}*x>mHl#RYG^~N231cz2RikL%R3G|08&oS^G&BD0gePWVAz_<*V_;XwA0en5ShYG=d#nMq|U z=4;{2(7OtHukK~F`7BYlf48E~d~Wkkv6hwZ&tm$MK8ppfZ#(0yDF$CJ$ccBwh`NUx zx-SsC-Yp7mGI-sB7Z^zW3#I;*Tn5T5Dhozbtr*xzUu$az5`*r-&nb5yKOh{k@SZAq zmUQ=EFP!54MbiIQ%+tb^z+&_F&Z;HA;~DtDHu!&am%?FJNIBLsIf|HHLZJ&H0fVwG{BP%xKz9Cjg($`3dV zU--L}cb2d(_+sI(Tk!fH;^h{DmvomnNI%#j`KEKeE%V?9`JMD_(fq*INI#gx{oo+5 z-IHmJ3%`^4PgeAw#r1!Z^w(U5{<_rvF3vlPY)iao1Jow+^Ib+D00VZl(AfKQ%5H&7fZZ2wEc$oXb66$k- zg^URUrMx#QI6Ta87)dyUOdM{M^4`FCi@`_w%UD1-kX|Dt-*qM*=`Ask`d=maMsU6@ zGbko@H~K@;{|)HQVgbfQgaPXp@W0-%;2z-vv*80htUmB?YIH^~tA$sL&;qu!ZRpp3t zL!etlM-T z@|t>4zE*F0)3d-Wn;#d!&-*9xiEYM~eSV(GO+>Q%za zrQC#kk8)JXOUVDEjRI}EV_bD5+L)v4DDrwWCaXC~-~o;D+#>3WW#1e|4F1BFpNtcA z2bU^3J-~I^1v&Dur%megfYg7d&$IH`8LgW9E48P=I!}rH>uYfqW&q~@FdjX!ZWPzM1L#w8Y1<2P3Q&Q zSbAM3c)jpzztbD`r)V3gJjivD^rL)I=F^pPJL%Mi`rv;@F*YInNKe&fSu1v$IhB?i zHFlD|luvE>k>{9YNAiN33enO`3hyn)+V4)$Lei3#PH1||zRCPCm(FHF2m z6JoLiKJbi!$tyx0-`k4pz~o8fg!#Uv7EIn0yxtuOZwyS<3tsnDg*OH!D+I5$8JPSA zm~=G!q^SJ%>?(V{S-G$)#(*8zoFVy)KT6E96cR?JTx zLJq-VF)-OVF~x$(?*wn~G0scok2CUltIXq0W#jMw@S=KU{wZ^=_nPsT;rDYn zNN4E_gn`uSwB(z``ABE!2Q>d6`Ho4xhd3YUD}6v>Kynq#`E)k!f;=)#czmhMH`MqU&+eU2W;0vfy;#WLezUnHUhZOJuT)Dr*dTbd zO`JDgJ6J7vL+d$jyms)i;0=~@UR8g}H!Bas(BGZbApH+U$vJP6`jfm zmF9!J=-*=b|76Lxg!9Gn|2)aJi1SfCN_Lm+zw!vvyC}l$q4;`}Y%<58_8u)C?Ih~< zE#P${cf%fJv{5$ikZ#d?u;BI1i?4S-$u}py-X6*KIOn5$)uQ+57R@JFk<{M#CUbS^(CqMomSm@k?vXxi|(7Hoa5u`{;J^f=5oGR zzP>{8-N^YU@3q*xZ4A8wEgGcvLFm25ruUsv?`xyz9kS~EsNnVI#Mk>l$u}&%-gisB zD>xs`r>i+JVNjXLb*H%Q@wdeLmNCDEIG<iJwxh#u~qkxWbOG0{ z4z#l9eOB;#+r`)WwBU2MwCXL}H??)@*N;iQRL)1at;N?zn0ixQYxL*d)(z5oCiI?c z)4N2}9k{p!>!V~`PsaEp-{0DzceUX4_2ay;`m;@f&)b{x#cJbgB%g=#QEqC{dt5BN z+cZe;@z8seP47vfZhxm}dbhFYT`1*j7hms(1)sZRe7&bhzEsXf`Kv|m{8)OoZIIqF zZ&hP@A5pi@Y1O+Ivv*sI-Xo-(XXE?%5W%PY!1-e3uNO(a)0~g;7Rom$Z+%l>P&tF^ z&SIOd9gA(`^9_k@;}IiA+49z7O?dnE)$+QfpR+M-pq)kUWFe>bGtL_;Z~sx0={?N( zs6ETPUAA#*-=`$shs_83J7X<2L)*B%GW%=}@-EWNKCf80)5PGdx3bTA@XnoR`rnDT zPi0W7d!SGH{drhll5@vu%v(RpaaQJZatu={WjfK4wR@I>AfKbLoP9jIUGTcU;JnD= zF?Ql}=l1dJ8-iCm!g-O$8@Y{rJiA8lhCbrF*-RI$OwLEL@!WxKY&;iI;+{R$i?JKV zf>>7zoQJl=*Ol!U$ox)XaF^8UJzjsTacrUF`#a~0755&NeET?GthhH#@?n03WR!YS zZfEB54b(dnTkkO9-!a5LsdsNtzppyJ-XkR6oALD?BKbDO*ZU&LS7Fs#oztv5&Gin} z*WT{-G3|X2dhb#6{vuiA@~e6MvBvGmLe4-5=Zo3?WqGe~zF2YZl;m52xvZPf{xRoC zb}vD0_gCmC^E>JTn9m>S#BzFyfo%R0XE;4R($hNsxqR^mHg}PMIZ*QX0M;q$`X!Z> zAg0nB&vMLPP<#kr-ZKaDy%dY8fJvExNr{ln+pLwP|7YvTf%cZTSS@(nNqnAy+5xSf z@OH-6lga0)o{fT6tK-!Q!El<3cf^WfEJ5Uk-d2E`*Q3WeIS3M#1F{A(MZ!6_-gg-t~91 z;4)M2`mRxUMSRS6Tj%@k7rfqV##=K2vdcar-)o)k%NM-vp_uP^1Gu2yfUY$(CXn-= z7HvQjE z;&H>>EsFj)%dXA=d?$Fdj+{4EUvXUWwdH)V`if5^UklC`kt>$O(A(d+L3&5a6<-o{ z`(?p(a+$Tp{_s=X~lMAFZcXZiu0`uS*=b$-zn-2e9h}-Z500gB%9;xV$u6i!R!B$^Tz5c9+Z5aDrJV`dXRO_XOiIcg%A&4 z$dU1|hT`E7#6y`QP`jtRxw36%qwQ0FK{3MP?ixEDVx6AlNY;2*L-XA-9?BeA<_w*L zOxmS3U!ZY=ud4-|>PuM26rE^gulPI42wm zHRJIR{h-8z=D%4ybaf|8YCHk#QAVFbae>z7qvg@@;$bIXY@Y*v&&A_`cDNb!nLLKW zKPZ394|KO+@r~dOeZY9x9I)s!5qGS8=I4UfdxDqCVyD2um7k$Msmu$0D0tmpa9$_; zg7lU+uzB#z&MbE(8F`LLYu=bM3T8yK5u>lfzBc9?X-Q=P^pmW=fnUfz;-HulmwvHO z$`P_+!Nyg1r-K?J)(c*(9$2gpy#6{~F6l4(Nfn0|CEuB5SQEh=xL7A-GNY}?ah1_W zmN1{-ePqDR`bZjAG}I^LSW1lhHGdpG^8|JuLbUkotG# zys=_trsO+MDbvushn}qH-cj%dTXEiqdGej6?i!vmbPx1sknUmR2ghvr!G0%?2cZwy zoQe?-dNJEub^l862LHu*)%<|=U&;LWsN~zPlxgUmY1yB9Q1AxcX))Mej&(uYW%??g zU#KDfmg6gm4}45*wu3ime!-u~FtG0*5%UW*GTQA(QtF zMSir0QohJFzQ~xE<{~1O9 zbgBQ-imcF|wTobHi~i?Jz2?T(zq{m{t&}PC_x90CF<&qBZ!7hG#HznKcB*t`F#FeA zf4mPXmi=c!|H+E}`y682FkO)q`X`h9-RE2M|3dI;Q#o&}nE0{eyGJQg>hC{ae^SvO z7v=JEZW9m}TI5*zMs=Su%a___7&)ZJ-M1n0u0|VB_ll@}o{vNqs5nvT77XahLEMsjRMekgNgW9?xC$ARU@c;}47 zqaOL8fdidmkz*&d4eZgl9KkBZUhsiZ!Xeb(g2ShRH?T3%2h<$l1If2uDO2Krci)sM zK2Rfg{pF?)kgU`P7-Ob!ivGa?On+bf@?%5)Xyc`4Mctw0ik#4W66vm8XwiM8;0?YU zU-y?J-=CB+rSAR6s7YK(~l76UG^2cghuHKHv#m7|{*_ z@E;=%V624s#0nZa)0m0oKjk<{^?~c89GexHr4QgfS2YgaC3yWC7;g>50Wod_*4A<3 zc){y?RVi0u5xB_W2V(`Vw+vX^jWKiwvpqzNmu4vbpk2&xspojf@CWj-Xyc`1DaS{O z%)o-JJ9{s-VBrzG?tgP$H72Uv2(!EoZvC{537mrE16*-|h<*xaGODwv7B6z*q;}52#-}2psm< za2P4%&|YS1$40+6lI28$EI3RMyrIRM7dcUl>=!9dRQtwT1#j>LrCjL;cn9c6#9WER zXu%tJj`PyENR5Y;8%#e?$44Ij;ClN3>0br?%WV25OZ}fxLB@MDP>CCeV18uPZzwwhd6JT9Ll-x0i_JkA@j-{?RL-Mv>dNcWl0eX>pW zd7^IbFBLhV`!31_{8w0XFA==%ahx~Sm}rUQ8>^Hlb=QWld3&k*?**?m3VSi`A0g+~ zD`;+gF5-k77g0Ol^8;oK5OeDl9{&)u6YE;6F@H*Hu#szx6_&Ym;4%uh$T`#;AyZ(! zB0u>9VG`u;9Fckdor2e|wws_h$7ow?94B~vg-W>+7w?t&NaYO5b%NLX7;xEb#U&Gc zfXtOyTs&=J;=y}6BrcRE)7t8C#1YzKPM9R)KVcPMYYyU!fmnBt`|HO)20YvjBZrc> z{B)MLlaQ{+4_rQFdzG%T_)141e~|A_=J6D`L|b!cE_efce=_HlxcG+ZyVA_I;uO4o z>{0e#hW?{16((aPeXPi+%jS*Xzx7XLD zfKfAGM7gEJXQRYN^b2xa$zrIRpU04XQzLjqzYsT{+$DHrzrf0s_yE(9%9_lZg4h2v z@cG$TtE$+F`A1rlkY_WD_SBYP#OC11ZwMa`&fMGE6YXCxaFXj)N}jzHbB=@=%eB!~ z_b6v#?-w$;`M!Iy?@1bOvpsHJ&EhxD3SN!xy^rfR1%fxUQ1M5Ji|tI;Zv}7g_rT?w z5n=aWwpLa2rm|K=>zJ%PWh#DyGyHN6!tOVOi7nSGlDTHA@pnHVhi?E|M=3IVgst20 zv+~kMt`)rA^BHdi^|NBkfqJZCj-i6royp5ZPGX!}vaeNLB6zj#oOdGp;!Uh6sWFAE zV-7TN5HY35zAYL+haLUcUH=#}lo+6$|DUetuqFVv!{EyF4)# zVOj2_yxdr8RbNX!*uwwn)iU=iqTEwrLF;zRCq|f9cziDA6B=-9s82*2hprTIxSKOS zHhhBhH-3IzT;i}p%ACS^nVsPa%r|VgXQki`IhAr{`_Pgs$@fpCOhb2^ zbwxiZ^REj9uU5l(BgURHV(H$bLAr;LV;!^Qo?rYZ#@&BW{@LcV-|6HC94Byrlw zd1K|CXGEFaZAzI^_fQj7w$%M=!RxNVT;!aqW$szT_H`iE%JHYsSI#wKfEf?zJg+q# zCdfUD)ZFtRaM`2eo+U!2K&m1?`2%5MJL_95c>T!+Z-pF(+V{C_6udso;H{DC_xZu5 zY_EjGrA+X8e@q+ff8T}++P++`GjLfL1s6Y^=Z%4j%pa`#T`ag%0hclbmpg<^p;n6g zNCe%k}6lc-GmwN6SEu#F2<}@kCS^|8YQSdoW;&Zd22k>Dr)N4Hld5Og52F4pV zujnoDxlSopwx?j4UfRrzC0!&wBY;mE({CvE+=2Ea*ZB;5Hbldxc?3Rja?c{dL(M&B z0+-1OF7KWZWBc)n{J>=-`Hj1|CC1bWUM<()jp;Wb!5bQ@@Jd{4x#vFxZ*UZFX)-eG zK9)lB-7NQ%<6C2nYp02cC)B(lb6l2wc06zx1sv45z6DahG;6*!iD6+qN4Hw)mz+4? zdRgkH@p9wko-YXAz>g`k{#3LB@r3+Aj!W1W|A1SLVT<@40kKaCXZ^Dd{n;ddr~DXZO~TkG;yIm*<~BwvoXqu z2wX6J#hp;G`W}f%oW93CPT3X~)j&?0p0I-C5i~+bJ^g^bmjNm)dp$3=1&_#K-c?N93AW zC-{ebujMQuhx=PwyJ2%K*+?S^42vGBFA?5itO zWbi+0`iSgjBo@?m*uKkg5k6Am3ATywky!mq56oBC`x!ZolWk|PA%EInH~1lc1Ga7f{mxcJ+$d0N?at`fZd_u(Tu;3HUDCt0ZN zjDVlW^+cop&1bk&kdKI%Qscp0W%jnSc^O|@wVZ2F+7IDF@ADyylM>uc9 zIBy2tMTI)pd=J_-&7~3+gpa-7QRjWQTs$v}wZ^zk>i?i3C;WrWo#Mz3-zoU`A6jumWMFk@Ms-aJgLuG zvmJ{t@{nV;Jmfwp$5o2Vz+xBkg$@=ho)Wy?%eXHPMl=T|eSv&KzB_i7;B{ZZ%cb!f z=_2DnCYebSksyq=~u%9ir%jGfk?`c9r_KNvu2%T)_f?k*U^IWzlo=&Tz{^*mb+=w$?17qlv;LML*r}5Bf zluf4zqHgVzC^`kKXMP@+`hUptjCeZzM(Y1BUT(y`!x1rb^78k1srggf7=gG$Yar_Q ztG}q*T@ytozxB+{byEMmiFFz#_20$IrFbX%cs6zz7ego9Y1EK@O^z2-oxcB$wO!8zXgMd4GNkowV)^(n;p}s!ltEPQLS^#0anTJkiHe|5l0P z-T}eu#`v4s0NE*G&)*EL7xhh^5YOWq+V4io+n*D4`(06V!u_slEH4whfgNoBPTUyr ziY#|4_V2uYO*qtq=M=Q2r1rfm51;Fi;}VuvP;M3N?2~;jpUl7IxJ2gOs?BZ@as*$o z`r(t5Q{awTRln&{za@$N@NTK!B8=1bU&Hn)viK$RlQ}h;x0um6Qa_w)vbV8B`pMi` z)vue>ucg&~BiXpis^1W)U#h{2xuNKL5-ybbnf+mrF)!@1o`cL3ygu}Y{%=eyq^&8R zHgc`GQLykvo@+{kMW-nH_1^yvk2$_UhJI|UmCW`bcr3R5PVjm!GI&iaa1WHaSF2X= zx-T$zD-0~WJuLf`LV{Q81uWWJYxun9gWIc&M~ zNWwz1p6l5lcte8?{bFLVTJQ!hHh4`eLYbEJf|mtvpdYZf)WpImu#oF0tc{dJ!6MMJ z!ENLqu-Ie6B3H_ht;mdV1)IML_O$rLgM!yTl=0Re4`f)dF*wcwseUm@@cOX!jJD5t zD1_)mF2#%XF-mbBaw|fX)Z8+y;xfb?|5H8eKdSNbEV$nhH zhOPh>zlp>`u9q+@c1FPh_psI@c3QAl0xX`fVez+bdAtaXwPL~78Le1+DR_gU5@T^l z@CL3{%9VZ*>do&p5q|Lx!RyZg7B5^I_F?Ua=BqH@P=o%h#s|KLF~b4=&Vb>3|GViU z?mlckS2FSknzPCidoScUC}s<>PDE=XGl9uuU?S&Yo)xnAZc*fhZ?Jaa>tksrD+RCj z7m4v$DtO(aId44QC=$HdHNazABp!a?5i#C45(5vM0aNqxM0kt`9-|aIt`V|?Znxqw zlI{Pro(r2Oc!Rfc9Y?|jF3rjPKWN>PbDQ7|+@zE%{lgYF#t2^j7~t{cwQOyX>_}^i zU!o4#ud=zB(`??3`GY5TzFaG*pteFemBhl>uZ257$Tybbo*0^+i?*+ge2`*Fw0&(q zpBC*0^F~JegTJu3tB@6+&Jv$rbKXqkxv_GOmJ*-a6kdss?cFO$5}%uaPmk*?`1}=m z%k?8U?x}Qjp?ML8k(k@8@C5rt%xw}TG>$XoHgRu;ea|0ZL%0z>(e}5!A@RA#iq9_U zgOOvXx#xbt8=R=<48Nh6YhSZ}Tkr<%P|sUa5f%n z+ePN7W=si2o~w(Jk62?Z&8^wSxHF_2_gk@Gd8%eTU-rD<^-boygn{gD)N>?HO1`_4 zG9?Z;6E_lbwX)B7RPcK9fWyk`WL{P?$A$wNLuN+7AryJWE)fpV#*mjtIew?e>_z`e zYesJC`LY`XuUpIw6AogIGot^^5xg3o8?IsPOJZTm*Dn{mp-I4Ew~2+!MPy82Yeoa3 zVBzcE;Qlw-*z>DzMEsa##e(^S--<=5kU97e=ZzOX>O{GL=?ZTQEWQ=I{;9y?v)EX$ zaq5UDSZD(pj779@>KZ8r);82wI*IZ!_W(<*cw6xL_}T`ybufCY*dlnnd~GAHU%V!G z-7|nilTk(+k$zzr(~gURMWEqWL>trIE9H2`ibXOT(^|23Lhx!&D7KD)#Z18)nyv80 z@QeEeZ*V5C=pBiLWlWnN1q*lLvxu^9mGc+T#{2lTF+!=3*Nx9iheP$ zxJ>Z+pHz4y7PdaNpWyZRfyFhESXjoiGooM-Y&aHSSX4+XEMwXdjs>kLn`@2r!lFVQ-!B0c&)Bf&B;_b)GFPyE(u;kfY|LUkvpQJt zx=Xo!@vyi+@M?j?SY!y^(2KxgcO({azaO9Lh=N5h^6YMuT+4#ROkgqDhQ)g)MSf9X z#iAFR`@Pf>FTN4H!8M7o_+0P?Rwl;cL&57W1{R;0Sj-V^MBV3CxibnDfylGGiLe+C zEJoR|SSaPFv|_>LMnhIC)(c+W>xr>gA$Yy(5@WGM@VZw6ize60{Gvi)A@k1416_>$ z7HqvEFfd|#M)Mmg4%COT@hkQ#pW7kVyHcj?PyLs%ed=A&p#*fhiK!|Yor|iR%8YaY#idYo`Ieyc!LKN z-k{jKXInS8P4EW(rtnHE?DKzu*S`l?tc;BX8=q!I!2)Ns>ycww|%3SLo913?F6s)p9-(U!aKzBp0H+u*IffFc1L1i8J`Y} zf<=hml_}>z?R`kJI1z1p8vKgK3HN7;%)nwKwGZt|OPu&n@X|X-F|OzNSPU%wE_mr3 zqz13V!hfaZongBLZ}2@}@!9oq-m^l^3(N7TG4DB|E9+CKKNa(y*bmM3F{=I%G4Dxp z#Qm)ADyRNco%fXER=JMwh|~l3ei?cIA2u)SwVnrGB=smYc-h<*#Z&vd=QDyg5Kwp} zKDIIIY{BbaigUf)M_cf@4{=0}Sq*#!_K1Sd(1^UFG5Ca$j~zokCh@sg;!|Ph!OlJJ zqPr|{u3hbO$4GqE7`!p@$(H!6G(sts`Xpry?lOr_G4Q!H5+6B^HSie`4WHrv z6?_f?pFIjbUz`wm`#%&t;6IZXKGyT{NfMuT4c?geghjc5zZ$#>K3Nugz7o9tUBKt} zqr>hNY~Gx`f8u)N19EI@;4`kPeO&?VEBbl)&8uu{3$)gNHb(DcU~Nn6nWmg|Gu9WX zfKQo%Pe9_ch3heb)~JCGTUQ8L&&_WUyunICXNC`rWvP8pJCpllUz7N}&UqvDU(RLw zpxK^MT9@<$>%9-U!YS5BXkXJ3=<|$id@@DUtqDJuI+ao$D(;Gxc_aZ-cThDi2FL?cL8@#|&-qT>UW0v6c?clr->!k~s9gAqcGqa<=-gYcf z?KmF#jI!A=e4Mx4Anu(6c7{%Doawfn**;IoxrCiz;Ji{NpVf}3g4eqUXBf`#vmI2v zJi{Qzj%3Hm8Kw5dhZ#Ew18d}3sNQtffC@@b z1iSt;0R@3z!>f*{yw7v?-ZOjl>=W_cKi)s`nXGlzIp4MR+I`NPvo{p0bH9;OXEP&z zd-|!g&DpKlB39ct_pY?f+^N}?%Um1d-0RZTw-xn!Ug+Mdxr>dt^7^TwOqg?LO`XJd zFh~9l*PIU-YicKUw>9-c$`8?Jhw|Qu?Kd;>_v%kc+a%Fv)7GiWwz4RYwjR-E3tLqd z#`jve(zg6{l*RCHS*ZPmh&A;x9gU5gHsM_9cf!rU!?r_G?YJQe0S!` z_zkE&zGq0=(howmu4OS;+7|B9Y+cHtpR~={gR;0gToz`%aMsjIEM#=$ zIz8yav*&qz{n?_M)$=^octi6*FMj{-{3Znb2FpUfhl1r{+~*z9H$H%VXq@pK_-f_H zFCm}9^`bnoEZ&i}o*y0C(C-E5x4BQfQ`(kSYS#^wMSR5b6gNoQ(j&r_{iYiGoPC9z zB7PNjXnz{Nr8nzCRqu>=*ZlNh4ax7m%Om^C$5i~E{dN3PRs7*L6rR_i zzkEZx58!?kzidN{Kk8oV16my@tmV`J5Bk%;QwLfg{#r)-=c@S6t*h#{lmAX!HiKg$9>tirw0qWinhRhP=CG+>x8qXaL5~a zU;Bm?X&cqrnQeh>V9U#54#YJj-`m0aiTdL`SG*qI-_82!Elj|kkhn*N&wAl+0=Hm3 z^oiVOP~+*bV{%>HQi}ui<5Kn&rIGKfuA$1O$zPYxDS6%UdfIhW`DE6Pct64S(zX=u zd~|$g94L#3y@iurXHLO*Rr@g8MyL#&cir*X4&qt#qWwmfh1zFOWwA{85v%zeDvQYH zHtdwPg?RrXu3u$c*&uCm@D51&;> z>l-=i-_Fg?M-)6@nb#Ax)Ajn$__^SzP}&;7W56DApW zUvtKh$mcO^k+!9Hesie3qdc7TKi*5sXWyu`@+;D|5YKO>ZSnfFjr#Z2tncf`Xt8BB zs4_OUxQf$aHWs_=1B_Gt?$i85Y}FZCVdQfJ9##JC(QH+0o`z1&RcsGR+Z;U0*@^-;q!j?IHHLglP@q=@YSpW}IP_n3{< z@yYR=c@g^sF-3a*1Xqk(*CDpSMr^0Pk@I}K?}fH1HfQX{vkUatnkj#m{dH`K($=?F zTzAvXw2k^Y&WUe+dw(C4Q4F}u9b@Bs&70E~Z7ZfI?_|~QW9B{^=Ov$@e!peR+1^lb z;e9W9T#q_?{gKZnsF1dqc;^dkFJXRFeVp1jqCS2oZGCfvZSk(~vjyod;}UDL_Wr22 z3PoI1jVp|)_&nLpI8GUHJ+6GkJ74s;ma;Ay?^#|UZIkfM7ut?NEGjPctEwIblpWsr zQjGl++F~BK@0CNfo!@^kCe9hS)>^+t{LX2`$drxD8S5c)rRw1p+~3an7cs9~?#wIq zabD?M+t(yCuPnYKW@De8{kwJ>@9C=6UTQ9tA^j@6H!@bSpWGy(Zr&+vbM6$j5jh;w zG-AK>7HOL~0r7TE3B{}CM=IX+JKKlm&?+7?-u@~!&KGmS@5*JIs&C==Sd6*zrqki) z)fZoqvQfoZj5&1+>62$nWUS7fqVb;CUedPwMq$f7hI#EIb2MsVz)Sh=xdImuQB8N@`&tju8fRxDfdoGBcBy%tKoR# zioAGc!sM9#U0HwbLwpMn-z+V@JESk=-6P|Bl<|2Y-&vY3Z41w;I=)J$hPMbN6}o{#`j%emKF?RgH-%e-}z$GFwE(R~_$D9+MRLoPrV3HmPyd z@eNjXSjVznhWc0dz}Q0lO{2dVpYsmVs@tJjpR)a{7}?+aaagp&!WxlrE@hl}HiACx zw@_sgQ+1s6l-=)jobhI{j7{~c&bqTh2WQ=>%7AT;_0)@J3z&5^^ei~_d`a976pMZ} z6?K<=s(QY;x$b;Z#^(D;_@U-B)j3AyL_WjdptSXT=d6#aoUeT(ZOf0=>4onU_A!Pn zlVY7`?aW53o2JBW996Qj?~0wZ{og=de_jXfN$y)L$4amEECaUHB#fy`&r8|3_+POb z*D+D*t?^@sw|xLniTo$gXg7f687$B>o%@Dsq8)!c4i;TnAfL?JXf{X zqUHlmUxYGJ^H!Bxj+d%$Vn6G}a}C(n7HZ|g`x)3*4VFIfI~_gFOW7~^BAIM9jDA^t|H?KU z8h6HYIJ0p_=33>J_0@}at==HVovTr951?$uY2(g&UyJ^#bXjD4OBr8IGQR+X+a!%q0nU z$1lET=^eASaHKC-!{ghS&F)@0t4|)}9+W)bL-3`rNbm zpg#hcE&LZW$r--1zb6=2g1@*L{tYjCf)~Z*3=b@VytBGL@VqC;^UqEk^hZCBr}4p9 zPkw5(*!Kbm(h%8vIhj<8NNm(|~2i zc~(15vk5Eac`^dKa)vKn;tRIKI=3AC^-HZ{{|Ka2+Zb5n3vTNl8(iEjHn?dJ{;r7) z2Ga2NvM(4I5gS~D90i_7yvPU7D}l_A8o;l zej@Y!%njDX#9MKQQ;D$ebXv5?Ui8;+1(pv6t3_En_hN7 zKACEM!1kino9OG%*EYraN9=K^G0~Z`PpVe5^Q*WgD&jod%5nawxR`E%f5mLfh0mLp z#Ic{;hw*R~_i~)?vO@38ZR-4vZh49NX{NX81c!p2v2?^>YQ-Y(sED*e=wr zTh9Hurnq0HW5heM-cYtr#Pw3StNgh^D0f4D5xM(0u4OlC{?JYi9v1oIen}gdzq0l+ ze^-e7T`BX&7^Cu++0j2bHfMh+d{Oz!9@a1;AoIt)nyE5>yjLR$xnmA_9|m*AxfjcU zdoRwu4gTL*Gsejw=WW|siCnH6Dsq{8{r{fJE8(k|%esj1Gb5MIzFg?}AR<3wWto?X zT#CFShi{<##^ByvJ(o8sTU#y*JNduHIWORkc^|H9wOl413+Hk|#b4wSeOu}$;asAD zIc>4vDv`^PPA*#&{~z?fqb-JW*-Ey>*2QDWJ2|-=1{;;jbdHBmeGA%U>*CF5W6#3(RxfC62W|2V z&ewhFc^)EMNze0|txFz{E8Ax@Th%7^OMddNEQ81o&#U$*zp?S*^^OOT;y%P(6!8N@Aa96fePIG5$P9&=gtmB{5tCzq{?8zD~DHd)@y$>mg>t8!U@^VK-X zHT{|7lIwPr%O#dv?mZ}SSymp-<$v2I8^Kr9&CocxAM$6mJo?nLSVSI^VaK*pYUHsx z`_|I#5q+yy+1m1m=chc1v0cq~nkri@kLg9>Jg&h1Rpt?Es=Oz|dAuFhV;&23N4CiT z^sa5vlkDWN0c=zrlbeLcN$!cCNgfw!d7Ns=V;%G_Y?B4Ahx7Q~j+23k=r%bD{%`)b zHlAUeyoGHN&uQt1JgK$CMx4uB7Cx=nVw|+)@+E1Tv{Va@BSB$$Y;UHBdh=W-^l=j8GS znafckmz$xN?Q(9^ni9_oIfz_#hmFc*<%w`E`JKy|Aggqke$8nGD0`%SM8|Mt? zUL5!3u>Ur9L#)`-OTz!$yQ?Sn<94|0$3^Moeq5AZ?#D&x<$he09`myu*pG|S%l)`0 zJ;siM*pG|SqaVt{eq5=`eq1T`pgxS+k83)i_Iyu9%t!y-e%yNGNZ*fRez_mF7N4Ro zZF;<5ylQ_SO@5c$-N@e?|c3r2v@%M9)`*9V@ zcDw33n;tJ28_r$raUyrW$o;se{2BXk7t8!5=g9oY{kUwIKaLMkeW%=y`y9Tg{AJ%B z?mL&uzLPntVn1$G3$5>rv-F)Svt=$(H`#aoFS*QyujV+2iRu%r-qXq)xs2S86Zx4Y z%iL3@*_N8)ps;;F+3wP8RW6PFxZ9QOj&Lr^Muv0Q{f58DrLiCPCa%YEFcEctd*f<9 zE(pC`XUJSe@5haUjml;EE#X`)JHuQCu_rFq8LJLqzub8aing~pXN<^YBCf4+S;acT zy8!M()Xp{3OH9nVX(LF1^aun#;&Nxu(ii%Vm16a4uKi z|0;8dIbWW(CwDup$6ThT$^KRD;{>30?O)}dTm#ssTqfdtwPt+b40E|q%jHx{E{COv zT&DLA=kmYpUjzRa*}rDO_s@(xM()RnJZ{2y%wy>pd)6=c+uG;Cz)wt`%+b9o}Cdzki&2T{wqx z(~v{XU(Ipy#1xswyl@_?=wIhnHGe%DzM5_F1azlFF6Uxy9{z1$XirY$auDp8%W{!R zVT(CW^b2-%W7rDf`YP7Z|Hw)KeE=wMW%;gs7 z<@)3MsQIhhlS_t;%4PD|f1OM9T{52m*8;hWLk{uXq4Rqzeww+Q*hAzpvFHDu%PpTr z=kh`L-)g@z&kW@ZTzd9uwl2AROWE$$Y(u$>+>_g?YP{}_ODnA@6h(-n#x>ecar_9vnSW8crf(rUs+#8F17iq+>_e~UsNtjZVl&B-5X$Q zn<}5oopx`)T-&_?CvFzG%+|)rD*9LVc8U4xVEBr<8JfSwBfgPF9wYbTL>@=W^7a{d zjNFeCw$~_ITON)5xO8Q!@y_O8Z{ZeQv{B9pM^KxOsHD6L@>Hg06pZAOM-inym zm?B<}=f@?WpTz$MvEQ`pyx8Ef`M7rs_f7?{o?muhY;cXb{*(241=7Uz`F%6ana6vw zY}Y@C`%rm(UXzRp+*3>juOE2+DrfD+@G|qU2fmyxW{h1 zWR_1cV#2$=_+8Q&#Wd9yoFQY%F=DzxUH^U=Q)xTr{@F8%X^Jm+n@dcitB9$WWcu!k zh-u%ERdxK_hj)#skCvy0d_m;EDL0=HQ%iOI@lH&*Zf!sJ7R{LAvCfRj)4zPd&Mq;v zuOcRoWEPGVF$ISDf*gyG`*~B5W7g~T$T{}EL-lTF?U+zo+1|+G)bYS=zF;BhHR~PQ z&3e@9!=K8&Vx)4q}- z+izZ6Wc$jk7j9q6Cdu|YO0?fnb^R+uoUHe?aQ&I^iEXPhu3dPjx}U$tqo4iJ4%kO1 zUs=xsci_8#&K{?2jcphHeNvIUcFtw+eMF@1e2$3C_f*686y0~#_e>DJ`_=VR!oEB0 z*mth;TNm~VjDgPp^&loy&i!}q4D}C=|08gJb)4{@&*M=2!(?^+-l6M@{%3BVi0iL6 zuYW_hUOU&v@1c*xit8V3AHM$0>iXvy*WY(h#P#`%jR^lUjO$No@82b_|CVm7_`$?@EWK8jRewc`PDaT=s9}81U`*z3w^dZn8Hh5c1>>jqY!p^Zl z<&%}lM+%keSZ^F#J<_y}Kn zV9!wb_%wVR1fS?9eLUic-9vxrqv{vvBXjH2{Uxpa8{p$i#7{rz8~efp_+Asf(r@}% za!G8Ee$ww{tr&a!o+F+*`NgjHN|3)7>4HB`Ox&KDs2|11ffsd$IhY-r63RgU`A|7n z@L*|Q&*a*R0y|s#m!tfTcoG&d2dpb^A+B|ZH^18`r`+RXYVSE3S8GpvOhSGU%ARH2 zTh-%Eb$U&O&w22f<(v**>HCSPSpUOk{$DUH?DH@jr_Y>QUWUJ;s4MaC`$_o2`owuB z=X|Qo(SKFXyFLtm5gY4J0m>_IptYZMjDEigf8#qPEGmNU^m}Hl`1~WD+IyCx-q3f% z=lIS!WNqntVJppd)Rk=P&x}G0Jv86TkONiTb2Q(_YQ8`5-}rtg?E6~j`>ZqY{qv7i ze}g)%>Pmgo75F{{F|3>$t}E&Out;|_}n{wF%Xi)zbIDXW;u3>3h?zu57xa(pH<1IUk7PT&Qu^-uDKT7MP)`c5&&l>W4D~{ldja-nl<&jN z3YR)7y*s zzPDA_|7?t(A^&ll^_}&G_1&pA@P7vUr{ApetnaS%2K7DE&z#rB8SCliGU@-(KBAwg zs?PuLk!Y*Fx|;8(7uhIV*7+WtrSHf`8UA;CM^5HoADq6AgP(expRSet8Q1x=aM`~o zeShl=eBU8`&(zBuzLkuI?}%Yy$FT2-s@~xEiLPPaIVVu{=26Y}Gp;uy!oDw+z87h} zS5kv(3JM z7}#cKBZjKl>=@~LPBpFGpw1`4H}>%-g7rn4#s3Ar)eqI1mDqDv^+vDrQ~#SfKPg=2 zm&mdor+F6Ow45zij1P0P-XDdOBQLHb<&Gs;`}%DRp{Qm3vTsh^Qc zj`WTFAlIt&pL;=Se$KITCSq3gp&Qr*y;GbyF8!T#Zc4Bwe4TSaN{~Ly?3d!qZ&Tqf z{dfAx18w|+;3wz0T`(W#9Jl~+1>iI1$?VfP?>*v4bmqOEeJJ`E&k4h31{egtnT|EJVU|ad!dW(CDQk#Lz?fX=auNwow*G9^XK6^ z>oR@ke1+@kS+d@!zMJLEa#!<}V^~Lsa<8?>t<1~uyCjx*;H0SMN4iCqIrnC4W&Vit zJM$AhFBpA=WsR7Zm*5W^5^KJDRh$d)47k}Y_Nj^fz)4|$tF$klU$@t+br=U4p$&bC zHuQyPLzN$iHnj3%)XNXWobIXE`hL#+Ie-2$@8dqKmng73aKD4|xSBDw@^_;=IdA?ZE`HB)%>OS@@#9$sA-_=9vj0!C zmmXi#&zJ?j*k0Jzv(9n8^9TH*f2Lpgh*9P4$mCkiyeBZfjei#WRld!JU$?5tzHz?EwMk>?TMnM(9P$nAAw5pChdR|7IKHtx=)V2_cYIr7_ic;xZI+8~ zCq58uwQ#fM8|r(uN7VNoF%2@hqI^!l7uI?D$2wnxxrnOkEECngFt<*hv8IiGHp-jx z8TKhl+=!NP)iYYTo(4L)BT{mzT^GxC2+4Ni$c-?I$$;bP1&mt(v-m>OJ#=T^MZA;G_H zOoBh}$JAi%x2eH2Ph9@Zp4j~9`0Fq^ZqXa~>^QmFqGkAe3-$CcKHH8Rvt=p%-;Mu| z;S=>dzunkzTh5wXW6>e#YCRmYXd*s4Pp-MB@!0WOmg9I&Tq_QrXHTxPsL|M4w$y>m zc-V}^`3=Y3yrn75AB^KepznasW@B&L(iQ(V8GGxNmSZPwnFzb)V{hNmYV6o8Eymul zr8TbG2IsUL(!WQ$%RN2Lzq)^q3vTlC`1scTJwCnN)1xiU*|H?|wbz!#zP5Em>}yl{ zdVa_W)Xx|L=CT6`{*6;w6s>H8=Ru9A?a#us55;@-O-FuTdA`)yGp>&BFn*lezsJ&? zbNq?eD?53mr$=qvliw|=bpNZ@_3!a=TD*TS>c;vkPmkTuvkrVRu78iu?(+0#G&XAs z_SIGe(rWl$`!e>m#$`MEQr>zf_O;d5WUPF#cFUs0X*K=L_X+))Bk&Jueb6f?)N<03HJtm*I?zAr*ir(KQAVD!Iv>BFa9NVWftnmV%P^dhQougJggD%x|TAIUmvepZS~KXVqSm z|0mXT*ryIGY3sBR_NA9$3?Ga($n_Z8-3-h*HlaNh%W?eZ`=USK^D#pHpdT%pC;HKe zGwWw81e^T;`%=}9&H~%kkIshgsvqS(NnlM|e?H=6U(gkPsJ_(c58yBN3E8LG`h*?Q zH{W#4H_j^_g>Rf!Os}8uwDgUA>EHHkXV|w|7T>r(=;qrZ>09Q**f%To1&f*>pLIt% zd#GhoL@xKfhp`cU`Os#bx=HMz^7{(4hss>CJk;1YC-(aA{^WtSe(vpY&yVxXg7()L z`>5AO?4#Z$=armKaQ-=NO?VG=lJwPc56Y1~qUX@5#1) z?$Me47XOd_wo>JrCH>|6@iq7hzgKR>8UsFZ?)U`!sh@L{)#pI^c|_aqaxv zlQVst{XhEp{Q)`tUxRvEH#Jzqe&}5ELl=mCD0#i8yDM)+IrmI;_UiO`-O0S2_Ice| zqTM_5x<>8n^SW-S&b*F$c4}TX7V+rwx;K=6m!m9|U#PFinWDa)z~?OZ#d@mGoqmL0 zw*Dv|F{=J3G_UK>&OZzOs=jD8{9-%jejNKL?#HS5i9WA;PWo1QspcE!bvKE+IqZ)5 z89%@e`W4Y1fo1b;HsVmeIeq1M?fmrD=_}!b^3Ulj;Uo9k-1?(`N#Dx*Ag{esgR^QO zuQwsDqeWh`vqfHeOvLzdef0P;_pI%Gxt@#|UxtVMJA!@s{Hs%gDI8zY+C_{n+(%R6 z%OH#|++S1U%T>~^r1Mc`${+SWs9(;yc4+;K8DK|^FJN2C48BK{*$9*w;$@j}KP;lm z;4k;e+{&z*^v%~DWB*o{Ip@J9{=gU!Z(C*G8*8FlW!ssJGJZ^yapC|`#(OVC+nFBS zb`IygV{bc;h?tzVGs&gxmUT*bZx%ACb4{hg}v>=`vxHfNV zT5#%)G%+{pF7i5T7~0OJw5Yk+)DO2i-{nWNoz-a}|D3k7E-e`2%*`U(4)?QE+o_4R z!+kE*cJicOz8WYqC^N*%G8=4`8T{oQm0OwN zzC!0dv&=uRr>}fNK9fg?e4fB(uJkRUFFaG=c@Y78aD_2xvp{Hry7$(Yup3v{IgMpp*5~7yIS-Q{y6 zv^jse^?%K<<`(u}NqbLI*#C&@H^7=ZVSuydPCplIqwWB)<}OA#bIrX1Ywn-Zg0EoB zy$);c^;~n;7!b^j9pJ3F2VmVj&{NG>b6@JI;jFm_d8+4k#hQAcr>3*!?ligjqRVis z8`jl>Jn^A5cN&g&ogBYt7_On#+?U~dd9JzBV5ipHJzz5gHeH|(t-0|%Y&YyjqDbN`Ap_irw1?!xE9ntP>ObH9W&_sdnRxmQ1oHMdW! zxz}73UUPqdHTNpH=Ke@qa|f~JJ{4Yb&o$QEb6wWlb6wWltEyOY&vjdKH^TFkYMfx~=SoiDby#!1G(hZO?jI1G`r!blU(cS8ddly>u-46eXMmjRb_wla zp3eKoK3=~$!0AVw@j5NZKG%JF0Q%L0J>0)l zit!qLnd9}J@XOY}=OaedzlX-_5lQ}8@HaGG!!PzvEF<>&Z_y{q9_FEavVY&C`Nr|O zAAI9@-Cy{|zMbQbT6_QTcYGUT_wBFtSGP#ta$eDVL;qgDaT-1jOBVh6@9@R7e@B@_ z_3x9C{IgNsq5d7^>C7ikM%-6*`gd7=w*86)(y!9xsMmP|?EQOeM}J_dXcu#oJ-+kF z`P9XJ$62^EDO7K{=y;uhSO&d%~r`E$H93qJPh8d1)}W>7}8*-L{`< z_U+tHW#4Y@r?PLaYCn~IIs10*r@nx3h5bACSk<2D-|gR@8`{6e^H-pMzXtvLC{K^4 zZ|>jYnQZ%>s;`;o-`C6jeFOUUP2v81)pWE6ZBKRXkB^{#_sBif;o<(h$;kdaxSzTi zeSEVq;XT#sCiL$ya#Cnd_5Vx%J_*k;ytT8ve@{d`ar*ZIqTZPO`$zA}c}M};0qRlC zKBIrXGP&yeNXoBeUf?YyZQs?iM`*o(%$ne>i12T z+S}*BZvH@;uwSa;z&jOqeNQWAZ+I2%MV^asYTpr0`>O9(ecHI6cT8LB{i-u1Co>6g z%y#iBHQ65+A^ggd_N5)**ACcMi@rZJFSaMvt-}63Y45{4GGd&)v#DP_m;Q{#*-35v zHRb)bwY2+fuT|H_v+-x0H85Co4%SaY2IBknf#Tjfj1?Sbhxsth4jd@Q*>ghU?5Vsr z?c;2}f#GrXkjprmI?x$s`5luQXU7`j>^agu&pj9~lwTOb(i7kp#@RZxF_ytEbDaGR zep$y^#27Wsp2S!Ne?#Le{Ngyvy>@4PcnwjD1h1%;a~5vt^la-<^JOPu}L&7U@^cb(&v|u`b5CZVLR{`?BzBnK3u{ zDyZ_ zzTGZ;D;=cy)*ACBjN?<_r!N-+#>u3B3Kb$=x_^0OSY`~d|TMhR@cXUQ#p6L*=gEosOvY!_2;?S_wfe~2>W~0 z^M_S^QJf_@gKHx67vJ+iF3}9=Xg5eoWtUr+85i-shuB46X&#$=VV@ib7~BB z${-=dc1}WmV1zg)QN{BP@^Y3qr`BNGIkoZwW5hY9%S0KJPXuS6I4Axp+d1+1fl1<= zALThY$vEd$aZb(aZ0FR>4@?#3d@aw(#JkCIri*i8vux+Y<_G4Bb3T^mlzxqPUKHoV zj1%YN#m408bs?}soU=!slXL?(Z;Ep~cd2tck>{)t=WLbdIPWn%EY4~BfX%nI`GK9{ zoLA&I<@nAfr^XN`Kdp0Z=d{ib91!QcAkXnFVSdCpt!CNIX_X&1B+hwCo|AbUI0MBw zE&aB0TIL5%igRWw4%h#;igTJTw4Ku&?WeWVejb+R6rRKUh;y0+Z09sX`w{2dDbMk& zXMV&vO^a;jG)4On=Zul(l&3L2;+zJr*v@Hy_9M=@TAow-9yo`^IrTT%&Z&>~BhI-( zo|BXaPTQfP57}iq2YtwS;J`;9M=vsr!NL9P}Y+;+$S8o&n%IhI6oHs&mM8 z4*HN0!nZE+9N(vPxNe$@{mJjK?pt+aRol=z=dA0dkBxQT)VBT^a({A`wm+GmuHT4d zEPSf{gUu)OH)DiPaq^tPg@#Xst*hQMHGP`j*1Bi<^&ZjB6td6w&1EgR<7|whpJU!|H~Vuj28%htc6EK+yOMLaoBeqhgN6O8(!QMc<*ZH@ z_gQ_I9-R6q-U)-XUgZs#hhr^zqO4v<{{D35yFA|C#rv#yua1B8o6d6w)cS>Mmzi&; zhvr1icX{um2e1G>-wuR*J8FKH2j8mtjy^@@|IOO?&MZBc*$R6L#mMJNBA+Fz zL_R0Jf_2r4>CSKZT6w18*$AqIz5Ivs-tD8tr1*zxE#f`M zEX#t~cux@S>p$j6*u#5r0*Ac*`1ttz{KwLrds=7BOAqq5e7KK4pWnUDc`iN3@8b&= zrw5OEaBm&%!Q%bN`S`6l>cO7;XAs*^-X~vY&zuG6_{9D4SHvPmwfC$T6pP;p)XC?) z%tdLj!8)pbY(frHd?@=8t{YiD2G+~SMSNUq50W`xUHKZZj7Ds%uiUp*aj~oz6ThS2 z8a!~)>n}hY%lpR$^HC-><7?&@B8J(BiTC%0*uSP5ccS)eWC7a}g+2h3+nsJP#MTl6iZFKaQP zo)ugr>RFwC)XT_0jAP-q^Sc+cN#^Y<#Hj8i=Wo?ij5B16@eg|z6(KJ2<{-u*_+5Y) zzd`P1AjW*exDqkWMvTe$4F+@g7-H;>c-8&qN8)OVoX6oe@yr+E?1D1jeFL))=WN_l zSByA$Y$f8HgE(=oUH&qeKmKl+xm_e8TKvCZ-VD{FY^TXobE!rSMMVBcX+2>A>OH1ho z?REV%)Zq{B_Tszb;!&phv#VP`=CiA-<1_UX-yhffc-b#?Gg42B|GWQMH^X-%JvjJK zI_~4~GAO9C{L6U+WpE7dayg3gasLJRxkE2;n0lQF@pEGR zgH;{V_yymD`N#2pm3%z!Hfw`t?HuHw5INX}vQOmsA^!PR{z~M*DTDGje;4V)O5~vQ zop26H4u}01`o>@QfoHW=yy{uIxq3Jc*{|z<^sxHj_~5JVuPJ@-XyuT;Gt6Is|Enwq zJYO_rZDbzGcIf;n@=#dAe`L2@1L*N@5A$o|T2=D#T+F~~)I&a7UDm^7p8pqlaN_sG z`*%scPva++hWQilf0cYZ%hCIaXYB;k!%WnJDX0ep+jPD?{uQboWY+S(D1BIgdQiAG zTo01BhW*IL|5f^d=Mbj6j69$ogxbSvx*y%$>p^LP|552fxyCQp66PPr|BCNHdyK(* zIAitph<9;j#fm)KEc1}a^F1Ef9_{Tx^aqLlTNM8ZPp_ZiT6OcFJn=qHzwtSC5PaM7trLyG=*=+dHZ z`wyLXI9eUx;TK-tbhoFBJy3MsyFehwOyzY{eAfI)55bvR+9*iF* zdNB4tw+%9F_>PI``2W@;f?KgWn)?ur>)fu8P3|Mm*|^l}+yG>9$Klg=NH7By=1n-R zGZP`3%q-}($XGW!v9?C6t%|9i5~pHqT|5mknd$g!E}2;tW(tn$%v+?=;K@q3d!t99SI&;5;*%>xACiOaV2xKxF;&ZoTro0`U&zd-{GhekZ6JTS@ zC-r(hdq5`hKe$GJS++42<}n=CnNM4oC!n*%NxdFteaZY7`eu^3{jKOY_u{zDd90nO+O? zIvm%TH6feK8=$i>sn?lPAd@)=pC@G5R#@t79~{@2$KH%)_J@s)NxjY-4Vlbt_z(L0SKzqLybiL-d?`AK9EhOA39r{ z)a!Asg-qsTd^VKK3QIok!f~D14zkI-2Ra**dY$$YjRjvw>u$SeSo+p)*%lm>w4<^*XbIWFE&gj;cPv!YntKk6D<9 zptHqEz0Ry5neRZqT{6AzMdx!Tj_YyW1=*}aZ$f9wC-r(hk3weIzJkvSRa@B?&3qBZ zb!G-+lUW3vEl%q7ILjcD`2;@eNoK&poQ2~$^Fqibvj939lX{)`GGsFUh0i0hY_lxP zY#i5_Eg_rCJD{^Msn?nFAd`7LKDVhlv_HCRufTDg`N!+g%;B)HF{#&?_d+JKFFuoG z*>1Pgp>uIuXO>%-yNM@FW8NhL!c?D#X`2ut{CiOaV z7i2OY$LH6wY`qrdG#uBN=R!7_GoZ6Esn?mskjcCopRY+~jAb9=HXPTPO(2`h@zB|r z)a%SSkjeZfKD(;+`F?aA8iM0G^Vglx%we#xF{#&?cS0ufB7DY3X0Cp zsb7qDh>pTN0%DJ-aq$Jvk@+XC)9=*jW~1@0!&7mMyT#&ux6mGEoae3+ed=aZLf`(k z)6GuBC3bV$BhSTop*?c!ca;r1ozWh9VB2eY_IdH%k@DL3En7{`Tu*6B|9UWa9qzwn znfvY7@2>E8)=tE}oU`AJ?;K9FshdID6!^gN=x5Y<*q@Fue6NG^PQdn`j_-BszGGk6 z^gVf)i|@X6{+U(z&OKuI@DTTCxi^XOE4$p~TBS+;dvPts!kCWRV#1y;uZN9IvFD4j zNWaqMdcOAlEL`t6%E_7|?Au1gIo#!1r5*g2<67K*{VA??H`^X;%GIaWK7>7BXAc%} z?rq8()$aBz$~sqmZ&flPW}{w*GjUD54%dZj*5NVGslHy+;Z{x^rk-`UWJJnF*5j3O zuan<5O~o;Ozr^}Xd9ajk38F1^jc!Z*cr9(OwQ@(aA1Sc0wI%A!wnX2^?vBsfz}#+O zdU>A4eAmM42pe1M)JHN~6%T}tOqStzFtfUeIQhMgUgmK;SL427;nskSidF2jHg@(} zsb@dM?~O!xH!kM&J3~($`IJxKnw05BO!w&WK8WMG4|6R(d<~uQLGQb$kBq%>aZT{a zW*JTdGhku9!Sl4ZCqXvr+HUA<d2>j zkCf?0Zjb2L$Kkl{Lo>*x582S!%A5Mg*jp7p1|8Wf!~4MG_a=d_qR0NBJXebyH?c*{ zH!g>b;;s*UZ_=!o`qSF?CU-$5lkWmz8UFdT;HG>W&Fz8XI`=aR_Z-;RxYX<15s=Ak zh0hNw1T)6MtdHY5bE}2f2sXAk2le`#;{wQJ{)ub6B$?as&TQ&fw|K7szn40R<2o~7 zVg3xAjY+-EY$2Hy&`+1lTnqC<9M_rCAnWrS)~ipTvoWdHnZHA3Ot0hfCdmwZ5*_D8 z9M_q*K{lCNptI$ZdOe?CLMC$=K0lDmEDQ5l9M_pcAe+qRp|izFy&mTd$YjpO=Ss=+ zT9{LCTxa%xY%=qpvoWdHnM)y)IT4?aN@j(n-j2p`omn5U$-D(R8UCyg z$^0Dpk&>D9d34#nhvPbP3S_emy$_u&pVaI5`~@=O+=kEnlIgWD*W$R&91YoIu7}PR zC-r)qpF$>cF+PhWv%*qupTcpSc`0O*`3!V6CiOb=HOOQ>iqAaB3|N>C;<(Q20@-9f z44sWhz0NFzOy*d8UN4#3|1Ub9H{!U?tPR;@W)-b#AlIYrdXIAa9n4;XJMWN8yk~)ojDjXnGNunE15ACW(^$I znQJY~TClM(sn?mwkjeZB*SJnHy^C*t%%%?2OO6Y9)q+ZWwJ<0qC`gbL>;)`fz z8IJ4B2O*nv=w0Y+aZ<0x`6Fb;xe1@kBr{-PzKr8K^G3)fb2W4}CiOb=1IT3ln|jI2 zvM}f2xX$!JHknUCXJb;YGdDmcGY6m7NM>$%blKjE<2thgWRrP6bhdm_ujg|SWHQI# z^Bu`du`sX2ah+KMvdJ6?oh?r4^*A4aOy)p*z9^Y77Um^5t}~Brjb`?Pjg3jY&dh>L zW>&!9>(+e9LlX{&w05X}0_`F&&D=MP%8H3|G^JNRO8f(JZK*_hPp z%oC6q=d1X9STem9W-*TI%xfW=%$3mDnAGdceUQm~8lV4^%#=gX`J98}I`b09CUY)y zwtP~r=W`8YG9SX{9?6WcFz>{1o!J($$(#h8El%q7I2S-B^Co;Qk<9G}qvITb<2o}2 zvdO#}IvbOEo%sM{GE?yRkYwgsm>1x<&iv}NXy(PRu`#LFnKwWtvm-u7NM@F0AEO11 z>&#siW^35knAGdc{*cM6iO+44>9sI_2SaBTTbQSzvoWdHne8R>81zp`W`(5=eTm~b za}H!Pp9i6{F{#&?)g^N;^ml;i`RS1ZwV?YM_uOvdJ-4g=lTor;_u$?NIe`0b3wPFb?!jFG z{buNR?=8<+^APXBZHm28+&c*U6znCX-&`xB5Uk~pZ+R)29dKbUguTul1leRi3!RNk zJ=tZW1bY_bJ{ESC3;RLX>+CL&P4>gk+1S)OagP-2@sJx?*fB2bk+9d?I$OS}cj6u(*zZCfWMKyq?d($6>v7)>*{o|jp|i26cjER5_A1D;EoGh+#TI2A zfW6MX0J*9h&O|#5J++$#`vl~D**|$Pxi<^2U?sElu1mt^4M4!4*tLM2<>=sTv9{_uu{p03n z_Mi~EMMOQP-if=XV4n{;U9vZ6?CmwoxLZ2xP6qn`*oFL^o;H?rAsb^zd0fllHS5D; z3H46gT?M-dXUjMBPTWa?{SoAWGH#un>%!g*d!2nBWRtxIIvbmMC+^mQy#aC?$=2r%DN$_E z#)@FCv#)_{vP+<|wK3|QxSI*~LdZYKGS}HLF6`N`*Vz|AHraEav$3gn;%+3^4?^B! z%Xhpz-xFZ3vs*wm*|$SyD|70dxa$h`NXSbp>|7UiI_!1!Z=0goSGcgLcj8VE>^_hm zw3K;D6kFuGhr#~L!agU&j+`q}@5EhQu-ibs%EFFuVb?X-TP*AbE^O+ZxMKwSPn_FD zvP1LZx+2$HL#X?Yw&6R$?_taGR=-huj$Gq6YA2!F5b+ze=9nKhEvEiU%u!3a)XLy> z%OT$;+n3@7T)6vTt8;T8o7@kevvH{>H@&0a?tt9i;Knq!$GaA`I(IZ=le-=|QMVfv z2M{-74d9+D>dCEaC%7*_K1a@rRlM7q*|`f~t8)iHHn|I-v&Bn2xdp8RcRJ*n1~G_{v=AK2>LV;iHn{av`!lbemci}5Bye!$=cT)1rwZkdJab>UJ^ zZX)_Ea_d6A(%`1Ja6Jb1B?~tWHn#dqJ-H?5v&j7(=Qc37F)rMLu+__Xu7&$Gbhdg$ zJ-O-VugKjG`5V!G_n}_R<$8WQo}<9^Jdf-B)$6d;xpzZ0>(wskY+UNet^7US;jV?e z&EV#`a9@P2&dq>qa*Lp|aj7S_;8($20C|DI^}29p!dB;A0NLc`LucbsPj2#0f_p#Y zYYlEiV|zJ|hpofDH~BrmoeBAHv9oRq)vJID_d(d|+%Aw!?!(a8xYUzdRwlUPA-`sDvs}10z*grb zKsLFfptEtQCpUYy;HE=AJp!FAUh2uMTqn5iL;j>FvOdSSaNmTj&byl+=A7DyAJXygPU95 zp5NuL)wx$gHn}UHvvH{>H~A&OeH!v4gPY>Qoef)^dl6)lI|n*jJEET4vLeBK5b{ui z8{@*whON$R3EAY{0iBIYJ-OLS1@{KX?G5hsdiHX@9JV_5_jS?St6aF$lbaY2+(wXFMXghoc!JcE zTkyExz6tp)qra+XVUKqMY<2FfkWKDp=xki-$xY4|+~tr94Q{}N`wVP#?q!fo?!Te4 zaj7S_Y`WmihWsys>viEyhON%+2HE6JfzDR1s3$i&PjIs#Uu4xvTSK;C6=D_r6&fUVB$4cX*A4xNolJ-OMV1a~sz zW8mftPYEWq`}x&}UUA06Q0ysv>~(Ac&eMHp0onB7cIa$vnR@zAa=-9lB;@J_H^zlK z47NJ=)Y@q7l`dTB$*q)qNMFdGuQKB8YmfJAgZqCL?zynp6fuWy>CEA&C%5215pO%l ziDtYm+y(}Bn}yrhg-boT$@d9v4CF&byxU#M`6M`cIR`A2TVkD;^GE9%M3o+!9)Kz`8R25z+HcRg%%?k$i_?k4DL`K6xR#BqYV z4D$KwBkNU`3wI%Gb?zX@CihwBY~@Tnxg|FX?kvbZt&8M(UAPayR_AtwY;qrg&Q{LU zlbfC?xDz1nF}M{s*vt7w*y`NckWFqTbT%&a^^Lln z>%#RI+?OoeIM~?gHudCYUoN=cvdtJEOVXJfRfNa*c*P*k;PCdElmkRDHkTVQ!g-iQd0$ZJX z6=ak9B6Kz`_2gFi1b05f9!fP40N;Z1GZ0ZlcWZHINq?+<*&rFl=@1FRP=u=`LLA$t@Wm;=LI1 zod!3{h1=cWeq!PFbm3A@Zo15GE69TkuGfWI$KYcpX z+4K7yZ1r;fw}ty7bhdt*dU6Xc6x=T%e_@P|0T=Fju+_O!Ae;5-edugl>d8$$PjI(G ze%0V+xp3FOR_A6xHo5DdvvH{>x2&h&E`eNNa4T-Nm-Cab)wyYqP43gs*|^k`o83)t zABFs+k>7v|_g}Epxt$=J+y|kvaj7Ra@hri;4RW@@&2r&h2V0$66SB#@0XiF(dU8v= zf;$*;8n}EPZc?>hUd=Lm@ZMoB^NVnv?!)0%qJ6joHnuiJJ$Nz(aO! zOM|=H!foTirQRuX*>@#C_HB;rtFv6Vzk{R4TWsN;hR#;z)RSA5BI2!t+|1y5UASMs zR_7K#HgjD8osCPqlk2{M`wrx9H#zan#s0uP-Vfk?z+TR!u+_P@LpHfPp|jLn`|aGtu+_O&LN>Wep|g#N)RUXtOK|5wZe?%-F5GFb)w$qeuD`)DRa!wW8t0BK?aJ??v%V4W>e_j>M z9SR#;ywp48+)r>Xf?Qy5EBAeNFCFC&%H{ileG`O2A+yl+{zw;TMGGogIjT*J-@4At8+6Uo7`8Svz0UT2#k z;KF?ZwmLTzvdMi4I$ONdlUsuOxXGOc`F4Yw<-)xWwmP>XWRv>(GRW};x8h!VetW}K=YI2YG`BBoZ1GZ0Zh8yB z?M7M5@j~@E;KFTfaNo9Y+qrP5CpWo?;3h&|XK=GzxPOA9$6I3I#^8Fka;Bc##0G-< zEzW(w;CfxSVRx1_1yJ^}fdSo??SRhA2PI&5|B`H)TSEa+_U zQcrGyyr1?y$lDFB*M&P4wmP>dWRp7qIvbaIa@GB`*Ft{U;8sks=XVHfb?&b(MRSM2 z##YYMlbbH@r|k`Sq`?iiaFY%0rxxznu(8EUJ-Nv>M1EUCKG)!8xp3ffmcjKtXfNmQVXK$(a~AGN=xpdCGAL(F5#A@4TYQH9IAeLrkI$OP>p4{}Kf;)tE1~=fs?E_n#du(Mix4#RQdUBJ$7TjdWj~m=97j9dF zTV~;UUAWYfn^+;Zbs^tsa4YV%m$S#dCGATyVd~xu2|!Tz3atxCddY zm-Ac;_iN~E`K6xRvX2FKKjc;57UDPkSnoT(=g)HCz7AWRdpBgWUhRU;#-*OzlJ^C7 zE#w&n*XzQ45w@~On7w&l2>fGj#P3}bKZ2cAWl!1!F5Gn3>fGN-qPbVNaH%IZ zS>DIn2lBfH*XzRVX>dQcaR1@LrJmfxQjy=bkY6;oS&!KBTi@VrwQw83#+F~|$*q+4 z@p>R{!MLxtBd-hhM{x9VF0^p}1D<Q%`Q$dJ*qI$ny9qbT%&aU+hy)N7vV5@TzAe-D# z(Al`ulbgImaML08GPo5k^|>Exb#CQ~Xl{xNmwIv&pBLPokP}UAjy=Cg2KOBcw*zc! z`K6xR%4Y<(KIGvBH{imJHMpxR-0HBgl{59^mMsw6A8~G1gPY~T{R*~vInT3jk3eVR zQcrHlJA(T@WRJo1x^UlwtI`wd7{akX3y^i*y`L{ zA)DOI(An}!J-O=lEXyIUHMm(W+-G2`b1#Eza{mpTEne!$O_#rCnGHGL;CfxSlVPiK zyFoU&Q=qePsV6u2-=dteA&)k=6)yGpCfMrSM93yL3pyK@dU6vN3hw2QFE+W4+Vks! ztGMaN8T)eHLyf*x2Hwp4_szg4+=CH3m1!gODf5N#v4X)RPdlpFZJXW%oN-YAy*gNeOT{1zxVgf zu;+I-Y<2E^kj;9v2Rd7RsV6skn&57Le5Jvym~Q75!&c{B3)$qZgw7T(_2j1K2<|hG zI~&}93%3BaI=44ullwSyHZJw#CQlaJ$&mjP>-|tUXSr~1hpopUb1UBVc38FZJYBP7?9@ASW5+oaMqj*Wi|0xV>OwiGLT8JYdU6YH z6Wqg)mzvyJ_WXVfTb(-{vRSV_gU*&;>dDQPzoXd=`Ix~CxNtYYR_Bg|Y;s?N&K58A z!v5B%+r?=-pj_WWkTR_E4*Y;wmyXUi}3viFlz*gs85833t44sWjJ-Nxf1@~FVJq>P!OFMcDwmP>DWRvTM z&c>yl+{6n6_Yug|P3|0fe(!{>&TR|X^y5 zpU~OjrJmff9)g<+xxK;7a^ap2Tb+CG#c1w@E?nx#E$J$_9U%wBK7VL_<#pjUHMp-^ zxGh|`)RSA#NpNdG-e+%tuk zTb)}UvdO&#I$ONdlUtT3xWj2@a4THu^8ncD+#i=la|gL_sVBE2UU1Kc{J6mlxNy%h zxbIuIU0t};lUqnz;bu(9QrdUCTpg8M7ZEit%RF5F|V)yw&5 z3-<(cw)|30Zu;*vo%>Wjg*;VoSKT6i@9%Ztmcdr%J_y;YSMNe+<5Ev<@~?us1@iR< zx5A}9zXV&Idjn*X`wDb6F7@Ol{v^21LH>uyooCPQT-fT|evnP>eCTZXrJmf%?*umo z^1lpjz=eA^Y;|rDWRrU@bhdb@C%5dl;EslTxxvkH;by>A=f*-dxz|8v<5Ev<$q~UF z0J)RF^}28`fUVB`>V;_T#V%ax$t^e}xMxBBeYNxbQMf)oVb5=KgZrk1+X^{F{w_?7X`x`iVyvr@zKcKUfGxg-Aeyl+{6Qd`x4|`Cih8uITylK=Uxuk}|ol8}e61ycI6>`DWPa+=h@% z?rqT7xYUzd@}}TsK;CR{11{Wwu+_OgEs5q1cHvS_Zov-0y#Vq&le@s4-!2CCLkqV% zY;5_Zp4{xMg4-PO#|Agcg_~e-H(0oJU}Gz1>d8&tB)Grf+?Nfm*M(aNTfLm0v2eeG z&c>yl+~jqF`#I$42DiecKEDH7ojVz_S+CxM&c>yl+{D#_yA|?{Cif|OepkU(=iUU_ zyl+>)h&do$##46fIOdo^rzZZ*gz_d4ioTWep|izHJ-KBw1$Q3g z`Ubbcr9MxCtR#-*Ozf*irU z8uC_?yU3p3%V4W>e-1=*hr-5|U+T%to-DW*L5?%ZIm?CH&ES4);r4)yEne!$O}}4o zTSETSh}Y}FO*FWhEZll7T$GNKwZiP#I{uZ`+IX`RR{s5gVUh2tByi;($ zfIQ3OK5NhKKG^EqMHu`M{8CSDun+n%zScwmP>XWRv>< zbT%&afCP% zqq%)yV~dx1a?`I7+-{KXFt`C1Zfk@4wuRfyg-boT$s+_e5%NHTo8`j&6C6F>5(_uR zg-boTiB|~jw>Yw-?6aOxlJLP+zHUx@=HCr*}Vn#TF5<(c(Yu% zLtv|Oe|_9) zcixYy-iOu9c^?+_r@^i4D!Ap4=RXyWm)tBD?ta+n+#JY<;#w5zb?XD@`2H>D85`gS z@GS7fcz!bVi(mEyM|seeItli6=*AmtuM2w(&)1$8nFZNouY=CUre3kLy@I_Mx)g(5 z(bZnwPw;$=oeJ4xKLwqQO}%0#w-M~A&^0sI0T=eYJYQpXAjf#u+x^hla!oyRo!CNf zZ-M;j0wdQh+-qQ~bE`u(W4<0bTg=p}n9CXq_CV-fG1y)g_C-8ji}~<#(dlOxkmxbNhg-yL;rzZ+_Jaji1?0^gVH?Z`$mqRvl{RedF_nXXl z1>RYD5bwaIp1Dqr7u;izlMHT_3-@!_>fG6oP41V_{Xf3W1kTFw{r@wiBqQ0HQK?Rw zFcKmXW>SPfl6`AZghBQ_GfBdHGsnKyWXmxa`xcrk-!PKC)@)7WM+V7O+5YeAx$l{| z=Q`K@_j-9fpU>yMp6C7C%X6M{PIJzAq1EF_*W~d;@)O&##@2J(di#xpia~S90Mt{@XtJ_sU1{ixszFYkQ7oQyX#*#%u1qWENL);nx4@xK;QE6}LLV zol0%U9fa51tH`WtS#p`*nm-)(9Qd`pf==gir3fjDP-2QEP2zKF8jr?4{Nt3QuYt7aXO&EnMQbrT8U^n;YRCMs3K=#cS>nWENL);pQ!J+r6ZaBJ!u_d9%d#m$XyKczP0UW3>3`vsZBm0Y-$2f60}Z{vTx zq4j#M>toOFOVozk)A5=+pUmP)F5I&H9rqFZ+lpHe;m)Eqjyh- zKEC7Z*6X<6q+=huZH%)EG-5amDH<4NWm0Y-my&Sg!|Cr)dN4V!w8*)>4&Aouk z;z};uyzY*B5`MbkmPWXTQyX&I;x+duGK(v@a2xX-cO?FJ#cepl9_Jy{hTIi*WOIj7 zW6iJR!mZ!Taks|*tFGVb2zN`x{jb68PL0)H$%R|9vEy!l|4?yDBiujXg#CTU;Qm8q zaU~aS<%W*?J^m5JO+~n$QyX%x!|VB7MrLs(7jD`5j{6RNn&MVZw&(X1YD4ZBc+Fiv zX3ekU!Yyg*xR2pGSGRtgERArhsSUY@;5GL?GONFm3%Ag}=a9z#pXzTa!o8B(kh>#Z zbElJ8T*-x-=ihTU7yq*2HblNlexUr-~Ff! zxxd|>%{_n`YknmcZvAS<9fGgBt@Zpi>~C|oQQVIVZXq>Re+AnD{g6o`vbM%INxb-SCLs<$%R|y-)Hz7 zzn|h(m)Ya|F0~=|a=czwOUSJGm0Y+b{(Xj5@Q1ql!eZWMNWNR3G{SwH+K_u9UUQ!! zv*uTF;THP$8LIIE6gL&&-bii8Eyio^Eo2r~a^dFr_ZhCl|9eleo}2sI5c&O}^QjHF zeejxl5t+r6T)2%Nxb-{{|DobmoMO-Kk<^CVc6iM_hRm8@$%R}0p5yL^UwC)x{uW2L zyHgu-|L?YJ?l5Ys{z@*~ns*#`8~iNA&5dxoDejvFw?~94xo|7}`wSc6FHqdN$n)60 z;e`Et*x=?wxRMLE%)ig@1N$DNxs&Yq{ZeuNV{n&~S@SEoa7+CA4DaG^QQV3Mw~pGd zzh~j~x_XVwnqSFa{bD` z5myA<@ZYBQr#9sNacefWgqo)N(R0oB!GetBJ^8nlni|L59lx}yHMcmz-A-{oF}MQ* z?!0Dh_l)GT;8xCc+-~?M6gM}*-AHj?G`O83T*-x7cAw+^&A!(tZr%1R^Ba!yPt=Cv ze7C_}P1f{2lKZ#9?#aIuO8zhNTQb{mzr>d)ZbgLq9EBfH z?sDw;WPKF7IKqBH_7DCoX&hd&pC+@|k~gvIZ*}ZyvUS(DUSGKp_KmWCz%IsX_AO)< zTk_Hz~8926%p$R}Lem{uUbNv^YHP@2MTvtwU-0$#9XSQD76%p>I z)P~$^@OrMlAhYIL@}@qQT;kYokv*>1#S!*A**}=;)9{-83Yo>0yosH6fnz^RHbb#< zBka3n|A2iUUbAPDS!~Ih*!5>Sb|u*f0bBm9w)CWyxeovBa*FI9unUEwuImai>mDt+ z+@ovGaNINT-R@|a>*V*>BHVG*hTKkg%{__CdQKv_a4S!B+|l^ex3}gtjJNwcoZ67P z>gH_jNNSp%8-%ZsB^PelM919;|CZubN4R|zcZtE>I>MD)xFw~IyE(pEaf>6|_KN$I z!QFrwYknmcZsGBc`#bwiP~6-I_giYialXaieoxl)+`x^qJU8f)kzBZWM?3Dv_&prA zcBKCvfVxt9e&3=t*^gciz~Ts8^=2C3;4|xw<5x=p*G|mgV)^0$Skhp!mS_e zxOd@Ky7xeu`ZL`M{USG4X?Sc zkXc;Gg~X$_+K^j<*W79{YknmcZq0U%I}?8wf0q`{Z)t>EPHo5? zh}YaJ$*lfLF5Jqk9d|PRT*XaAxZ|k}xt;NvJCV$~|4J_0vObPG27jR9HXLq`^9X7~ z?&=$}x%)-9k_)$_r{fOB_g37B2)DoDzHe~1p~jkD$%R|k&2hWnSGd0oYrcMqBis&( z`;5WekQ(dym0Y-a`Hs7Wedj4|ZiKs%+Hjn2Gq^v<@ml>`yu0s9F5JdV9d{}ICdI8A zYtL^zwITNsyk1xDl385IgeruTO8r;N^Qvf`i5-o?$lWGE4gqB z*Ew!~{Dq2}8{rlx?i&WT8#PvcB^Peq?~dC6f3V`#jj`u<9h|Vga}Dm_WY&E_a^W`q z?6@oO{S>z%!u^cekb5m&&+nIH7FTlN*8kwR_4vQs-)J?jtK6gP{=Q6Y$SuQbZXKC5 zzmf~L<~zrI6yHW&M|DTq+}YHI+=KC&doP*QU&)1Axx#U)@So^$j&P?^8*&HXHTNnq ziz~Ts%NiW_9DJ?f7Du=fs13QB;x+daGK(v@a7#XS+_Ctp6}R+gdz|;BHst=A&gSk< zjWxfL3%BqS$K4gbSaDMk?f}L8(BN)Ijn!Ytg`4+*;}+l_RNRKhdhV#W&l%i}B3#LZ z+ql?q*Rk&u#jTET8>tP)`3{5o6PeXt$%R{A@3^1g4{zZnpU1B|#-86r)P~&4@OoXn zM`q2hRZOAS^bq}tvlA{?nZ6M{iZ6Ly9YH^e_^DDVc>5{bbfSOD^29S&n-HeoMtI-pcOp zG-^ZcPI%3|n#}6281;k_)%+R>wU8 z|If76+`8^|e@9Upa(}-*n|ok{E4gs*E;TB?7N@)_oL?PsBV-!&OcHcj`Ljx_h&Neb&BM| zt(oq)U*LNvZbgKbUdqzyGK8x+;!vpP)A6j>Bv2(_|J` za^aRuaojohcNDi_KYN^SqBi6X$7}AbWY+vjF5Hq!9CsSNN^z?r+zY4;xqb1Pdoh{S zU&)1Ac!A@dj6X$jOC#K)s13R8@tS)qne{j+xp4E&aokb(y%aYU;SQxX$xZXW)FO0}LN+<)MN{jD*$xg5_L zXUTWZxRa&5dxEDeg>z`xTk>KCtA%tt@ri#rSE8TQ|}k=LOV;{hf^0>*{qf ziz~Ts%Z_*4C-BEAZfS&jAGINO3|?~|B(vsMa^aR7?YKALw^H0xggc$ukUJQ!xz~_c z{gqs}g@-%t1^8dDYrU=-M%d##iQ16c1+TfMlUZEJg`0P%;~s^tSKR6d_W)``?wbE( za}SDeB^PdEiQ^8%->bOA5pJR4E;YD2P-D%neF z!aauCklO*TxyO@PT*-yoxSiu3fZs`RD|*=DJdE0qyRtHyyEiq~{7Np|`mG(e5Z`xd z>vdHe;r3A6dV`yy#_F%+!ma7!xSjBSR4Tf8{tYW+{&JgyNZ36C~jTk z_26=9!*Q-MxGTu4{z@*~vTlyM1pkoYRu|jz`x><&_Z+-lSN|om=2vpzmgGC`Q}_$7 zX+6%R5$*%jhTO4u&3%Z>>aXO&E!@m;Z^0j|xTy$t2DKq~SG?w4M`m#)7jE9hj(ZWl zzv4C&+2ec~wIR0vueoQCSzO75+t|@@kHP;vqxCpfm)P7AYD4b2>$16rP-D%n%j(e@AgEBHZ_>4Y^bCdR=`)X3ekU z!Y%pTabLq%DQpC_~Kzmf~LaJAz;fImfXb0gf_s13RM;x+e9GK(v@ zaPxk2+!^@26}K+(nb}LI4Y>pGntM5!#g$yRjo&%$Y4|RRn|rXmu8yNNkhKHdr=#58?Vjg7E@!bXUTJG8zcT>fkZ*aGWa3vRR*>jHD2LHI?mPWY0!U@NDj=}wd%$i@xg}lPjOQb?uXQd+-Z2du0A2N=2vpz7S=lM8~6hqcQLQ`lh61!MD9n=Q5$kk#%u12 zWENL);pWvi?p%By#jTET@1Qp1j>2p1-DDP5a^W^U=(yM7*SY7<&Hc^Y*rWY+vjF5LQi9k&dhe`WIgxtUwHlg&MW+K`)v*W6Mv>+wo*;nvJ@+=KByx!2vz z+=>Xdh}w|*nbO4#jKk^<>ukN-pzTKh<$B!#}LJ zb%X5rJ(Jpy+a0gDXOmg|m0bE;GsSUFz+b7j6%p=eYD4ZnS7&n%i*O|uZsjG8TZBJW zaf>6|ofLPO!QCaom0Y-G7dUQj{LYG-8{uxQxC;z!zHp7}SMucgJ;!m^!~a&^^7t(4 zs%{5+et(A(j`Mv6cP&{HH~dZm$!F2u!ZRKB8+^UuRz$cTQyX%plk^=C}*-_XgbLyNd&E_<7hDs13Q3@S6J)nRP#sT8Of9Dx72Yf@f%#O=C_y4okDHMEyU~39#@dH`t0#_n>{pD_Pf{r zmcsFldnQ@KWv#gt5$-tIKlt2nC%opKM5ehDWIxZXJlb(blRdAv#S!js*+1Z}nx4%a zX>j)qxMhbs?oMQB#ck+mk8@weT>@9n@7B~<^DB9B{T}MLo8u2v-0BFoz2ZJ)^mhYl zn*M%cPV${3-7|AoSCTi4b>2aa{Tuslt=Odz_Ww~Ej`ht(pI4GKvE4N+p9Lz&NG{iK z<0!}d2>;KeEo&?JY%L+)01%{_-K>u>w`o_EQGTeh3yo`~-daOJVGG~kBMDG#MK(69JriH0xD^rZIBG*~C%opKL}qa%7jEHZjyoEEisGgs+~L%Q+*Q-Exg)8u=2vpz z=56e_JK?ug+=kukaqg?QOAPMT)L4&|k_)%7qvLLlZ=<-?5pH|Meahf&5aCKL-1_#8 z`#bwCRo78zg!?VE;W*!7aK9(B`YX9`YuY&O$N0w;H#fq4i`tNT5nivWcgU>ym0Y-$ z|Flj1UGxR~d5T*%#Gc<8YD4ZZc+Gu`%<8Y?!Yy0pxOd@86t^P6ok?xT9fsH3G?~Sf zT(~8_JMI*GU&Sqsa3@n6a(m!4_gpfIE4gqBS3B-F{GU^j`%&}bWW%oZIFF$=iz zE~Pf)&cN&W{hZ92U&)1A`MKl1g>S34#S!j2YD4a6c+Gu<%<8Y?!Y%v6acl5P-Rtk> z^_&~w-a~E3Ex~JUHJQbgT(~74IPOgR$C*x-* zZp9w<{EnwK69*1zVsUGSGHZe8U0WCz84#^7!k;Yu#tn)!~qhJD8>Zbjtp zzgAKkj`M8>_Xjd-ekB)f4Y_;aHTOm`iz~Ts3u_&>9RIbN z-_i*89BM;uFTCcSPiD=pUF0VUEq6KyAp~6tB6b zkXikeT)2(X9d|7LF~zNpaQCG)NNQ=2vpzR$k(`>)3aV`@5Bv>nOr)q&6JqI}Gkm zWY+vjF5I#U9QQN)yNa87!0zuNYD4a2c)hOPBeVJ|xo}I)aom^jU#M|zxZmd1QX6tl zz-#W4WLAGA7jEI1jyoIwwBlArxHnK6a*Obqdo!8Em0Y-ar#bFae5K-+M!4ru8*+Q& zHTOa?Yn&w)ZsSD9oq#_?aZ?fQ5!8m<_3)Z|G@122q2$7?FLm5~@%XlUmQI2zMH_ zA$KRd=3Y%^tt-ie+c?5;&%?i``r8nBd_I}lkh?ivb5A9+u3yQ8TVLe3N8slwZgqq^ zirSF-`;=_%ff26c!mSzRxVz!6P~6go?D^eRaX&V=+f!qWv*g09+|6;j;#VtfD#FcE z+!qY)#?)BrN^;?r4R+kW*!NAvZJ2BK_eW~OalXso{!C_ZB^PeVAjkazKU;CDBizN* zhTJK5y{`U8W^pAKZef=;$@9AT_zN{RWB2z7YD4ZgyyiYlX3ekU!p+;%ap&M)QryxA z_ah+K}59ueleKSzO75Tfc$ho{T?TaT_A* z`6y~bZhO4u9!q9%B^Pc@JI5V`AFjC%+w(h=+K~J0<=Nalsj=o)a^Y6yI_|dk8H!sS z;dWQtw+wDiYOMZBF5I%ebCdO)hd)tqOC#KW;Dr6HF}S%AuH?ckS?jnzvhS{nn~HFk zDeg>z`xTkhU&)1A_?zP{#%~0-h|lr!df$DH{}FqB7f>7acQRhDtJle_`ITI_c|SYu z6Zpdvx1q-7-bZc79fQ~02g$7dN-o^SM#sGgzpdg{N4V3e4Y`ByntKhI#g$yR_1`+~ z1^8UWEsby|Q5$l*;5GMjGK(v@aBIGH+@tUx^ZQKU{8l_>kMjZ4hTJumWpfXr#+qNr zgj@Rqz12SuVB^Peq zV#i&8e?W1IBiyH`4Y}j-n)@u7)nCbl+xWKQ-iNLrv5H$4d7Qk6+K}5Hueq0!SzO75Tl1>pPQq`exVcZ;>*^S4Lv9DW<{nRG&9CIb zt$f9C55UjU>-j00JB-?pyYkX(?%vc`k5`flx9mm7EyUlbxD^p@55=uFxTy$Na^aRd z>$siprzvi6gqx$dj~d*z5w7IIEqu~(SFvxg;x;^KkMnYB!*Q-MxGTu4`ITI_d5<~n z68w6KTOHxPMs3JF2d~%Ff61)%EV*zSGmiTd{!_J{OC#I|s13Pe@tXS(nZ=b{xb+V> z?k#xvO~~**n2K;`P#bc0#cS?$WENL);nvJ?+>7w?n~)*5;R$ttH&5NymccNSJdsC7Nx9kqb9ft3vxTO*9K*jyc z;O-dVN-o@zTO79s{ttemFC6DogxgthUpBa#MYxg+x9|qX&A~5H+=j>P`CSbs9Ou~v z_ctG&A$I~^ zbDt-(xRMLE{wl|P06$D|QxWcM)P~%B@tS)lnZ=b{xHT1yI|IL&;#Sn!^Lq)kA$I^? zb1x^e=2vpzR$lJ7r{NdzeXikpE{<@Iqc-Gr#B1(}WY+yxa^aR;?6@WP`xQ4g!rhD7 zklT21Hn%v!m0Y+b=R58|{AG$;7kS>^OK}$&+&&SmU2PdEM94hU0vL!TmonYknmcZsR1!eII|R<1Xg)e)2i~ ziU{`&YD4aMc)hOPB(u1Z3%7oP<358QqqxNp?p$g^?h$y+eVEMRN-o@*agKW%ejCND zd)=PjYpD&nyWxc^->Kg8ed_-qv+nzn3%Bw($Grr9I)A^x_1iMe5pEf^A-5}DbI&5P zxRMLE>?p@Q4nJIRQxWdL)P~%@F3RQ}N{zLiB^PeVSjXK9{|En`685*@HG7-~Dee~r zcV}v{{{DGZ&RWTZTR7Trd*R+@SpHbb%v0o<}rq~Uyw#;$Z=VxXA;IpC=@tXYtnZ=g8iCwn0V?RK)sbW_|*tg04 z0efHJsO$JnGHbjgm+>yy!*OTe<==Cf*0s!YafEvbwIO!^UibNOGON#$H}yGhh-05h zCjX`rvU4NsV`cxK&l})1`vfwJEqN2WekaF1fb0Uru3KQw^)T5#V6VI|d%X9iCTqM| zYm&=&*9>&rLj2B(TM^;*P~3XBy3Z+UTJ?Ev);C7yiCx&=v43R$W$txTa=(yuR##___cFzviP!77@mC71Ee>+QIU@i!}O zMTEP6+OW@)@p`;pC$q*|@}@r5Z{^sJlbx>E#S!+svVX9~4#jKs17sFk@+NlWmX3V` zS+Qa_%(usTn(QC2cM^_zJh__88gI#Eyvw$5-1G3cid!Awo=k1X-5js`d@7mMXUUuT zT)2s2A5Qjh@LVXlXGPfi$^Jo~f4d-?eL#dQc@w)a&#`wUdsMM=BkTc+{UK~U-rG@Q zjkn}7-t`?Ew*Y^-;?})l&vQq`ea`6fM$}m2EqPO)E7x=Ewd_A!u`43%@2L&P`*wr< zBbmjPyop_srOJT}~Cj(s=Tql#VkvOU+=%l<*1_rz=V4P+Ku@+Nl8FOEHh zY?@+MMA(yM|A5^?IBLAlCCeIb?p>10cvt@9xa08qC~k3tJBHejn}gSVKAfyopEq3p zp(A9!z5TuNd&eD4)=hD9BizBVf6(9M=Vx<=7~I_gZpr^SZeOz1{4PlNoT&OGdycy( z?rU)MIB!XfHO`VJ>-sClZI6FkaZ4lIHE_cIK4A3sPdOL=eyV(LNHyd9m+a@qIqyry z{g&(+#Z5)HOJ)CHoM+(m{C-ZRxnIbBp4+(8ao-{v=eV`)_}stTD;nn6<2+CH54fiZ zL#^jm$gFXeJbAqS&~a<`#VSW^Zl(^;M@1iMr!*K`W$0=@ggxg!B$si{d)aZsINyfX>*@!xrq5|Lf8P+V*ClU$4fnibe?s<_Vpm7lZ_EC{+PWC8*^9_5w&YFh z%BLOs1+v+ST^eE6$o>KQ7`$HBkCA1qYx*sDvaTO@+`I7O6*m>(&ZIWv4#R71nk;Kw z!<9T)*N-^v6#VXr+wi|5Qd}qb2j&R3N8*+2-ntM1| z)BB7v-VJTt_gG4vtn2$7cQ}3t-}f7?>(U5!Fts6f`MKHLApuwV?YP}Cl1qOZXFG0R z{6mVHig3Fq?rR2j%LrF;;nv^fxb5-fires>2Kvtj{6qAKygbW+%Q%-*I_^w-t>QL3YtL^vwIO#PUURP`YvP9E zEV=ZzaE9Yf#$Tkyyi|Mv$&EAH*cEbj=`UxxTO*92x>#_>T|NW`vu%^ zoF$iWZoI;A2jhDxZYsjxRMLE=0e9^!@lppUDmcsW;@zuKU}o-7qYERa+&l|vLDHM`z+y-l`gygR>t&{FpX+YfxU z)@OBWKk?bGKAXq(bD#a>vuD{(@r;!|dxGtiK3n0lN7!ENvt>S;%eI%#KK0qXZ2S4_ zL!aHlb{n6)=d;_{4)j^Q&u(J7v(NtPv+LRJ=CcJpyO!;qK6}Y$SFs(QWciur(97Cx zmMLfZ7qETQXAk-8Y_@Ou>^`5Bv3-|p_G3kBXZh?Dw*O2d z;*lsK99`0v8yN~T4U-yyEX0h$=*U%E5-N82Hvv+)UGuyq-aBFCx&#Ksdc7bGF zGq3vWI<|ezbJ@#2o6dHdB+Jh{@3RWF1AX07KD&(Vd7kl@&n{$pagr5eGCn(p?Ywh^ zQINUcXJ@co;Ir92o5XfulI3Ua^w~*l7bRKO%q>1Uf$jHx-?Yz;X4}c1OQp}ovfVt% zx@NBS*&%Fq^x0IO9l&;oKj+JRHj?evWp4Z~@>vnvV=r|5IM-);u-(OHXZmbcwtM*O zRG;n0w%BJAd{)SIi)20uGAH_MYqs5dc8t$@vrQ#ge&%qWZN+wLKbNC@R={?I&kpq2 zW^51e*}gvO#C9|p&kw42zbpCPi;ACGp8tj48Jk0G_{mBPH~pPRTWYMo zn~?lVo)4XoBhL@=GyU;$js3_mif(JoFOKk+Q5*7S8vL)wEWYF+zrE)#BLDf;*8GMa z?f%cFHsqg)m*=5j|6e7u_>zbGZ}8IpN7>F%{OSmQw$uji7aWY&{CmkPzT_eQ4ZQGY zvK_1Vr4fEPwIP2XUh}Ucv-pyS{0H#DKa*`c#ZN`}FuCnLuJviaHUtyg4`()O+OCFy4A9y+USJ+NgYqu`)*!4KIA^$|Y zUb|0`S$xSu{zrJ>&tjWW{Dw&X)6|Ciz44lV6Pd-AJmf!%7ycD&Usn9;2>)zqLw--Z z=ATDq@g)!Wx8j9=BHObRzcj)>l-iL0@0r>BvD8?6$wU5yc;U+!_Jl9%^&Ir@znne` zo$|U2o#XYX=r8|tH7BEA_WC6B-CmDFU*`4k=wrP;20hg4Bhg!WE$6mooja!V@gwx? zSw(9PMnB{Af#{pP9)&(HsqdZ{i9XEh;piO`-7V?Y#!}C}*$gB9ajnz4qu=p*S9Fc& zJ&M-ujK0q6LFm(b&GzX1eZDPvfY)22*Y`Dj(ci3b$4Q}I_qqrAKGB>*H}sWW7of*` zy#=~RG=I;uDY}QxH%9;chub#~{i$ebHb6h`^Y-Z5yl#uWz}MuU$NKzl*2vCYuS0L* zYyLq0^t(I$ujoZy|BS8?4eLkrwO)UZKGo}Q(ff&Jj#i-i`FuHgJ+Hq+FaOQee1@Ly z^(W|AUVn(5f|ln}|3e?2=&qT?=wV*JgYK5-g3Md!b-zk|LFT{cPrQB&{am8+Gj-@& zef~1~0h2GrPACCUzCwKfY=p|ksf_~iV5_DCf z^E3OS&+_@c=!4PWy|cP^#h9LX`~5ACZQ=9&Hq?fXowa9VKX$gG#(M0OJbdgNfS2R1 z;uzcC+nQe*;V-8)nf18<$y@jZnT2@aSFxR-_|*~qRBA*1 zAiU;ZMP~6O5BYQP!k^4`L&eXH@W)dd@;l=-e!XM4{@#@y|U)ReX z|KZez{8eSy{E^gHe91%pB)srt3{O-1iU_|qwIP48!S6?n#g{zfkHQOI#;}j#r#7_v z--gKK-ZOEUD*X!?fGK(*H$p02E{jX)alj4^~_;aWY`J?fge?OVUmptSz#0$TQ?e}-L z9{*H?Kb6{$KM1e+SCLtK$wU5JyznQpy-)EQHn8V^JhdUeGhXv2l39GoL;eiB@JF*f zUh%6V{NdDw{8guC^G8x+@g)!WlkmcqG3=uFr4fE_YD4~FgWr!Di!XV|AB7jbjN#(D z)ci;IZKw_TwFbW(H5Om;kUsz~d>O-Q6u+T^J^#z84f$0De+8MvmptTm@O&A=;fi0q zp3PrCZOEUD*X!?fGVAeA@)mx6=3BhZ_>zbGNqFJQ7%sfM_4w!J*yG=u+K|84;P<1( znt#b#`1zSpc;U+!o~-z#f7|b!wV^iT*BbnG)L4AUL;e7~@MR3A-PXGQsR(~LwIRRC z;IAOF_>zbG4xTS#xR>HL{AKrl0kt82GG4F0*U2otk-vf7Pkk{E^gHe91%pB)srt3_rW2_57Ev zv&X+TwIP48!S6?nHU5&f@VWl+!k00eq4=o?zYVn^zt-TlqsHP(9`Xm^g)d`RtoYSy z?fx&PHsn_s{1s#tU-FRO!SiJd|GYUF|HZuiPreVJG{Rp%ZOEUD*X!?fGHd=NZ{ZhY zzQs%bYuP@f_^Akg4z(eFG+y)XC$spHhx~rEx z3qL%NWj7{Dwd5@$XG-$X{&m`%z=@B@g+d@WPid9Ip7K5q=wLLw>EnZ%2*A zmptSTzzbi-@Q)kS_(%B5sSWv627d*a#g{zfckp}}!&=2}_}w1=1=NQ8$#}i~UMI8o zl85|n@zVcVwx=q7^=~$R4z(eFG+y)XC$spHhx~B^6il2(`hf^E!SDlj0 zA4!eHmptT8!V6!<@a1&t{x|$$kAH7!L;hle-;WxLFL}rxg%`ezp?rTe?|--4|5n@l zHq?gvT7%z?8f*R~Z{g=>2H=G+W0zbG4xTS#_-0k>{x|$= z_kRJkA%8MnufNyHEWYF+|69EDzn1MKieDY!&!INtkH%~M{bUwj@{qp}FZ?RD^8K3O z{HG%Psnmx2L3qu-ip=6m9`fhng+H0?7uUOgZ@U-${IgEaM&Fj`{LJ0x3w?eE`UtOY zMepKkZbEPF^ECRGXWVgSqL(B(KXV=Wai7mXS9vYxc9yS^J|67zE703}eHl8>*IbPL z{%Lpo3(#*Rx*&5ddjA(C&rkX_AkqB&FZudjpN9VC1*s{>oPvHm(fOGP==*$LioVk8 z6VT(mJ{Dc<>yJYBN_5xE;pl&#cjq$({e{!; z*GHe}>(@gc_mLU+tH=r=|4cjdpK=X$*wJ>Bb{&=Y)pBYL>k z-=R}pe}m5P`YZI8|8?`Y4E-`%j{iCOZm*Z3FZKE(^wFZ}y`ed&kM340K_o4gxyc*rs>wD14UvtO56J3|+{LF3W**?D+eTCOIpil7n zdi0*Yz7pNt=hvYBeAOLuI(n(sSE8R!bbh8BeVflOM_=gmCFmo(z7V~OuRjmHxzEo= z|FXax|4j4}uTMump6L9{By^R}C!){tdOZ4IuTMm8@9U34=lT3-^!Ih{_(!1M^7=6J zLy6AMj7HD!`9bJYygmTEuh;vb`}z72==FSFjQ(oAJN{ni1zzugu1<7*W;b-X&v!we z==DzMy}aH5y_K&oME~`QJLWd%PrdGse!=TL=-U&WpXr6Z$md(3kMz1LdRMRW(OdZX z&C$R5zX#j|{Xefep`Y-2Lv%XP`I!#r$v$s~KE&%b=z(7UJCWZ8@b!P88((tgzZU(r z*T17PUjKr=CeitsRp?1R{{g+9*DKNez5YLRJ751b`s;b__zmb+z5W6{$Lmkg6^YKz ze2gCF^AFH_d%XnR!|Qj^fBXAUJ^C|$4|)^*qStSr@9_Fn^u@k@KKdx1zl0v*^$X}O zUO$We&EJonLcj0tQ;(yc^!ics4PHNtKHJyNMUVFR{pcOMo`de>^(^!c{(f{9y58T9 zZbv`t^)2XYy}l8B`8RG1tI)?KIzRIt^d5=snz*O#Kt_xd9A*hJ@N&PVT@X#V~Wy{Xq{p@06`9ls2{IMD@}Q_+ukeKLBcuQ>^Q zhR?^LOMHGjdOM#VgYM|{k?8Nfa{V2PUYO|o%%SK9eSR={y4MGyCwe^!J;K+IMECLe zaC955_eM7?m*aQO3`5UPbbe-c^emt6ik{;2&gkP4U62`s9_H(}M|bo2w&-;Y?wq$q zf8upt^mB>M&!o_|`n(7F0)%1I``jJ#E%Yae?weKOPhI^T=!IV2 zihj`Ro6ytI@;A6?^hBS}M33qWgNi9lEX81JKJqbjR<9u1j=5rZ;-F z*FDi!B)V&+JNg7)za@H4pLaob_j)t*pC8CEyJkA0mnJ$tvl04vpLayx=JopM3%yME@_*JpV^O;q#l(X|HcUPfm3A z%=PF)e0?Q)pwF*CZ{+oKbmO~j%&$bhooJr_qcc9g9DR+~m!KzkeIa^3UwS0WE8C7xdX)?}R?Y>mAVBi{^2@5WS(#w?VIb+wI#Qz0m7E=m$ho-wQp>=Ubsq z^13U!*z0_BPqbVwo1_1J%boKk=+C_FgnrTM4bgWbn&o({iUjI9u zG4b_(p?^!>D=5gUMZfR$@8~DJ{snzQqIv$0KHKL%phtVX61{`h|A+46>%T_-!219) z<_+k2ufIS)oalngr|4@F&GUcssXqSzJ<97P=&ike7v0|1*P~bPo`5`dy@`I!>o?H% zdi^STYNGQq^UF?L8d$w6SXP@<+f2CWSzsFD;zJHm6*Y95*PWH6_UaO~)@8Q{k@3q=IBl#@(9*^_f z_e&1P|L1ncT>_;UEsgwpK^Mh+ z&ERes;Yu#tvKfxs9zXKB*4&23`}Awzg#CTM;QmQw^;dG?mP~WpZ}Hs}x1!O0e|{;o zA$JB|&+q4C7FTlN7M45iTln&;lm1pQzscvJb0ge&)P~&C@S6JynZ=b{xOta3ZVmnj z#chcEJ;puMhTIao=2nwgT*-yoc%kFY#BVyYb$?6$wa2-f+K@XCuen!}SzO75TYs+O zPR0+uzBM;D^7ohHsSUZE@tQl4%;HKe+?ul-cMN`JRcmhPKX!jdP#bbrkIUxn7vV}S z+{)7(cQAgL8t010-+T5~-1iOcHW9Am!Yw<+al7CLs{S@a`rAQqpE0-_M!1p-x8x+p zUBkY$y1#Ahzi(VgZ8*-i8QdSptofB(xP>P=?oxb5-QURH71mQ5axcN_b@eWp#g$yR zdB-~LJp6I0zqyhAK1yxKJr1wAkCRzk$%Wf^gyY_WU!bm|hIaNiS5X^s_rh!Ljbs*A za^cpGaolqJd1{abPf9D$9zsam|mRz`ndpYh({AkV1x4EBD8*;D3 z>-qhX%;HKe+`OTVTaSNB&2MUJoBJ}gA-4>#xpia~S90Mt?&7$Q;xAM4TN?Qs#B6Fq z?!kD?y_d}5N-o^`9UZp{zf?VL6mMnscPh0ZcMx84uOhR!k_)$Hd&fNopReY(cq5xT zf!dI}DPD6=A+xxW3%7C`#~q6wn^x<&zs=p3+K~I}3EABJBV5UaTh`BUcg6px9=?j8}Y+DNKZg0u;d=mhy`Ov!KxuoMJD=K+dnR6UUnR4+k_)%q|9(X+zV<(@xfR`Q z?i^}E?r6N`-cM$6B^Pdu|NV*^@S8HfVSkJBZ0WK22tEB^Pdu|NV+N_zU&?My}tRs13Qp@tS)p znZ=b{xRw6*E2iNu;(iqNHx+q)bpf>@w=Z6EFDA3Nk_)%Y|9-{E_|5eEZfei(QPhUq z_IS-bmdxTxF5D9T`xT?`uc`j#Mqd98r8eY#du%p$&j?p?;TFE&uA^=7SE_YY7kPcu zU2)$sxIH6W$%UKujN|6v3sisWBG>OfaKir97~I?lS90Mt`robik$uln_oIri$KW;hK{AUgxo|7}?^fJ|pRAv6MDD-SsSUY<@tS)LnZ=b{xMkIDU0s0RNX>6? zXM27pQ5$l*;5GMjGK(v@a7*rX+@tWbRey6MuYV7qHsr23CYyUuge$pl3vYMaq4*Qk zy2_2be^scsOAYQ05w7II&AZugyW=-f+~Uaf+evZf8Qe`GT*-yo=zq83AND;}-H&o3 zulH9`8;my)%;dO-oIKxZOARh>vi=3nZ=b{xHbNFD;D6d zP~)5%d42R0wIO#rUUQ!%v$&EAx6=P^#eMiv)!*F6>%m*74Y?!mntMB$#g$yRW#w*N zO~=2kxDAo(_abUTZhySyUP@+hB^PeVWsW-u{}TV+9X{X4jXXXdLv6_IfY;pP$t7+*E`sxo{iL za@-RO4;Znwe21T(zVRCL2_x4o+xh3G7ob`H&F5MAz5VahcW~_RJV)X6 zdEQNCou}k-o=xA&J|8ci&zr%v{}rwIsR;iPYD4}2yyjm{X7MEt`LprDpTzdZDXsYp zEA9RtLv6_KfYX|D4R?OCIubJYUA}!^>N*zlsR|1!_b7B)sOoL}u|N5BbaRGX8Vf-lO=% z5&j+2hWt@@&A*$>;!7U#=i`MxgY7AbpBv#{LT$(&fYccnJuFEsdDQDgBX5BWuS;ma6SDSmE*zYbo=pKI{{CbRgGhx}fiFJpL= z;@AD3J^xFo4f!+hdj3Brv-pyS{2b4hG3=)J6%qam)Q0>?c+G!_%;HNP@|WRd{O7X$ z>QXiT5&j+2hWt@@&A*$>;!7U#=i`MxgY5%~-|&q+{+Cc2@(18G|8g>mFL}tHjTinT zwr47Sb%cKmwIRO)Uh|J9v-pyS{BpeTN3k8E_;oAn{tu-#m#RQe!<9O5SoV`58GkIhS^9Z>v!J z$lsX#0Waj=Z}8WVS$xSu{#Ks9g8ZH7t@#a+f1~?|+K_)0Uay6vWENlYkpDMc`Y&Vn zrQ%mazN_(BYD4}+yym|^X7MEt`Jdy3e?QwTuA=`rq)`Uf}hc=xVRuK$m;{D*8mP=cD)X`X%&MUdy@t^`|?g^zl=#pF+Rj z_2cNxuglPLygn6O;q}SrabBN<-rMVOX!#ur`E14UX!#ur(Z`@a^ZH2ii(ZdK-{JM4 z=!?BR7=4u22cm~~Jqq2$>yhZ+es{+oj(*?kz0ps4Jq&$=*Sn+7_Ig+JXs>rh@8IQbwzwFqY zhf?$VrHguPovxxy@@4$LZbR~ATc>l#uhn_cHc38>e4qB^OUCnm(|)Ph+a_(xH_mzJ zvS7bIGF7@Rd)BCpMi<5pO^*f}Cbe`1jkRGb@`D-CgI&dG3<#qVwcDcS(2Fd2;+A>5e*2jz1*5p3alw@0R{& zY|A=oIse_#YjmC*e`tEO&XeO0O*iU1IsP8$Z*-oV{~qaOEqTj&$Z4Nms`KPH>!;su z$rm?|fB9bNMLJK8zgK!;OYV-JoPSPwfzFfj&q>eIdBV+2Kcn;H__^s?ohQd{o6hJw zIey#peL7E$zh3$tohQd%FMXTNljFBf-_Vk~aY&B8XS$NSsHeNOQ{x7vm$%J%NFEz< ziuO)lMcZ(H-ODw~j7QrwG2Z+k>8UXuZI?!QL(=C( zc|+1?M0rEgCr5ch(>~-6zV}D&1Z0lQ4RuyXZV&^hkG( z9jmBkdIP;ra_{JsZmaX;-q9=l_n27Ud!>J;ExYfj^eUYv=aovYj2)|}cls;6PjX&; z(x2-*Ij=tHk7CD~-zU9T?~{yI-}GBLPtL1v`Ze0(e{n9VdX0D5(?&)V@ zZS%KEKSrDR*u*tBSMi$f$Fx<`Wv6OhW0{=G;nB7>>4RxA zuiK(6)BDkuwRUs5ri*o+thcV|Jz~e2-!(m0?~|;zZs~zKPu5$v^nlp0SW_vzPjVe> zmF{Nd`ROfmo}6!fdShW&&+F#znC?KEy^eNF=h9}(?cyBvTX(3j#<&mvN^b7Moc}bW&-v!nZMkiI>--v;R$X!G+>+v<5f$Gna<-}hR1pP=P= zeuwlln^!B(_b#WcufH#TwPDU$d2Nsyw+FAo_e_7y{qB6)$GP@Z(w-{Xtm)WXpIy>t z&^|kC@72DgeObr!MA}~q+ByEJ6g4@sH%yLyJni#?c4=#V4o}VDv`+}yoA)2LL9+ir zw6{9HaDQq>(mu`FzgNd(|2=6h587Mtso910tntao<9&^dlKr>0+Q$vyy_MaQ_I|V% zx#KT(<2Sgee~WWw@0#9<_FiE-`!>%V$Jm1Q5yAN-{U5h6{7sVMZ`5*pH$SvBj~_Md zbbB~|KU(LOHV z%k#VDxQrG<7<-h)8}}O4YQKs0tUgK~%C|}SP#N%(H5T@PnrXCW&7thi_{lYX8SPU$ zjR^a=O8StKlhfSCbE)z3)Ur-kOY#^X$2eV|1CJpsv@hEwY2SnPra8>IPN~`1I=)=z%iMLo z9qp~pKe&#m=|j68zu-Dz|Jg$memB}%_b=F=n$2j>I{)(StivA3{u|QX>ilVI9)D`u z(mo&fm!^!-8PkZb059W`WuV|m9`7-~!A0hjH zN_%N zpG`S_xAfP%M=sa-6H?QAWcGD3u3htW@=$Od>ak!|4t3SEM;;53_SP`Xdr{Dy3dfO}vs;dz ztm9OxaV$umO1q3>6QgAu3!2AqoOKRzPc841oWoK29B6BvOKL{P7&$GB{eok#zSgG7 zH%%{N9_4&;sN0)%KaMTeBYnx4&oNk!L;ipJQ?mo@zK^Zvp;y~v|E*j0&z=WrdeT0@ zjdSb$m%07(X&)D~x0*+4Hn#Z5^QsOBe|^mlpBK&UkpB1J=HoBU8XwmDAGEi+p29ic zxzA6u_YKxbGS4!8FK<))kS?58UTT9*2HMIM=Tr7_h&0`_QpfC3Y`%8Or%`~sY zZt1&%_N=+!TyLU%nl;w)*u;5M(%v)Kb2ygvtUk)~xY;`- z?T67`9_*hAk5A2kv^Sl<@RL5u{=Eh!`|m@0(->u)A2oZ>-Ya%|o=fgb`-Gsq`S|or z&VM_rT^?79`X=ptXm2$>;o~Yb-DuD1zwDpWFWG-H+FSKM+@G2aExz2}XZK9@Z>#y? z{hgXW4>I_&|F~Ys{=d-PiXZMz&G)qTb>q|WcqY#e=Wm|u{}t_ieBI+=_&S7|Pign# z? zNl(&V6toBX^E$3m`eE9?*6Ty~{|6ap6eke{TS{3dAxaU54Nydk72oc zy*w*8zMIG9=SQ_U)Z9vY@I1QZdXWA7^)Qo~ruE)Dk4^JH-E`W^{aVgqFi%rF!;eu5 zgSIBd`P4M6=T>th&$SuDGiVlM z5EQH^Bohc~FnFOCtSB)v$>hm^po5AQ2^e~t5)|6f3l?N1B*5fBNqe!iDRp8)?bxIj zdqXR|MG_3X#Y8W(m;Orc4;e6Mae{&ha+H|gckOe|%$}Ju$q<5CfB7SyGjsOInzi>{ zXRWo@(<+&DLaY5FtJL@AaQXOKG479n+YKx2Gfh!rYJ^L!YT@kqKc@=9IU#xbk7!?*;gNExvyVz7gZm_`Vq5Z^ZXh zjMMk!_@0XI6EUvG_kYFriTHjq#_9V;e7_mrZ^d{NzJCwjZ^ie2!Z>|z!1sT`_kYGX z_Qd!czW+16e+A?8{Xg*iEBJmF#zlPJhwpdcdp5@LJuMfq4)6NLiNfItmF9~}*BCDf z*uTY5g15S_&t^xKFI?CHyeIP>oWz_$n{Nf7j%^gpx*kFFCM zHa?MdF^$0xy*2m^Q?f}?|1YNm&*6W~pY++@h>Ge|pUoC-@V<(Bj=z2DVm9`04%X(a zsB0(x_R%Q!wb=Isu|oY1CkTh10-kz&?-PVobMX7*=O}2qxhB;Zb%g#F3uC+=qEm`~H17pxIovv^>xK@wf8bpyzs`Yx0c|KRgM3oF?1^J>%y3C-8qK5a%0< z|D*YK0Ji#EANL%MJ&tGla-;BW=-j;?mQ+QbCxp1fLsq!gSAVIa0|rV_H4GGD&Ss zqgy?b*`D9qw*IDif{GA<2nl0`*9r;-}>^{ z_~|aZ0|H>%rwcP&x$&x*;(>=ez*iA{To|9&&?S2J^$w{rQZ*g$({?Kn232wCvw`3vU{uKY) z0k|Uo_m8;#25`F)TVFnu$lw}#5*b`mj||s%HnG+9CsvAIX)BGjY8sS8AJOXw5Yl*zeN3OEwzV zZ`(KHinX_2h->xC#s7VTE7sZ68`t`>V3_XOz~Qq|!AAf-Un`J=jB8u%-!G6{nb)>@ zfP?*iMzy*g=AH-Np>^?yc>bwew%#re@Ouq-{a;*TERyh5tO3>-x-Uk_jGA+e*E3S{=dK<0}UDx_1=AVE6b**oKHVf{(uJshwCvPr2 z54?+UeFy85kL!qB$rKA31|62XGrBeAz0s{zPmON9`NyE=tyuFNxc)9zDrv;^wp>Zr ziR+uWlIs_^USp9=&A8?xH}~Ih{brtI{|{WBvPiC3fW6-$wPjz|+Wni+(_Igkqy*sZ zJsdy%{N|(lz(>=U#fOE$VAO^?cITdV;QitKySpinAH< zzo|l;HxaxUywW#j&c+yUrLj!#UVd!J-53L|G-ido;>R3W7)zGN%E8O|vBp^#8!eC3 zLWb~T?RR19dU>pwt&Ja-6L-ehyu@E1cSY=zgFdVL=nwJJJ^PE?sY0?hvrVwQQ*4sX zfKR@4L!tY$F3;V#eni863$dNIU~YmCi$AeuvO%cn6Jos3gKd2o!nuQqkP+D1AF7CmK^qKa91V!djJJPalak?fon6bzHzbWj`B%^CE+3?~Ayv zr~6o+mz2GH1N*7&r69)E=mdR@Ct9ed{alZIoM_P1RA5hE=l1h;Wj{}@j%NG00sGnK zbpp`q>?e)=5^F>>F@*NhmUwQ7E$v~fY9 zv`>igHe<~y^9rSkqC)8zyi1w*?wDC9*|Q3zZ2V?3)~$L*p_ISyr}sVzJZ{Q(>6?Vl zwn>H3<3e<2lpuB<7j8}=-6R3;?&fKQQX%%(xGuh7leti;n^P#A#OK!peZ%wS=!OGg zJl<*hpIqs&4MZRG9s{qv0(eU{@Nr;{mAJQ4h^cu7?^-)_o8?%yVlk;^gE-PF;=6NU zq2$yHt(EJ6r-SeoyotcGVpXB!SY0SB7DR6?_H@e%8E?Xu@TT9|ytYt^2YwR;9m6{s zIBY5_luYa58XSuXQR_h8upgiGcxUYCF=27s30ReQxAqC~49BXfLg@g`5RM(dsZm}# zD`;o4vrx*x+7S*DfI|${tMchWsQ&gpEylW4Y%heI(Knda=^KR6x&~Tfc|F9M4R~K^ zJ*svVO3QxV*Xq~{*zGdxp8xE#ZFXzG-owG(JuvK7d;7kW76m;+FO1TyGyMR%_#XWJ zsyP$BWJ}#9uIj-R{P*mHb!+~d+AZEAwk6aHQM#HpAYboXV`|A-X>PeIxh*U0kmceH z%b%T&a!7kC11N+ z3y(98UdQmTrpb5^4ulKYwM4=L^gj06rj~K#=9U|PN6NO2S;kVaek^dw-c~j1uD^>d zS!acoySG*1`_@^hmxPwoOCtVs_={@EUMKXv{AQo_Z{H}dLG8GpHGsX2*5J;Srk1Y5P!xjq$hCQl4 z#ybPBr*N>x6oleEiG!UM0qkiC>>|LP!@-`R0XvU_ZH@r;d?>nc~9rHZv?rqk6D zjhErhCFEfYgbPLSdG`_^_r}0&0scyYlQ>RmDo34Y^?;45DotP8pcP+sA z1)77R-!+;g$4;}KzwMCc5WwHu=1~6jG|uLv-_^l(GFbk$$|MCpWf`e*G)RJ zmGO}I?rh-M1O7pLgK(-|jWa)VKUGiOEY5S29;)ifq$iW^ys6$KrNQ1W6&haC zLs!lS)s^}69f*G{3F04YU3V+%dKBw=j9b@Nv95=?bv>xDu17T1^?Qb8s$Xw9fDsA7p#c#nXCA@LoKiy%z@+T0f#q>ne>87JnuuPbhRA4f~-X$Im|` z(0MOM=jS!(T+9jOALkT0KXnCko|Gf=v}wR;28Yw69LbT9&j? zZ4~UZgXL*6bEMP6XBPpdB{ELsbdH`6oEFG9_0Tzbjs{K(HE=3YaLUrgN!?qzYVj}r zOildDxlF;&3H<6f{MG|M2Z!HU4g9J!@LR3mS2i^GRqf4@&pk(g-_acZnW{Y}^xShe z$A6}J6}H|1&iu~yJXx-v%ab;q&-2UmQ+ZOw={&z&KMEV~u{^(AKav+J*AL`r%k{%~ zez|@kPpUhUrzzLfcX6Qoz+T3|UJ?Q9 zRSIk;VApZ5S8Kqo;$S-lhV5Kol``Ul)*81}s%)`J8$`Xg89w6b9ad>$qg7fgMtL*w zy{g_SZQ5=HZN_+;p>tMLStYv@?t9k)3k0x!!58aZmP3Nbx&JClOq~_u+u8NCPX*vULW7EGAE(om%8Md zcszeVObD{SD z9knugW&H7=RdT#a^Ax>|KOV4#((7SsD805@WqRFh)udMy_elAp&xaH2CxBln20nwY zCBrY3a}VkU1o#OyYWfMHyh}eeFh9ZK2>b+1bMP$a>^NvM*iX=5#aI|WLHBHoh4B;U zX)KJNAiWr4Vf+M^B8&z332uj<;IFhkg$AFWp!1h{_z6bBPcYKwC!jsy{RDTyPw*ht zyD8rg;wK339VtFf;rVN)dwypFO^onbdj#9rXI0KsN zn3?^JvoX{8nYS?~;``OGG4uL^syustzc=%ww>NpWu9%2Q~bSM>&7v zk%9eq|=m^f`fff1NKo4 z_K^r+pHg7=0=8Jp(YFR{iGzJU0@%^T3Vj!YzB$;2Vh#E(=IFaP0{T{9X92dEgPoxP zdnN~aMg*|)6xfRZdkF`-NCWml4)%fwU@uc(uLo=g2fIuI_F4}1>Ih(0DX@0{b|VMd zsR8?G4)*p4VDD65?*;634z^nZ_8t!Q?g(HXP+%Ve>=PX9gBq}pa@`3c`&(c#ys-mc`&&>W42_UDbIt+?P;?^=aDvBdmd9}`{$8` zc@*_O4_-y-6cZ zEy?QNoAIzSWssd|h~v~|SmpSGWtc~qJdYmor7Xle7RmD{C*5!k<}qKMM-Rmx6lu(3 zW|(>8ar0P!c`WIF9x9Cuv@ebz`eJ^SI%Qw>g1*{0`g#HMwVR`_ouDr_M_-K^^i>~* zzIJf*)dKq3a~0_8fHIHsn1{s8<22@RhMUJR%;N+%kE0s%I2dLgN4R;M!aUAhg?Y?3 z%k<^&`~Deyt@iu=8GV)cegBNUmTCAK7liRQF5&!*tHS&K)$_&`(UGyXtU#RT& zx6=Eo`2A@u9ir^_ujPHAL+tk-=v~$1p}RkyzW$6LUw<>LC+F+WBz`E$zWy$LO^3+W zuhOSVua~>Fj1PWM{QN~0nSZRcNE_E%n4ImQ{a9g5uv1rTLg%-b@Ewe~R?v0D0pN5{#;J>Z?Clyj zy{duJUInKYv~lWh{dnAH{hTv$75yX^`bn;T{}<*$Kgsp)|D0UtC%OLpFUk$w|Czbk z`=6KV-~R=<&`)x&-u|!1mG{3M_--fsmHn^El^o7o|Nc8<`~&vCE;n@l*CQ8;_J0-i zKpb3Nfb;2GdH?qUr*;`9w*M~xr`6OhNFz8iEMh<7i+`d!WV zo`HP#Kc5EQ{oN12Pdn0UorWC0*G!U^a{PY$Abj@=+)I$-_i8`B`+fcR?u~y;uoX~_ zpAq?Ge~k0_?(-?f5BHk>3->tReIDib;ePiYaNqBz-3H&iFUL>z(?->xHb7*)dp-P} z$k~je%i`5jD_*jHtoY$7(Z>tOBf6C)272u`y*PP zy>ZN!(kCW(e>pKU$B*`e_uWs0pZ0q4@BSWnwwPZk;%HVVIex=_+F?I!MTEIPOuyuE zftY^55?Cs1=~*j~nsXlTawv1lXQnYyakp_ohI; zP<-E^iPIT;fbC+rfH_%M%PV6i|XVKg2hh0%VS% zMjg}BSb)s&kEJ8-(G(za{9_jA*QNlO;~y)Ni z!n7?8dF2^gUODa6Eyye1k2#7;Zuw%&^KQr%GddS%~H>w{fUvxHqYE7uz3iW)-f{trx&FV7wISlB((Phr;|%2)QDb9wLVJKXHg`>MAc&d0ROBi;usj^L23Cne&TcS4Zv+^K)>yJI!QU<8pU0X-~M^oo4Jy z^;OK>(bCuX{b&!`50UIg&OBK^-h&*Zy>bpx56zsBn#)0QBL``BWI0F!&BqZmA0{`4^N+kN@BH(ge+0i2dw)2;6nlR-zZ83a zIKLEof3BimY9M;ke1G7NV&`AZA61U`qk{8CvGeZ``J)Enzr1~T3BBL&O)>m9-xR}- z^Gz}QhS)b1PCkU-H|(GC*R2}%Pq8`+!~Us3`XQ5s^Up7vKmPxmf4;&h6$Rx0cLn7D zTZ3|dyMl6nt)FrZFu%X*nIsaq&F2Br`I*lHK5+?h@&&8prWlSR{ygAJlH*(+a5Kel z3}GIy7T&ykY=r!#`m>bh`-cbg(>*ac(wX=i*u0Xw<=c?gsmqbx*Nv=y2X@`Br{ubq z!>-$o+|GA}xX#JUt{cbdf|kLqn<~b7$*$YS*>(F6J0aV3iVb3Mb`b>o>`_esUBtN(2rv+L6Q3aqPoV7NY%TDO+jWryusp>cylRGVf{d<6C& zcK+q+(XjI`SC59Be}||Z4X>YQ;mgZ+I-d{MrU{J!aejepLr&5uIonWTkZq`zbjl&J z4GlzZWWOSN5W|VH2Qi#Ddl18Ei0nZT;RG9yljQ0$e~dEA(_83|QLZH$^c;VTaw5K0 zUxgTD{{6k2^F@fCW5wq)PMPgJ7pKhjo{Ljvdp|^R$`S4TaC~w~G|otyhU*V9y@BFX ze0BVX>knSl_++X9H*Ej8&ijvG|9O*Q{17AM>q({bRD%6x`iYxzq`yz5+LUq3#uF`y zoo|lFk>0u{M`AsGKDvg*@v$C1_+GsPpAS*7`?vs0?eW9L`swkre_lL` z;bT31&=V%O$Bz-cIF92tFH$YErHIj{m^Sn+A{!6&+)>9mmS7CH(iquz__6L1i~&~~ zBO4Dtrl&F3cxa4lJp5StVvNDYLt|v);m0hGU<@`M8Y3GIjiDFO@2|(&lrD<1sd)ei z_eJ@7{WRW-&#>*W{$J=zbpk!P{$32*o+x^Y?~Sruyg?YP)^-!O;aSAc(X*}@qo&(` zMfLs?yonqrt?N@yn4~Q~wYqOazn|~To$Edi8{qFy>u?M z8v4X*8J*NUW|GcEjeOpdmede0jHjVl)PFl3C*QYJ;XZ7G`#>Wm*wrjiy3UEPOA?(> zkDyOBU-I>QQhNmHHlo)K@(0582+9%TI*rs*26jK9iS!CQ51Jrb8_|Rb`=E|l92n#5 ze*9Re9b=r`j~}btfHBVQ$B#8Vi80RZ$B%Wa#~5e#R|Jo#N z{_%b8aTlWQAsX14zrg)xUn-?>4dfg3>sTPo(cSBhgAj*FwbiOGVk?&l`y-KY`I zw~Z$nNUkw}2B?Qr?FhlP;U>_)_EFex&;YKUgd#=*u74Y4BOCEwY0bqXTWa!cEC#qs zz-M8@d%_df+Q?SS#&M5gP<#3kSu8Nog^2ej8#ZIMXSkn&|35qN?v$=i@C^1rrI8%a zh+d(QT+m40=8xtY&=>6Ww|@Va${R{VVK?cSeVacUq96Zl^WXolhUaiSmpj}m=3C^Z!03;I!?>y{GPJeqMOIyz2vV1>ri zXF4v*&(z{d^hD3h2LIvVG<_&PQ;sXq6+Lq+_z?e0!G&nx_ZqQy2b=t8H;BWS|pjsXb5XE9(e7-x^%}R*>>R_ZpJm39@S?$qUC35aSf(N^_eEU z{7gBn!Sq-iM30j}kM>7EcS~iu>jJN%{&$SmJ!F=umKs2JGOttl+b{Gc_jA|hx_3p7 zX&_!l{BP^MW{G%U{rzT1<#{!8ReDR%=6T0udNbjw(wpmbncj$JSXTRaM$fnL8MJ0> z_47On?h(&R#8ss=p66M<<>z@l-@J03xAd!6^8t9CN@ooJ$2t5T1OHIyESTr%F-G&~ zT7hT6@VxGF`I%;1RXPjic^%8;XKHa(=`5J%HGM;VrX1H`8dLdeWtsep71v-IQ=cjQ zy8KKgt}=}!K*lDZ-m}c}s6U^~^O9tqr_txtZUWDPuk|O)*E-H?9VOU)0AFk6vm@%? z1r0jK<+_Oux0p=sx7T0W@UdX%tpCU?&4%ypPW(OfiCI$gu5F}um7pK63w?~K=Cl<& zZR-X2OwK>~=Oto%rx2IWc|K~?^NrbploFR*V|;Q%!vvA^qWBt=lj4L?D*U!q%d8c^s|z0jr8ef`WxbHlN8^rs-KmP#XSxEtm%5( z_vvRzOfQSV@4D`y{-?T5($V@j9Zl`ax&Nq~p$qBTNqh2lu5YJNIos)*bOCu))VEVJuj=eIEUzjN zXYV$|J^1pfglhuxstzHqYPynFb%@KWIus_a3cM@(lCYQjC8?BKrQ}6@QQ~TceJ8Lf z1ochj{fEq-GfJuNV@7?SJg&aa4Al3T$<_DCKy8{STz#KO8ufj~gsJb7#?|+khWb8P zSFyg&QN=&i3w%Y&KTztsoI@?0^IUzOGa9vYB#l}+re=og9pN>z z^pii4eyZpQub8Euo=jvq!ogIgBW(L)E~g{x=X8WW44@;tbY(ii!M`Vg|DF9l=?EqG z%`9c3jeZ2YqYx?KQ z&=GzG9pTrqj$pkPI>Ph$QbW#kSx2}LIzrTy=?F&HP}KemmZ^RnLG91b^iP30g4&;< z`?jIe5p+EX{qDDs*8^^aTxNS5qwKL?o?9kkER2p&nt?IwG1b$s2I&Zuw_q%cj?i>7 z#=__b9XDZ&?J;`Yusx2eQTsD=Px9*sHI{*O1hqdydU|9!!kI={N2q;P))9QYm`lDC z+K1R>TFd$n8@WEjE@5q|5q*e_=tFEoA7Uf=5F62l*oZ#FM)V;zq7SjLj`d+Cenxe{ zn9iW&P!|RH-@Bl%RdW7!E57so_b$A1SHu6V`rOG6uf?1BxWPumGr$Jt>l=Q8@?wYm z?vd4v>dlekM5iF;VwzkRu9@~c4KWv!XhnC~+32f#(^n9^5h1UOU0ngFC8Gd+n4)?X@FH?X`p2 zwb!(84A#k9kIJ_ClC7f8XD85S)H+}`{AJ10?G=y%n`AlARR){DllfBB$uG+_I&fBW zU%^?CdN+BVHrN*7tVrj=4yv~S9!oLYU&UFG&V;N62YBlS<*fKH&WdYrzZ5nG^{i+| z{B|W5!|egz)(MfthsI@BhDa&@#yZk{`7}XGII-N$^?mPMm2Ur1jxyaU^_o;QCKggX6FGzu+1i;m(RH z+_D_V+|A^`E}t9_CWOcVCIispUhPFsz3!>rM(U+#{Kd4S&a!6_EmBN4qJ@rWm{yf1lxU?0rR}zt3R#__2X_ z#S-FQ=s7%Gdl>OgUywL*e*aZnMvD%3JtkPLeUakGtBxuCQ_rJ+s>JnAJ)zM*^&Hnf z^-SdbQ>#&fp#uF=7mGSC#f?^>27?3rQ}+p?x0ZC8qo`eg{;AK9Edk%RpbskTNiOHp?_)uVibh+(G3pNZlM0DTLrOU|2nbZ zd2@Wj0WrQtk8xLeOoK=l3uhcZsFUV8s|eTMCOr1cBXE42Xl z6V5kd4)j}_5W^l1yeGn5--kI+T;XQ)PZied8yx7LY7$}^POghl>Se|-i*jiUzh5o53Y^PTL>?-P?EqY0Bu0UPg#h^DjCv8DLZ0Zru_pGQ! zja|8Cg^u-yr+pwgt3%K1o3V$R#0T6W_KkYP&(#Z{H=)4-{{!u*N?&$`=J-9N7zm;> zbr1J}&UpSpHN@KKoD^w&T`?z=&d&SgqL0oHzsl(B6y)OobQX$ZJj2l$Y5wvQ4V=>a zy`X(Kjn9#BLjUZ6a8ln-b=_3jkGQ@rVpT)l$2l4}p?@}8rz~xp)V-x^fBQ=K5&!tS z_Rm)FyBhU%)pyXffs2n);~`UFm#r?4zPGgiI`2qt<~5>i>!t#!a>8BgY_%C@D<{rY z?dua*ZQVHdBn8A33b;;&zmsC0dMN&_A3vP^K$7i2oUN{hUT+aZ-`VN`oUJaR)@xH= zVBN#}akly^?stC@c(&RYa<+=x4>w^~|9;m18{5Y?&w#(sS%>5w?-#Rtgt2foHVI?l zY-|@X7S6`@A;!X-tvW7XEXWTx181ujX?@Q7>l`lEiv#-MX5wsh2lgQS1I$U8pITd2 z%MUkalzg`8!4-Zue|M9f>n3Dh*^;NBn`CI|CWg*UGdSI3CUlee ze%-`vHZ-Iw^1^vUr zMdzpWd7=DoRbHq*vI27m&OFSx!*xNM=W&m}s13eKC?a&(dep(UH^bf5?@7 z@(S5F72nK$*tMP=$9ywIh~I#1<4_^uH@@-YNI8Dvcezr6F23dlouTHbmvUMB20f!0 zzwsN`h7uAwDSm@uH-xzO8Z~~SZT+YQ9qNqs7r&8FkDk4XZ>DXVA;34|Nig_)Gx~4G zg~o4u3->g9Gfm&beI{6?QR&O3$TH$DN)=*X9@(9B1$Audf}G?Ssw%q=|4yqC*jei+SM z7=UKpfn707%uggVQ?}SoGXg%hMaB4HeoT+}X{PCWp){kXdm1!j**Z9ysn~<{hCeS7 zn&D%9I;!!1pc&d8U%3W)RzjczlXcB)+lz%NB{^uqh5qlUZ6r;FxvPF8IV#jW? zuoy*(Pox?hH8)x0c-TpDd}0h@va=EYl}Yhmh|53yk%7hKyKq(G@&$ZW-s~SKW32P^3|BZed2XtezMJH`?Y6;*nZPY=9$d?o6PwDP2$YdWcUD+;R8&D4=@=%z-0IUli>qQh7T|q zKEPzz2k3||aNA=vaIK0E*ZGPrg=-t)$$YqaCd;_4F|}l^G`HN9+?JK*v0P-hmJqID zOUegAi|El`Of3PfCBU@=xRwCd65v__TuXp!32-e@aIG$M+v7uVHExLv*Ooalu3fhU z;cChp@^w}7bnJY6_7OxIR!!PyLo6=+kB>HTwQ1wk40#UalY{2qni4XHNc;l!n7Qr> z?7vYEIt9?GaLHA@SP+)Gpo2z&PtwgYKFzoW?*DC}`+rE;|9Ra0AHx36!~W01{?Ehy z&%^%D!~W01{?Ehy&%^%DQ}_QK&HeYRi)`&yOq6j=Ob^1~qSHXNW>N5DMdNyJ2zj8KVwDBvP zKYk4#wU&Iy#XNAP@zDqVPfI>b87LJG0(IoWF98Je2AI{Ib*^*XTm#Y z!aHZeJ7>Z>XTm#Y!aHZeJ7-efIh=c?j$N$hMAIW0(JIR`#~4S$F+iY+*eGwpHT$){wpe+3SQ} z2hMmEIOA!_hPJyR!!apI#<3aKfHk$>G30Bi6-UTu{v)D-gfvfc!9V@*^Aa!#*Q2 zd|%be_?Ab@`1)wWbeBvU(qmn8srs_&*DQS+dC?dHjH=6^B6+@ zXGb1P1@d3CXrt}A$nc#a$@q5R8bHhT>>*!w2XZzlkh7shCv6v!B3j=S=Vg2oFN_N0 zAs*;e=$kU6@&)l6K6@A9IhehR=;S+?#}nFgB7A~*;QxGdg8$Q!FK5mw>mEE0lTMz; zS<8zdJY=e0r;9qPe=&6`F^hYds}BQ`GOd&3dCq>(S{2#)sd`e(z`N_&A0~07a@Ac*HqIVk^q0m zlLb;mMSyOhMDphed&zIP0e(I5`BzOVkXR3;q5{c2r-1cxX1yS06i7KrtjGk!ip0P^ zRhd^HMZw0m7;z#M<^st$PTyc&r*9BO>l!FdAq4h(1$G%=ui#)W(15*+gS{jI*sB!S zPQb3?V6WDIUB$tUuy-Ph|Jx1NdkR<#5R3nFgTJ&CF#i>c{~O}oiT(TUV{6El#r*ff z{S*JRSt{`N4>uG_bz=&zTK{ktYN{l_M>zZbkEeTnXLBD%&7SxNKDMQt?EBI)6gU0o z$2R*1Pkvt%qHEsyn|#k$d5PWA(Y-g6=Z+`)o?Gxg+IgQV@??H#wa9v`FYnVdaY+2l z&LDp?i`Rv}c_aMI`w$02{^m;fn=9aNen!x-xFm<-Z^l{8OaA6+_>F^OleWR%EXO8^ zEH;T^;wUz0GyKhkh)puCi*MKjKQ;NAPvY}y=$rn$Il7?(v2YZhWKSO`wk!s9hW!3! zs)6%)@HdBxOS1n4@g%=f;z<(wY+HX_AZ@IerJ2`F@gyGjEiWgYL|C0#NPu*K{Ir1klXa5I-0uo*S~P>W7N0Nq zGH6DZ6FJTBF({U;h=GG_>Vqr`jwdLs!&n%vWq6#OyTg3?8jJ`eJ^dtSeSjUY{OU> zUeUAN+^AkChSod zdePHZ7a(k_EfY|WLP`aZ=s2JwmN zT&d>d4UA8yyy5HM7i9{+ARa-yVrxaNTo-LquAfglncFX)IQ^2$CtSFye4=EZp9U=d z2RcJgy{V?ZXzLf7sLe@rl|s$@0U;Cq|-AoNng$1U~b8qGXkyMk+Ui(n$A{+BA|*_kFS? zaz3$tR{wMoj!!f_fjtUCFCA+!7KUEB*I+D+T+!257(S8yuNVtMFP86MEDXJrt`3Y( z>{kbk!PzxlKD+kh8f;s21=1GXSJ>G#c5JTOAYNI$krLEz&B57~YDAYFi1nRa7gH_- zV)HvXa1ZOIo?Xp!cEz)Lx{oy*inD9QEb!ER&K&&N)zXIeKeorAxe%rMFa}(YE4l-p zCsFwl#@HT*o?V;vVvO;G(6ejD?=i;qI5f|^`#&*;J*MBISVa0gBb{AoeK1C`_+%Hk z^>)L6XV-~1yRO0iS@y(+oL$N1fH?=m8YVrO%zVPlxVn%F;foh=jb^rd-p`i?zaNVi z;Cy}JW%&BE>Wwg471!^B*{T*Io?{VLdtwe^JLYq>C$2)jkHO~XvfPLj!#zGI&NX$Q z8fB<8!s^RR@z)yZBHJWaYs8B0e6116o4lH}M#9aIZ^Zs4&Wvvd zo*7FJ1GN2Qj`ZVa$1q*6FxKQQLQOJ?J14!6#skibf5Vyab?(ggmjTXtlay_{yJzo(H-cw9f=XOt`J@Z-xd-|mK}Lj;?dd7Dl#L{u{=?_vw5PY%6GjO(mRc?|^M3B3o4)P0?74?kSUeV_xj{|9_0FqxYzB*Jx;D$ zAlH9{`{{IFk?TZbkK#{+PaqXE=VA3@BDYEFk|MWBm+tHhE7vQVFvj*b)F$2ZGmHUW zlEGB_nwR+<&tfc$T<>ng81|R`kM@`UKRu1HGoHVW*iDe@f2H+t_4?#`=S#f<%Jr#` z>txF={b_GRa=k7?mg||5Wx4M2IoU@B`kXw-alAvxarAIGj-D_%j;z+GxIVbnsFUi3 ztwrt0^>Xb=*0*Z~YEQ0`Yfsh^UteO8?91fZlZp6Vy-1_>W(sh<5jFXs-=tY^1MB0znKnq^z&D5)SiNK{siuv ze*^U5rC*ZI`N$n3zDl{PKEJ^=+&TX``J7MBX!;FCT-iDQ;QR65bxK`PeCE&juJ`=% zzhg{j4q7_h)3OJS=5o+3!*8&303Coo=kvNicQVdh&;>{~2m1~5GzM8gW5M?0^pO~Y zte`QqPlB4`W*LF8FuFi#62`*l0+opv3vL?0-zC)yT5AE12u?pyr&z=O~SSRDkq$LRwPKp(gWxm9`d(CGsw1*}zs z=lqU|kilWj`P~yR7DgY?(^wdNAUzFZVe|ou5o2NWfznir1?dB~lRiM}lfvl(vj)}& z?u0(@AlX&Mh3W%p52=7YVDSCC1%D9r0dxM>NcQehpDH6h2loLp{b8i-b@T!IE8sUR z69W2x9mDUwNPAz3`^rAI!)DprTrNxHu$*CtWx zKB~1z(&;|dgY0p%Kc)B!)Z6`aAJYvwssq_cJ()uHFUouJ-*LXddrCc+w0c4qaSq4^ z{a?hol-6L)uz$xDUd-#!mDL!-{?QomVt%a2iLo&6X~!0fVgKm=$T!3PU-xE=g?Uf) zG=}}7|5NR8YHgDAP5#;>vw>H!VMI+F>T6KF7%O5ggL?$1wMj}V@%suNQfre8$F8b2 zqv6=q{$g&O^#yXTW-fL$5${0-7rV-8uMAP_s+RsN*Ta(IRY`w#B3_mCWjKL&+Ea2o zEyL*u^o^r(JT1fNZ~==eB-;1&b3Inzs|RyjsZY1*)dI=1F0R4RULbi8N4OuK_2BOV z*EZvDIt`rY96Gj8+Bm+D#XhogXi}k6F{+ToKC*MDSSZ<}3t3z=JBRklIP!Jbww)=^ zj(vfc~(%Tx!@rNpUvAHOvHnF-LPNQOY(h^$v$T1pq>OTta4f1~sTEP4FW zjDJOJs+O(4?taB4@Bp(3uslq%_Y1B#W)p}qnxq?%hdB;8GDf3Vf8+9JXH7H;63f3# zv}a}8D?@T*sLm|mNO>~E&r$_{T>}<_ej0f*XY&0q=tuIUkQnq+`I0XN{Y3u2G3e*= z<@k03XfKJ26F;v3JDQ6V7Yhc4JxYl|&j9Qx9PBX~G3b*x*l7{Ko~FPq0_-^)>=_!c z^ElY%2w=}wV3z^*3J&%H4cN;#*h?aSy-I=Y1nfEv_G%5-RUB-`z_5pTn?15R?WYT* zjCq#=cw6&5mu!_BZ!0G|3&-1fAS0@;0&i3Knaba^SF3j@V=GE5nPF! z#+ArvT#1~j`TBFC?9xc;jQc`daJvEZmc=6ILbd z>a&@UkF!m(O8*4gxDh!ysgQ@$(A(4$9bY3PqJQuhp~jGo+Rz4Jcfh@QCaEYX=-xV$ zbUHcc-Y-nj!O=nY{>LPhT_1E$FiVDULH9DvQid_;-h=4%nI3en(kz|6Mc7UL3iQ`o zKHJ@AOGTf(E}SDPdacN<8R@+h=S=%4tMoQ{+VS&<(VL{7U+inuRpz2js_3;|?6XD3 znWTx(7wFufx97MY6?C0>qlJbF)IN1xuWwN3Z4dcp)L4BUCR?uyeXR-lBKHRLQMO*_ zv*~LKP?I&v+jG9pHUY3>EhcFRu7yHEXUvv-_eA6~P|kv5ovuNTe9`^5dh`jHQB_7to~BOY5?b;gjj5b$O8C)AhE3 z&mTE_;vNXZr&${xEk4BKL3(Qd9(WHR(QOGLLZ z$;h=|m(-xwqaHozc0YXv?b04arbBDcFTMXB;583;*<`$$j{`3Y@G6w?%Eb31lLlT^ z1+Q5OUQgflJP6Y_k;}_o<+oa(4Z-gKC&=$fk9{Vcu zBz5gBcYlBQiMD*Kdr6j$nO|k{@sLkG+NTe_e1t4i<>O<2PTcK5Pw97WGebU(^jb&5 z4u(F{=O)C-Hf#8>Gp@jgO}4PM7yWrvd=C^guPV3)iker&_dtOyY!_@{yGSPaeb|xN z!ZzUjE&30{@kMA0i=+n%*`|VRVQLQ)8VmMet36O?EZ7#74m~lPEljHiiker&_dubZ z!2{XC)V!)ld!WqOB-3OMuF%>1G^x}%8d9B&qse#f2Th_+^tX8K$ECt_b%#S`)CsN?anM6$LR7o(53qd;>w98jZY-mz6zTB5!R9ClMjO?*N`og zdYZvEr24TQ0!=}A%)-R=^Enjc|Jt|uDA z{p5)lzYpV}#Xj`XOM{J`p4m?82LHYuW1|6Q*M#XQ&G+It_$*Jt*ZYXpvfR{kfMOYm55YPfJ8$ zH~B6or*Z>gS0{WY$yNegGo{Qk>zLOyckgq1A9K-jpY*k!z|{zw+E0PkUxB-2uECZ{ z^P8BR(lZD80N~KN5T7Fa)#vmWqi4FTct-KXB4#e&neN&0GtIdAe6r9jc{m-#@-wx# zs=nDqvEUe!WY6nQ(7QDlZoreO^AP}&H+sz zw)Yyr_IJ?4Ddbka`AygkK@+DR@b^i!>BNUH4`Jbp_r3(W7!MoWp@~^3 z9bKr!zVH|KlFg3R#)|JmAB~`oHmu!CSYvvwvQxnoSE3KffpL%z2k_{*yYc_~@a)-% zcc-MkBEw9ZhCaZ@u&wPd6t)H!{9tbGtcZFYw)kIX58(m)3yr z-35Fz@txM74>aTj4blA6XD!IdrDqaxW$y`|fzd7CnRMjl(lb5C!=-nG;QSJ6?_baC z6g|fHb+1KUu1SfxqH_pBq3=TR~6Xm+8r!Uc1oy^FQD z4n$9-56Cc8dg{3!|D*68m7bQsPINWsY3V%!(-ZnJ1<+IXd_TTK2j%!4j-D###WPy5 z;u?;gO7D@M$;34rJz3@ku6x%UJlhXFbyx{zc1kU-;pnMpw){*vuHopZvRHn`itEXk zTMdTNfr|6DFT85RDNetG;!cYFWzMEC~NQcj4@XZHA%W3TBCg@+ zDZNjor=Cy3(~}-!{JPin_D@fh$em&Q3Dt%f zA?Ei@#0WEam*J-;J3edD)7Jv&sqzzp&Hf!fJtgA17Cl*dWqFr~YXCg~UNAj%e=NgP z>8TvwFPoljQRpf2^62T=TL+*ghHs#}E4|>ym&vK~@)~H#J3YqenXV7yb)aX0A72o^gPnL6voWeC6J*A(OpXqrQ&xDb8dW;dxb-jcBBCq3|cTzs* zWp0bMz4NzR>FxdF**UKO=e(i;&Uw@mWgqmc4Cvz&H+~#z(T01TgyK#;>D<>Q*(`L< zqjT?;Xj=^8TecZ*O0nW|s<7d`wr5A!RNGk7=4jh4jFsd1hN4fMfUGVcdj$RerfAz) z8prhw@Fpb=b=xxNLcIO<#tTvR=pg%C(4l@0{b&-4XViCElz2uhJ)3+?q-SRfdhdj! zBxcj4_*88@JFZ5x0q83*56tNh*0b4xe%PFzO>v3pa~<|*S+?V9)HG>rR(KqGI2F3v5=$}@y}S+$YUK26{+aae%FpyX z5$(%qN&s#l_F(M)ma~1fQCJ7FA-2;K75luJ*Q8$?ZA+doEv0Ksv@cF_3gRhy`s6x$ zu7Xc|b@me8lkb%r>Gj=P`;L51IN-nc!5R5p+pqoimg1gPY}A?8N659YkB=Z5ia!s! zWHPg%%q%yx-1%*D%d9myEopZ1%&`kpLc59RBKDHnZl1}&Kv zBaSmTtr2H%P$SNuY*bJT0DQWJF+umpzp4>u;M9mSIIR(9P&6qB9{g!YVDQBmcqd(y z;|yNKo*~YFY*4qphR^-P8AKz_U?2HY5oZt^XOhUrOFV(%4046&&Yk1@aR#c7jox`$ z`~Kn$$|&9-j^Yi_dzj)4DkG?19__*F0op90c!MnzZ=mz`AjUwir+5SOEW~Gq2jUHUctjX)FzEfk zdr?Ml2XPd40D7UggG!1!0KL4a;DfjWA3j$x?%?1Xz$4uscR+CleB43T$-&1RsOvLm z|32am%8mm+F8-kBb>L_5#~+mA`)3({Uzl72B9xp~dPV<2e zZQ`1xFQOLq?OL+_)g7{|FaIf%_1k>04uaBOjq8tc#Wha`lJ)2Z#pL>Izx-C?sE6aH zhwGXTRF8c)eme5_>9U~QkRI5c|54+oooR(~-u-;!x-5`$U7Be=dB}Asl5<@$@!c^K zxh`39t_#b%pHUcE=X+A2cCO2`LVulaGwQL=>AxPkmR`okfs}|W)60S2JD#}>=_Zj&QoA70_-Im>>>@=3pv;eB7nV2fxRBE9USa34cKcr*sCLe zU8TU@0oaWkY^Mh7r#aZ$BY?eAfxQ>7+d0^74cL1)*t;WueL#VI46sjdun%g$KFYy9 z5&`T}3hZ9M7K=Ih)_^T>u+K*TJGxk*?_$t52is7rLEpt3eHTYS-wNz3z&3NRGc;h& zq|=m^f`fff1NKo4_K|^MJ5Lo$O#c}( zTiQ5wHp`7=`j26@RFO2B<;IqizR-)`7H2d1XZd4Naj3p#FZIA8477oulNb)#kn z^aVM9z94$o+J+*3%sGCxtpCixeCEsZVfv35^U0Iv!}OmSvnBgXc|J`4nKnCgK54VH z=QCxte?D25Pf`E#8I=CBK$%As=HcY#u@>`K&&^{6=CO*KN14Vv7KWL}GHxELF%QR8 zm`CqynZBl2rH#|9e)>wYN)?l=e)<|?mF#1!e)<|^4c!mXs=XgcR{wsCw@P&x)~iQf zGpsUwEyH}utY>?VAJb3)$!Sa}VXeI#*bw)3HKpjoT_!wpfw# zrT3P{B42k0=&cbslOl2z5kFN`Z@<#q2ZUh`IOi=#Kc~gwNH3l9rlB82vhLcN zY~6KUGtK`6t9yO#3flwM_J=nuQX%wz`RvCGV% zGGl>RTV^aV`(?%|vsAa<+^@`tgtqy2nP}VTL{79`Xsv7ko-YvI3N1GxcW)>1{#07t zA>$oD%WiWhEkBJuP*e-04mp2=t%b4*zSn51ZITWC&M0p!*@m3tdsEg_obS#Co?VC= zAl^YZRj)R&bya)5Z5HRb$<{)4^#t$%>iKpY{A5!-d{fB9uG?Y4S_%!X>CyKsBf4Qo z^}F55njXcP9^=;ZRjlb@ZcPtrtmzSrH9erL>7FZC(-ZI`61|QBy^fLTwTsp@8uV(A z>D5X)w78h9Z4bY;r-Ik^5$&}Vkqb&|n?!Uv@Y<3L8i;0>1j(O9;=f~&+e>pP!d&KX z?_L(>V&>kxX;}Xm+`BhLA z;S08kQTdW%Og`gpU575%wj|{<{t>|6#^#6eH$%S6-+J=~&ELN98*LdqXR9K+zRzTr zKaQvEw$M19Hq%-rCyhaIJZ-|-R3qYejELhgqRxjAbv}%!^I=4t4)1ddwj`$vx;veo0(!M|@{n82Noh z(Nk(=J!O~gw>{H_3JGemPF^$5G~&n)Hy7{2_qx17A)7_j*Ct0J)bdog=MW)yCa%YHT`arU#JxJCt{b={+Q=f9{-68S_F;sElbuzdO>Qx94ce7%-&yhf)70-gzcEV_1^d08br&>k z6f5qR^}IynYQi4k*YlKmZpdf5m$!$cU7@b$Icb*K)`Y?3pkkZ(?;u=+8BFJ7xU4j_ zWPLrS5@xPbmGOcC53H@9BP0>ZVH|p#~pnp%)Yum3@L@9XagYa;Tkmt03|pBl;8|dBA)?Vh~KM1+y&{t zE+vMKojr$RFlsiyW{nt3Th%1Rx1I&xx|#FaXK47=XL7#v84>u_^Ay;N0DB1syGR4} zLJszV2w*Q$V6O*k2M4=M1NK@D_UZ^=S1GV}0Cpn>+o=KjX%6=G2w?A2VDAO&b`G{% z1NI&c_U;H^A5dT)1MCwV?1LJxk8-e&L;(Ag0=pNmMb7_yS_8Jk!9E`W>}bWeJ|6z< zG!C{w!?!+`^R15=*tcFaNr9aO*k%rPh6e1J9PAkpz|K=(F9Pf(9PA3nGBM zOo6=~upJ!iG7Z>kIoPWsfL*1)-T~N+9Biis?58={+arLzQ-Qq~u-iGdMj+K3w%uZr}4>L*jVb;=_vlqWD%0A3Q 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

fA^l5aJ}}4jep(?oDaaM2+Pqr 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ē*e@T41essj1iiH~ia~v|k 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 z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95{fT`g^Uij^hCSHK^2nQiKFigXXVh;%U>Utexj|-9B-k<|D=M4fObQM7bO(HKM2rsIOAaCsRZ0EuACltIM zc=P@~KhO93I`AbxfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs 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

F`vOdUiAN`W;ML-om!;+ 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

cD#09y6bHm)OhXF!AzlvS+K; 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 zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu zFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc01SWu 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 diff --git a/subsample_and_optics_example/optics/cosp_utils.F90 b/subsample_and_optics_example/optics/cosp_utils.F90 index 467b317a0b..09b9461ef8 100755 --- a/subsample_and_optics_example/optics/cosp_utils.F90 +++ b/subsample_and_optics_example/optics/cosp_utils.F90 @@ -36,56 +36,13 @@ MODULE MOD_COSP_UTILS USE MOD_COSP_CONFIG USE mod_quickbeam_optics, only: size_distribution use mod_cosp_error, only: errorMessage + use cosp_math_constants, only: pi IMPLICIT NONE CONTAINS !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% !------------------- SUBROUTINE COSP_PRECIP_MXRATIO -------------- !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -! SUBROUTINE COSP_PRECIP_MXRATIO(Npoints,Nlevels,Ncolumns,p,T,prec_frac,prec_type, & -! n_ax,n_bx,alpha_x,c_x,d_x,g_x,a_x,b_x,gamma1,gamma2,gamma3,gamma4, & -! flux,mxratio,reff) - -! ! Input arguments, (IN) -! integer,intent(in) :: Npoints,Nlevels,Ncolumns -! real(wp),intent(in),dimension(Npoints,Nlevels) :: p,T,flux -! real(wp),intent(in),dimension(Npoints,Ncolumns,Nlevels) :: prec_frac -! real(wp),intent(in) :: n_ax,n_bx,alpha_x,c_x,d_x,g_x,a_x,b_x,gamma1,gamma2,gamma3,gamma4,prec_type -! ! Input arguments, (OUT) -! real(wp),intent(out),dimension(Npoints,Ncolumns,Nlevels) :: mxratio -! real(wp),intent(inout),dimension(Npoints,Ncolumns,Nlevels) :: reff -! ! Local variables -! integer :: i,j,k -! real(wp) :: sigma,one_over_xip1,xi,rho0,rho,lambda_x,gamma_4_3_2,delta - -! mxratio = 0.0 - -! if (n_ax >= 0.0) then ! N_ax is used to control which hydrometeors need to be computed -! xi = d_x/(alpha_x + b_x - n_bx + 1._wp) -! rho0 = 1.29_wp -! sigma = (gamma2/(gamma1*c_x))*(n_ax*a_x*gamma2)**xi -! one_over_xip1 = 1._wp/(xi + 1._wp) -! gamma_4_3_2 = 0.5_wp*gamma4/gamma3 -! delta = (alpha_x + b_x + d_x - n_bx + 1._wp) -! do k=1,Nlevels -! do j=1,Ncolumns -! do i=1,Npoints -! if ((prec_frac(i,j,k)==prec_type).or.(prec_frac(i,j,k)==3.)) then -! rho = p(i,k)/(287.05_wp*T(i,k)) -! mxratio(i,j,k)=(flux(i,k)*((rho/rho0)**g_x)*sigma)**one_over_xip1 -! mxratio(i,j,k)=mxratio(i,j,k)/rho -! ! Compute effective radius -! if ((reff(i,j,k) <= 0._wp).and.(flux(i,k) /= 0._wp)) then -! lambda_x = (a_x*c_x*((rho0/rho)**g_x)*n_ax*gamma1/flux(i,k))**(1._wp/delta) -! reff(i,j,k) = gamma_4_3_2/lambda_x -! endif -! endif -! enddo -! enddo -! enddo -! endif -! END SUBROUTINE COSP_PRECIP_MXRATIO - SUBROUTINE COSP_PRECIP_MXRATIO(Npoints,Nlevels,Ncolumns, & p,T,prec_frac,prec_type, index, sd, & flux, mxratio, reff) @@ -99,7 +56,6 @@ SUBROUTINE COSP_PRECIP_MXRATIO(Npoints,Nlevels,Ncolumns, & real(wp),intent(out),dimension(Npoints,Ncolumns,Nlevels) :: mxratio real(wp),intent(inout),dimension(Npoints,Ncolumns,Nlevels) :: reff ! Local variables - real(wp) :: pi = 3.14159265358979323846264338327950288419717_wp integer :: i,j,k real(wp) :: sigma,one_over_xip1,xi,rho0,rho,lambda_x,gamma_4_3_2,delta real(wp) :: apm,bpm,mu,D0,Dm ! modified gamma DSD